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

View File

@ -1,7 +1,9 @@
package com.jessebrault.ssg
import com.jessebrault.ssg.task.TaskContainer
import com.jessebrault.ssg.task.TaskTypeContainer
interface StaticSiteGenerator {
TaskTypeContainer getTaskTypes()
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.SiteSpec
import com.jessebrault.ssg.part.Part
import com.jessebrault.ssg.task.Task
import com.jessebrault.ssg.task.TaskContainer
import com.jessebrault.ssg.task.TaskTypeContainer
import com.jessebrault.ssg.text.Text
import groovy.transform.EqualsAndHashCode
import groovy.transform.NullCheck
@ -22,5 +22,5 @@ final class RenderContext {
final String sourcePath
final String targetPath
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()
)
@ -32,7 +32,7 @@ final class SpecialPageToHtmlFileTask extends AbstractTask<SpecialPageToHtmlFile
final HtmlFileOutput output
SpecialPageToHtmlFileTask(String name, SpecialPage input, HtmlFileOutput output) {
super(type, name)
super(TYPE, name)
this.input = input
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 exit = MarkerFactory.getMarker('EXIT')
@Override
TaskType<SpecialPageToHtmlFileTask> getTaskType() {
SpecialPageToHtmlFileTask.TYPE
}
@Override
Result<TaskCollection<SpecialPageToHtmlFileTask>> getTasks(Build build) {
logger.trace(enter, 'build: {}', build)

View File

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

View File

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

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()
)
@ -32,7 +32,7 @@ final class TextToHtmlFileTask extends AbstractTask<TextToHtmlFileTask> {
final HtmlFileOutput output
TextToHtmlFileTask(String name, Text input, HtmlFileOutput output) {
super(type, name)
super(TYPE, name)
this.input = input
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 exit = MarkerFactory.getMarker('EXIT')
@Override
TaskType<TextToHtmlFileTask> getTaskType() {
TextToHtmlFileTask.TYPE
}
@Override
Result<TaskCollection<TextToHtmlFileTask>> getTasks(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.task.Task
import com.jessebrault.ssg.task.TaskContainer
import com.jessebrault.ssg.task.TaskTypeContainer
class RenderContextUtil {
@ -18,7 +19,7 @@ class RenderContextUtil {
args?.sourcePath as String ?: '',
args?.targetPath as String ?: '',
args?.tasks as TaskContainer ?: new TaskContainer(),
args?.taskTypes as Set<Class<? extends Task>> ?: [] as Set<Class<? extends Task>>
args?.taskTypes as TaskTypeContainer ?: new TaskTypeContainer()
)
}