package org.wildfly.swarm.swagger.webapp.runtime; import java.io.IOException; import java.net.URL; import java.util.Map; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Any; import javax.enterprise.inject.Produces; import javax.inject.Inject; import org.jboss.modules.Module; import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoadException; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.importer.ZipImporter; import org.wildfly.swarm.spi.api.JARArchive; import org.wildfly.swarm.swagger.webapp.SwaggerWebAppFraction; import org.wildfly.swarm.undertow.WARArchive; /** * @author Bob McWhirter */ @ApplicationScoped public class SwaggerWebAppDeploymentProducer { private static final Pattern PATTERN = Pattern.compile("/META-INF/resources/webjars/swagger-ui/([^\\/]+/)(.*)"); @Inject @Any private SwaggerWebAppFraction fraction; @Produces public Archive swaggerWebApp() throws ModuleLoadException, IOException { // Load the swagger-ui webjars. Module module = Module.getBootModuleLoader().loadModule(ModuleIdentifier.create("org.webjars.swagger-ui")); URL resource = module.getExportedResource("swagger-ui.jar"); JARArchive webJar = ShrinkWrap.create(JARArchive.class); webJar.as(ZipImporter.class).importFrom(resource.openStream()); JARArchive relocatedJar = ShrinkWrap.create(JARArchive.class); Map<ArchivePath, Node> content = webJar.getContent(); // relocate out the webjars/swagger-ui/${VERISON} for (ArchivePath path : content.keySet()) { Node node = content.get(path); Asset asset = node.getAsset(); if (asset != null) { Matcher matcher = PATTERN.matcher(path.get()); if (matcher.matches()) { MatchResult result = matcher.toMatchResult(); String newPath = "/META-INF/resources/" + result.group(2); relocatedJar.add(asset, newPath); } } } WARArchive war = ShrinkWrap.create(WARArchive.class, "swagger-ui.war") .addAsLibrary(relocatedJar) .setContextRoot(this.fraction.getContext()); // If any user content has been provided, merge that with the swagger-ui bits Archive<?> userContent = this.fraction.getWebContent(); if (userContent != null) { war.merge(userContent); } return war; } }