Fixed null pointer bug with taskTypes.

This commit is contained in:
JesseBrault0709 2023-02-21 18:41:33 +01:00
parent acd59b4e3d
commit ee98482e7e
11 changed files with 49 additions and 33 deletions

View File

@ -92,7 +92,7 @@ abstract class AbstractBuildCommand extends AbstractSubCommand {
def context = new TaskExecutorContext( def context = new TaskExecutorContext(
it, it,
tasks, tasks,
null, this.ssg.taskTypes,
{ Collection<Diagnostic> diagnostics -> { Collection<Diagnostic> diagnostics ->
executionDiagnostics.addAll(diagnostics) executionDiagnostics.addAll(diagnostics)
} }

View File

@ -2,6 +2,7 @@ package com.jessebrault.ssg
import com.jessebrault.ssg.task.SpecialPageToHtmlFileTaskFactory import com.jessebrault.ssg.task.SpecialPageToHtmlFileTaskFactory
import com.jessebrault.ssg.task.TaskContainer import com.jessebrault.ssg.task.TaskContainer
import com.jessebrault.ssg.task.TaskTypeContainer
import com.jessebrault.ssg.task.TextToHtmlFileTaskFactory import com.jessebrault.ssg.task.TextToHtmlFileTaskFactory
import groovy.transform.NullCheck import groovy.transform.NullCheck
import org.slf4j.Logger import org.slf4j.Logger
@ -16,6 +17,14 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
private static final Marker enter = MarkerFactory.getMarker('ENTER') private static final Marker enter = MarkerFactory.getMarker('ENTER')
private static final Marker exit = MarkerFactory.getMarker('EXIT') private static final Marker exit = MarkerFactory.getMarker('EXIT')
private static final TextToHtmlFileTaskFactory textHtmlFactory = new TextToHtmlFileTaskFactory()
private static final SpecialPageToHtmlFileTaskFactory specialPageHtmlFactory = new SpecialPageToHtmlFileTaskFactory()
@Override
TaskTypeContainer getTaskTypes() {
new TaskTypeContainer([textHtmlFactory.taskType, specialPageHtmlFactory.taskType])
}
@Override @Override
Result<TaskContainer> generate(Build build) { Result<TaskContainer> generate(Build build) {
logger.trace(enter, 'build: {}', build) logger.trace(enter, 'build: {}', build)
@ -24,13 +33,11 @@ class SimpleStaticSiteGenerator implements StaticSiteGenerator {
def tasks = new TaskContainer() def tasks = new TaskContainer()
def diagnostics = [] def diagnostics = []
def textToHtmlFactory = new TextToHtmlFileTaskFactory() def textsResult = textHtmlFactory.getTasks(build)
def textsResult = textToHtmlFactory.getTasks(build)
tasks.addAll(textsResult.get()) tasks.addAll(textsResult.get())
diagnostics.addAll(textsResult.diagnostics) diagnostics.addAll(textsResult.diagnostics)
def specialPageToHtmlFactory = new SpecialPageToHtmlFileTaskFactory() def specialPagesResult = specialPageHtmlFactory.getTasks(build)
def specialPagesResult = specialPageToHtmlFactory.getTasks(build)
tasks.addAll(specialPagesResult.get()) tasks.addAll(specialPagesResult.get())
diagnostics.addAll(specialPagesResult.diagnostics) diagnostics.addAll(specialPagesResult.diagnostics)

View File

@ -1,7 +1,9 @@
package com.jessebrault.ssg package com.jessebrault.ssg
import com.jessebrault.ssg.task.TaskContainer import com.jessebrault.ssg.task.TaskContainer
import com.jessebrault.ssg.task.TaskTypeContainer
interface StaticSiteGenerator { interface StaticSiteGenerator {
TaskTypeContainer getTaskTypes()
Result<TaskContainer> generate(Build build) Result<TaskContainer> generate(Build build)
} }

View File

@ -3,8 +3,8 @@ package com.jessebrault.ssg.renderer
import com.jessebrault.ssg.Config import com.jessebrault.ssg.Config
import com.jessebrault.ssg.SiteSpec import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.part.Part import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.task.Task
import com.jessebrault.ssg.task.TaskContainer import com.jessebrault.ssg.task.TaskContainer
import com.jessebrault.ssg.task.TaskTypeContainer
import com.jessebrault.ssg.text.Text import com.jessebrault.ssg.text.Text
import groovy.transform.EqualsAndHashCode import groovy.transform.EqualsAndHashCode
import groovy.transform.NullCheck import groovy.transform.NullCheck
@ -22,5 +22,5 @@ final class RenderContext {
final String sourcePath final String sourcePath
final String targetPath final String targetPath
final TaskContainer tasks final TaskContainer tasks
final Set<Class<? extends Task>> taskTypes final TaskTypeContainer taskTypes
} }

View File

@ -24,7 +24,7 @@ final class SpecialPageToHtmlFileTask extends AbstractTask<SpecialPageToHtmlFile
} }
private static final TaskType<SpecialPageToHtmlFileTask> type = new TaskType<>( static final TaskType<SpecialPageToHtmlFileTask> TYPE = new TaskType<>(
'specialPageToHtmlFile', new SpecialPageToHtmlFileTaskExecutor() 'specialPageToHtmlFile', new SpecialPageToHtmlFileTaskExecutor()
) )
@ -32,7 +32,7 @@ final class SpecialPageToHtmlFileTask extends AbstractTask<SpecialPageToHtmlFile
final HtmlFileOutput output final HtmlFileOutput output
SpecialPageToHtmlFileTask(String name, SpecialPage input, HtmlFileOutput output) { SpecialPageToHtmlFileTask(String name, SpecialPage input, HtmlFileOutput output) {
super(type, name) super(TYPE, name)
this.input = input this.input = input
this.output = output this.output = output
} }

View File

@ -15,6 +15,11 @@ final class SpecialPageToHtmlFileTaskFactory implements TaskFactory<SpecialPageT
private static final Marker enter = MarkerFactory.getMarker('ENTER') private static final Marker enter = MarkerFactory.getMarker('ENTER')
private static final Marker exit = MarkerFactory.getMarker('EXIT') private static final Marker exit = MarkerFactory.getMarker('EXIT')
@Override
TaskType<SpecialPageToHtmlFileTask> getTaskType() {
SpecialPageToHtmlFileTask.TYPE
}
@Override @Override
Result<TaskCollection<SpecialPageToHtmlFileTask>> getTasks(Build build) { Result<TaskCollection<SpecialPageToHtmlFileTask>> getTasks(Build build) {
logger.trace(enter, 'build: {}', build) logger.trace(enter, 'build: {}', build)

View File

@ -4,5 +4,6 @@ import com.jessebrault.ssg.Build
import com.jessebrault.ssg.Result import com.jessebrault.ssg.Result
interface TaskFactory<T extends Task> { interface TaskFactory<T extends Task> {
TaskType<T> getTaskType()
Result<TaskCollection<T>> getTasks(Build build) Result<TaskCollection<T>> getTasks(Build build)
} }

View File

@ -1,36 +1,31 @@
package com.jessebrault.ssg.task package com.jessebrault.ssg.task
import java.util.regex.Pattern
final class TaskTypeContainer { final class TaskTypeContainer {
private static final Pattern taskTypeNamePattern = ~/(.*)Task/
@Delegate @Delegate
private final Set<Class<? extends Task>> taskTypes = [] private final Set<TaskType<? extends Task>> taskTypes = []
TaskTypeContainer(Collection<Class<? extends Task>> taskTypes = null) { TaskTypeContainer(Collection<TaskType<? extends Task>> taskTypes) {
if (taskTypes) { if (taskTypes != null) {
this.taskTypes.addAll(taskTypes) this.taskTypes.addAll(taskTypes)
} }
} }
TaskTypeContainer(TaskTypeContainer taskTypeContainer) {
if (taskTypeContainer != null) {
this.taskTypes.addAll(taskTypeContainer)
}
}
TaskTypeContainer() {}
@Override @Override
Class<? extends Task> getProperty(String propertyName) { TaskType<? extends Task> getProperty(String propertyName) {
def result = this.taskTypes.find { def taskType = this.taskTypes.find { it.name == propertyName }
def m = taskTypeNamePattern.matcher(it.simpleName) if (!taskType) {
if (m.matches()) { throw new IllegalArgumentException("no such taskType: ${ propertyName }")
def withoutTaskEnd = m.group(1)
def uncapitalized = withoutTaskEnd.uncapitalize()
return propertyName == uncapitalized
} else {
throw new IllegalStateException("invalid task type name: ${ it.simpleName }")
}
} }
if (!result) { taskType
throw new IllegalStateException("no such taskType: ${ propertyName }")
}
result
} }
} }

View File

@ -24,7 +24,7 @@ final class TextToHtmlFileTask extends AbstractTask<TextToHtmlFileTask> {
} }
private static final TaskType<TextToHtmlFileTask> type = new TaskType<>( static final TaskType<TextToHtmlFileTask> TYPE = new TaskType<>(
'textToHtmlFile', new TextToHtmlFileTaskExecutor() 'textToHtmlFile', new TextToHtmlFileTaskExecutor()
) )
@ -32,7 +32,7 @@ final class TextToHtmlFileTask extends AbstractTask<TextToHtmlFileTask> {
final HtmlFileOutput output final HtmlFileOutput output
TextToHtmlFileTask(String name, Text input, HtmlFileOutput output) { TextToHtmlFileTask(String name, Text input, HtmlFileOutput output) {
super(type, name) super(TYPE, name)
this.input = input this.input = input
this.output = output this.output = output
} }

View File

@ -17,6 +17,11 @@ final class TextToHtmlFileTaskFactory implements TaskFactory<TextToHtmlFileTask>
private static final Marker enter = MarkerFactory.getMarker('ENTER') private static final Marker enter = MarkerFactory.getMarker('ENTER')
private static final Marker exit = MarkerFactory.getMarker('EXIT') private static final Marker exit = MarkerFactory.getMarker('EXIT')
@Override
TaskType<TextToHtmlFileTask> getTaskType() {
TextToHtmlFileTask.TYPE
}
@Override @Override
Result<TaskCollection<TextToHtmlFileTask>> getTasks(Build build) { Result<TaskCollection<TextToHtmlFileTask>> getTasks(Build build) {
logger.trace(enter, 'build: {}', build) logger.trace(enter, 'build: {}', build)

View File

@ -5,6 +5,7 @@ import com.jessebrault.ssg.SiteSpec
import com.jessebrault.ssg.renderer.RenderContext import com.jessebrault.ssg.renderer.RenderContext
import com.jessebrault.ssg.task.Task import com.jessebrault.ssg.task.Task
import com.jessebrault.ssg.task.TaskContainer import com.jessebrault.ssg.task.TaskContainer
import com.jessebrault.ssg.task.TaskTypeContainer
class RenderContextUtil { class RenderContextUtil {
@ -18,7 +19,7 @@ class RenderContextUtil {
args?.sourcePath as String ?: '', args?.sourcePath as String ?: '',
args?.targetPath as String ?: '', args?.targetPath as String ?: '',
args?.tasks as TaskContainer ?: new TaskContainer(), args?.tasks as TaskContainer ?: new TaskContainer(),
args?.taskTypes as Set<Class<? extends Task>> ?: [] as Set<Class<? extends Task>> args?.taskTypes as TaskTypeContainer ?: new TaskTypeContainer()
) )
} }