All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.rmannibucau.dita.maven.DitaHttpMojo Maven / Gradle / Ivy

The newest version!
package com.github.rmannibucau.dita.maven;

import java.io.File;
import java.util.Scanner;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.meecrowave.Meecrowave;

@Mojo(name = "http")
public class DitaHttpMojo extends DitaRenderMojo {

    @Parameter(property = "dita.port", defaultValue = "8080")
    private int port;

    @Override
    public void execute() {
        outputDir.mkdirs(); // ensure it exists before starting the server

        final AtomicBoolean running = new AtomicBoolean(true);
        final Semaphore renderSemaphore = new Semaphore(1);
        final Thread renderingThread = new Thread(() -> {
            while (running.get()) {
                try {
                    renderSemaphore.acquire();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
                if (running.get()) {
                    try {
                        super.execute();
                    } catch (MojoExecutionException | MojoFailureException e) {
                        getLog().error(e.getMessage(), e);
                    }
                }
            }
        });
        renderingThread.setName("dita-rendering-thread");
        renderingThread.start();

        final Meecrowave.Builder builder = new Meecrowave.Builder();
        builder.setUseLog4j2JulLogManager(false);
        builder.setLoggingGlobalSetup(false);
        builder.setUseShutdownHook(false);
        builder.setWebResourceCached(false);
        builder.setHttpPort(port);
        builder.setTempDir(new File(ditaTempDir, "http-server").getAbsolutePath());
        try (final Meecrowave meecrowave = new Meecrowave(builder)) {
            meecrowave.start();
            meecrowave.deployClasspath(new Meecrowave.DeploymentMeta("", outputDir, ctx -> {}));

            final Scanner scanner = new Scanner(System.in);
            String command;
            while ((command = scanner.next()) != null) {
                if ("quit".equalsIgnoreCase(command) || "exit".equalsIgnoreCase(command)) {
                    break;
                }
                if ("reload".equalsIgnoreCase(command) || "r".equalsIgnoreCase(command)) {
                    renderSemaphore.release();
                }
            }
        } finally {
            running.set(false);
            renderSemaphore.release();
            try {
                renderingThread.join(TimeUnit.MINUTES.toMillis(1));
            } catch (final InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy