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

org.allurefw.report.Main Maven / Gradle / Ivy

package org.allurefw.report;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.allurefw.report.entity.Statistic;
import org.allurefw.report.plugins.DefaultPluginLoader;
import org.allurefw.report.plugins.EmptyPluginsLoader;
import org.allurefw.report.utils.CopyVisitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author charlie (Dmitry Baev).
 */
public class Main {

    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);

    private final PluginsLoader pluginsLoader;

    private final Set enabledPlugins;

    public Main() {
        this(new EmptyPluginsLoader(), Collections.emptySet());
    }

    public Main(Path pluginsDirectory, Set enabledPlugins) {
        this(new DefaultPluginLoader(pluginsDirectory), enabledPlugins);
    }

    public Main(PluginsLoader pluginsLoader, Set enabledPlugins) {
        this.pluginsLoader = pluginsLoader;
        this.enabledPlugins = enabledPlugins;
    }

    public List loadPlugins() {
        return pluginsLoader.loadPlugins(enabledPlugins);
    }

    public ReportInfo createReport(Path... sources) {
        List plugins = pluginsLoader.loadPlugins(enabledPlugins);
        ReportFactory factory = createInjector(plugins)
                .getInstance(ReportFactory.class);
        return factory.create(sources);
    }

    public void generate(Path output, Path... sources) {
        List plugins = pluginsLoader.loadPlugins(enabledPlugins);
        LOGGER.debug("Found {} plugins", plugins.size());
        plugins.forEach(plugin ->
                LOGGER.debug("<{}>, enabled: {}", plugin.getDescriptor().getName(), plugin.isEnabled())
        );
        Injector injector = createInjector(plugins);
        ProcessStage stage = injector.getInstance(ProcessStage.class);
        Statistic run = stage.run(output, sources);
        LOGGER.debug("## Summary");
        LOGGER.debug("Found {} test cases ({} failed, {} broken)", run.getTotal(), run.getFailed(), run.getBroken());
        LOGGER.debug("Success percentage: {}", getSuccessPercentage(run));
        LOGGER.debug("Creating index.html...");
        Set pluginsWithStatic = unpackStatic(plugins, output);
        writeIndexHtml(pluginsWithStatic, output);
    }

    private String getSuccessPercentage(Statistic run) {
        return run.getTotal() == 0 ? "Unknown" : String.valueOf(run.getPassed() * 100 / run.getTotal());
    }

    private static Injector createInjector(List plugins) {
        List enabledPluginsModules = plugins.stream()
                .filter(Plugin::isEnabled)
                .map(Plugin::getModule)
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toList());
        return Guice.createInjector(new ParentModule(plugins, enabledPluginsModules));
    }

    private static void writeIndexHtml(Set pluginsWithStatic, Path outputDirectory) {
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
        cfg.setLocalizedLookup(false);
        cfg.setTemplateUpdateDelayMilliseconds(0);
        cfg.setClassLoaderForTemplateLoading(Main.class.getClassLoader(), "tpl");
        Path indexHtml = outputDirectory.resolve("index.html");
        try (BufferedWriter writer = Files.newBufferedWriter(indexHtml, StandardOpenOption.CREATE)) {
            Template template = cfg.getTemplate("index.html.ftl");
            Map dataModel = new HashMap<>();
            dataModel.put("plugins", pluginsWithStatic);
            template.process(dataModel, writer);
        } catch (IOException | TemplateException e) {
            LOGGER.error("Could't read index file", e);
        }
    }

    private static Set unpackStatic(List plugins, Path outputDirectory) {
        Path pluginsDirectory = outputDirectory.resolve("plugins");
        return plugins.stream()
                .filter(Plugin::isEnabled)
                .map(plugin -> unpackStatic(plugin, pluginsDirectory))
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(Collectors.toSet());
    }

    public static Optional unpackStatic(Plugin plugin, Path outputDirectory) {
        String name = plugin.getDescriptor().getName();
        Path pluginOutputDirectory = outputDirectory.resolve(name);
        unpack(plugin, pluginOutputDirectory);
        return Files.exists(pluginOutputDirectory.resolve("index.js"))
                ? Optional.of(name)
                : Optional.empty();
    }

    private static void unpack(Plugin plugin, Path outputDirectory) {
        Path pluginStatic = plugin.getPluginDirectory().resolve("static");
        if (Files.notExists(pluginStatic)) {
            return;
        }
        try {
            Files.createDirectories(outputDirectory);
            Files.walkFileTree(pluginStatic, new CopyVisitor(pluginStatic, outputDirectory));
        } catch (IOException e) {
            LOGGER.error("Could not copy plugin static {} {}", plugin.getDescriptor().getName(), e);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy