diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy new file mode 100644 index 0000000000..1d111eea7b --- /dev/null +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy @@ -0,0 +1,11 @@ +package io.codearte.accurest.wiremock + +import groovy.transform.CompileStatic + +@CompileStatic +class ConversionAccurestException extends RuntimeException { + + ConversionAccurestException(String message, Throwable cause) { + super(message, cause) + } +} diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy index bfd46e5d3d..1d28f2b9ee 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockClientConverter.groovy @@ -1,7 +1,9 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic import io.coderate.accurest.dsl.WiremockStubStrategy +@CompileStatic class DslToWiremockClientConverter extends DslToWiremockConverter { @Override diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy index 82d81a924f..3f2b81c14b 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockConverter.groovy @@ -1,7 +1,9 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic import io.coderate.accurest.dsl.GroovyDsl +@CompileStatic abstract class DslToWiremockConverter implements SingleFileConverter { @Override @@ -10,7 +12,7 @@ abstract class DslToWiremockConverter implements SingleFileConverter { } @Override - String getOutputFileNameForInputFileName(String inputFileName) { + String generateOutputFileNameForInput(String inputFileName) { return inputFileName.replaceAll('.groovy', '.json') } diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy index d0e13e7526..caf3b3a199 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/DslToWiremockServerConverter.groovy @@ -1,7 +1,9 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic import io.coderate.accurest.dsl.WiremockStubStrategy +@CompileStatic class DslToWiremockServerConverter extends DslToWiremockConverter { @Override diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy index 6273b54849..ca79645cc8 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy @@ -1,6 +1,7 @@ package io.codearte.accurest.wiremock import groovy.io.FileType +import groovy.transform.CompileStatic import groovy.util.logging.Slf4j import java.nio.file.Files @@ -8,33 +9,45 @@ import java.nio.file.Path import java.nio.file.Paths @Slf4j +@CompileStatic class RecursiveFilesConverter { private final SingleFileConverter singleFileConverter + private final File sourceRootDirectory + private final File targetRootDirectory - RecursiveFilesConverter(SingleFileConverter singleFileConverter) { + RecursiveFilesConverter(SingleFileConverter singleFileConverter, File sourceRootDirectory, File targetRootDirectory) { this.singleFileConverter = singleFileConverter + this.sourceRootDirectory = sourceRootDirectory + this.targetRootDirectory = targetRootDirectory } - void processDirectory(File sourceRootDirectory, File targetRootDirectory) { + void processFiles() { sourceRootDirectory.eachFileRecurse(FileType.FILES) { File sourceFile -> try { if (!singleFileConverter.canHandleFileName(sourceFile.name)) { return } - String convertedContent = singleFileConverter.convertContent(sourceFile.text) - - Path relativePath = Paths.get(sourceRootDirectory.toURI()).relativize(sourceFile.parentFile.toPath()) - Path absoluteTargetPath = targetRootDirectory.toPath().resolve(relativePath) - Files.createDirectories(absoluteTargetPath) - - File newGroovyFile = new File(absoluteTargetPath.toFile(), singleFileConverter.getOutputFileNameForInputFileName(sourceFile.name)) - log.info("Creating new json [$newGroovyFile.path]") + Path absoluteTargetPath = createAndReturnTargetDirectory(sourceFile) + File newGroovyFile = createTargetFileWithProperName(absoluteTargetPath, sourceFile) newGroovyFile.text = convertedContent } catch (Exception e) { - throw e + throw new ConversionAccurestException("Unable to convertion of ${sourceFile.name}", e) } } } + + private Path createAndReturnTargetDirectory(File sourceFile) { + Path relativePath = Paths.get(sourceRootDirectory.toURI()).relativize(sourceFile.parentFile.toPath()) + Path absoluteTargetPath = targetRootDirectory.toPath().resolve(relativePath) + Files.createDirectories(absoluteTargetPath) + absoluteTargetPath + } + + private File createTargetFileWithProperName(Path absoluteTargetPath, File sourceFile) { + File newGroovyFile = new File(absoluteTargetPath.toFile(), singleFileConverter.generateOutputFileNameForInput(sourceFile.name)) + log.info("Creating new json [$newGroovyFile.path]") + newGroovyFile + } } diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy index 216b573be0..4b76be8357 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/SingleFileConverter.groovy @@ -1,10 +1,13 @@ package io.codearte.accurest.wiremock +import groovy.transform.CompileStatic + +@CompileStatic interface SingleFileConverter { boolean canHandleFileName(String fileName) String convertContent(String content) - String getOutputFileNameForInputFileName(String inputFileName) + String generateOutputFileNameForInput(String inputFileName) } \ No newline at end of file diff --git a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy index ca3dd46ce0..5972e00122 100644 --- a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy +++ b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy @@ -18,18 +18,18 @@ class RecursiveFilesConverterSpec extends Specification { def "should recursively convert all matching files"() { given: - def singleFileConverterStub = Stub(SingleFileConverter) - singleFileConverterStub.canHandleFileName(_) >> { String fileName -> fileName.endsWith(".groovy") } - singleFileConverterStub.convertContent(_) >> { "converted" } - singleFileConverterStub.getOutputFileNameForInputFileName(_) >> { String inputFileName -> inputFileName.replaceAll('.groovy', '.json') } - RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub) - and: File originalSourceRootDirectory = new File(this.getClass().getResource("/converter/source").toURI()) File sourceRootDirectory = tmpFolder.newFolder("source") File targetRootDirectory = tmpFolder.newFolder("target") FileUtils.copyDirectory(originalSourceRootDirectory, sourceRootDirectory) + and: + def singleFileConverterStub = Stub(SingleFileConverter) + singleFileConverterStub.canHandleFileName(_) >> { String fileName -> fileName.endsWith(".groovy") } + singleFileConverterStub.convertContent(_) >> { "converted" } + singleFileConverterStub.generateOutputFileNameForInput(_) >> { String inputFileName -> inputFileName.replaceAll('.groovy', '.json') } + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, sourceRootDirectory, targetRootDirectory) when: - recursiveFilesConverter.processDirectory(sourceRootDirectory, targetRootDirectory) + recursiveFilesConverter.processFiles() then: Collection createdFiles = FileUtils.listFiles(targetRootDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE) Set relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, targetRootDirectory) @@ -38,6 +38,23 @@ class RecursiveFilesConverterSpec extends Specification { createdFiles.each { it.text == "converted" } } + def "on failure should break processing and throw meaningful exception"() { + given: + def sourceFile = tmpFolder.newFile() + and: + def singleFileConverterStub = Stub(SingleFileConverter) + singleFileConverterStub.canHandleFileName(_) >> { true } + singleFileConverterStub.convertContent(_) >> { throw new NullPointerException("Test conversion error") } + singleFileConverterStub.generateOutputFileNameForInput(_) >> { String inputFileName -> "${inputFileName}2" } + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, tmpFolder.root, tmpFolder.root) + when: + recursiveFilesConverter.processFiles() + then: + def e = thrown(ConversionAccurestException) + e.message?.contains(sourceFile.name) + e.cause?.message == "Test conversion error" + } + private static Set getRelativePathsForFilesInDirectory(Collection createdFiles, File targetRootDirectory) { Path rootSourcePath = Paths.get(targetRootDirectory.toURI()) Set relativizedCreatedFiles = createdFiles.collect { File file ->