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

io.quarkus.vertx.http.deployment.webjar.WebJarProcessor Maven / Gradle / Ivy

package io.quarkus.vertx.http.deployment.webjar;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.quarkus.deployment.IsNormal;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.GeneratedResourceBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem;
import io.quarkus.maven.dependency.GACT;
import io.quarkus.maven.dependency.ResolvedDependency;
import io.quarkus.runtime.ApplicationConfig;
import io.quarkus.vertx.http.runtime.devmode.FileSystemStaticHandler;
import io.quarkus.vertx.http.runtime.webjar.WebJarRecorder;

public class WebJarProcessor {
    @Record(ExecutionTime.RUNTIME_INIT)
    @BuildStep(onlyIfNot = IsNormal.class)
    WebJarResultsBuildItem processWebJarDevMode(WebJarRecorder recorder, List webJars,
            CurateOutcomeBuildItem curateOutcomeBuildItem,
            ShutdownContextBuildItem shutdownContext,
            ApplicationConfig applicationConfig) throws IOException {

        Map results = new HashMap<>();

        Path deploymentBasePath = Files.createTempDirectory("quarkus-webjar");
        recorder.shutdownTask(shutdownContext, deploymentBasePath.toString());

        for (WebJarBuildItem webJar : webJars) {
            Path resourcesDirectory = deploymentBasePath
                    .resolve(buildFinalDestination(webJar.getArtifactKey(), webJar.getRoot()));
            ResolvedDependency dependency = WebJarUtil.getAppArtifact(curateOutcomeBuildItem, webJar.getArtifactKey());

            Path staticResourcesPath = WebJarUtil.copyResourcesForDevOrTest(curateOutcomeBuildItem, applicationConfig, webJar,
                    dependency, resourcesDirectory);

            List webRootConfigurations = new ArrayList<>();
            webRootConfigurations.add(
                    new FileSystemStaticHandler.StaticWebRootConfiguration(staticResourcesPath.toAbsolutePath().toString(),
                            ""));
            for (Path resolvedPath : dependency.getResolvedPaths()) {
                webRootConfigurations
                        .add(new FileSystemStaticHandler.StaticWebRootConfiguration(resolvedPath.toString(),
                                webJar.getRoot()));
            }

            results.put(webJar.getArtifactKey(),
                    new WebJarResultsBuildItem.WebJarResult(dependency, staticResourcesPath.toAbsolutePath().toString(),
                            webRootConfigurations));
        }

        return new WebJarResultsBuildItem(results);
    }

    @BuildStep(onlyIf = IsNormal.class)
    WebJarResultsBuildItem processWebJarProdMode(List webJars,
            CurateOutcomeBuildItem curateOutcomeBuildItem,
            BuildProducer generatedResources,
            BuildProducer nativeImageResourceBuildItemBuildProducer,
            ApplicationConfig applicationConfig) {

        Map results = new HashMap<>();

        for (WebJarBuildItem webJar : webJars) {

            ResolvedDependency dependency = WebJarUtil.getAppArtifact(curateOutcomeBuildItem, webJar.getArtifactKey());

            Map files = WebJarUtil.copyResourcesForProduction(
                    curateOutcomeBuildItem, applicationConfig, webJar, dependency);

            String finalDestination = buildFinalDestination(webJar.getArtifactKey(), webJar.getRoot());
            for (Map.Entry file : files.entrySet()) {
                String fileName = finalDestination + "/" + file.getKey();
                byte[] fileContent = file.getValue();

                generatedResources
                        .produce(new GeneratedResourceBuildItem(fileName, fileContent));
                nativeImageResourceBuildItemBuildProducer.produce(new NativeImageResourceBuildItem(fileName));
            }

            List webRootConfigurations = new ArrayList<>();
            webRootConfigurations.add(
                    new FileSystemStaticHandler.StaticWebRootConfiguration(finalDestination,
                            ""));

            results.put(webJar.getArtifactKey(),
                    new WebJarResultsBuildItem.WebJarResult(dependency, finalDestination, webRootConfigurations));
        }

        return new WebJarResultsBuildItem(results);
    }

    private String buildFinalDestination(GACT artifactKey, String webRoot) {
        String finalDestination = "META-INF/" + artifactKey.toString().replace(":", "_") + "/" + webRoot;

        if (finalDestination.endsWith("/")) {
            finalDestination = finalDestination.substring(0, finalDestination.length() - 1);
        }

        return finalDestination;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy