# SyntaxCheckingMojo.java

    package org.thewonderlemming.c4plantuml.mojo;

    import java.io.IOException;

    import org.apache.maven.plugin.MojoExecutionException;
    import org.apache.maven.plugin.MojoFailureException;
    import org.apache.maven.plugins.annotations.LifecyclePhase;
    import org.apache.maven.plugins.annotations.Mojo;
    import org.thewonderlemming.c4plantuml.syntaxchecker.SyntaxChecker;

    /**
     * A MOJO that parses the C4 PlantUML that are contained in the output directory and breaks the build if any syntax
     * error is detected.
     *
     * @author thewonderlemming
     *
     */
    @Mojo(name = "check-syntax", defaultPhase = LifecyclePhase.COMPILE)
    public class SyntaxCheckingMojo extends AbstractParentMojo {

        private MojoReporter reporter;

        /**
         * Processes the output directory to find syntax errors in the C4 files, and breaks the file if any error was found.
         * <p>
         * {@inheritDoc}
         */
        @Override
        protected void doExecute() throws MojoExecutionException, MojoFailureException {

            setReporter();

            processOutputDirectory();
            reportsAndBreakBuildIfNecessary();
        }

        private void processOutputDirectory() throws MojoFailureException {

            assert (getOutputDirectory() != null) : "Expected outputDirectory to be set!";

            try {

                final SyntaxChecker syntaxChecker = new SyntaxChecker(this.reporter);
                processOutputDirectoryFiles(path -> syntaxChecker.check(path, getCurrentCharset()));

            } catch (final IOException e) {

                final String errMsg = "Cannot process output directory: \"" + getOutputDirectory() + "\" for linting";
                throw new MojoFailureException(errMsg);
            }
        }

        private void reportsAndBreakBuildIfNecessary() throws MojoFailureException {

            assert (this.reporter != null) : "Expected reporter to be set";

            if (this.reporter.containsReports()) {

                this.reporter
                    .getReports()
                        .forEach(report -> getLog().error(report));

                throw new MojoFailureException(
                    "The build contains syntax errors. Please fix them then restart the build.");
            }
        }

        private void setReporter() {
            this.reporter = new MojoReporter();
        }
    }