Search in sources :

Example 1 with GlobalArchiveStreamHandler

use of cloud.piranha.resource.shrinkwrap.GlobalArchiveStreamHandler in project piranha by piranhacloud.

the class MicroInnerDeployer method start.

/**
 * Start the application.
 *
 * @param applicationArchive the application archive.
 * @param classLoader the classloader.
 * @param handlers the handlers.
 * @param config the configuration.
 * @return the map.
 */
public Map<String, Object> start(Archive<?> applicationArchive, ClassLoader classLoader, Map<String, Function<URL, URLConnection>> handlers, Map<String, Object> config) {
    try {
        WebApplication webApplication = getWebApplication(applicationArchive, classLoader);
        LOGGER.log(INFO, "Starting web application " + applicationArchive.getName() + " on Piranha Micro " + webApplication.getAttribute(MICRO_PIRANHA));
        // The global archive stream handler is set to resolve "shrinkwrap://" URLs (created from strings).
        // Such URLs come into being primarily when code takes resolves a class or resource from the class loader by URL
        // and then takes the string form of the URL representing the class or resource.
        GlobalArchiveStreamHandler streamHandler = new GlobalArchiveStreamHandler(webApplication);
        // Life map to the StaticURLStreamHandlerFactory used by the root class loader
        handlers.put("shrinkwrap", streamHandler::connect);
        // Source of annotations
        Index index = getIndex();
        // Target of annotations
        AnnotationManager annotationManager = new InternalAnnotationScanAnnotationManager();
        webApplication.getManager().setAnnotationManager(annotationManager);
        // Copy annotations from our "annotations" collection from source index to target manager
        forEachWebAnnotation(webAnnotation -> addAnnotationToIndex(index, webAnnotation, annotationManager));
        // Collect sub-classes/interfaces of our "instances" collection from source index to target manager
        forEachInstance(instanceClass -> addInstanceToIndex(index, instanceClass, annotationManager));
        // Collect any sub-classes/interfaces from any HandlesTypes annotation
        getAnnotations(index, HandlesTypes.class).map(this::getTarget).forEach(annotationTarget -> getAnnotationInstances(annotationTarget, HandlesTypes.class).map(HandlesTypes.class::cast).forEach(handlesTypesInstance -> stream(handlesTypesInstance.value()).forEach(e -> {
            if (e.isAnnotation()) {
                addAnnotationToIndex(index, e, annotationManager);
            } else {
                addInstanceToIndex(index, e, annotationManager);
            }
        })));
        // Setup the default identity store, which is used as the default "username and roles database" for
        // (Servlet) security.
        initIdentityStore(webApplication);
        setApplicationContextPath(webApplication, config, applicationArchive);
        DefaultWebApplicationExtensionContext extensionContext = new DefaultWebApplicationExtensionContext();
        for (WebApplicationExtension extension : ServiceLoader.load(WebApplicationExtension.class)) {
            extensionContext.add(extension);
        }
        extensionContext.configure(webApplication);
        webApplication.initialize();
        webApplication.start();
        if ((boolean) config.get("micro.http.start")) {
            HttpWebApplicationServer webApplicationServer = new HttpWebApplicationServer();
            webApplicationServer.addWebApplication(webApplication);
            ServiceLoader<HttpServer> httpServers = ServiceLoader.load(HttpServer.class);
            httpServer = httpServers.findFirst().orElseThrow();
            httpServer.setServerPort((Integer) config.get("micro.port"));
            httpServer.setSSL(Boolean.getBoolean("piranha.http.ssl"));
            httpServer.setHttpServerProcessor(webApplicationServer);
            httpServer.start();
        }
        return Map.of("deployedServlets", webApplication.getServletRegistrations().keySet(), "deployedApplication", new MicroInnerApplication(webApplication), "deployedContextRoot", webApplication.getContextPath());
    } catch (IOException e) {
        throw new IllegalStateException(e);
    } catch (Exception e) {
        throw e;
    }
}
Also used : AnnotationManager(cloud.piranha.core.api.AnnotationManager) InternalAnnotationScanAnnotationManager(cloud.piranha.extension.annotationscan.internal.InternalAnnotationScanAnnotationManager) DefaultWebApplicationExtensionContext(cloud.piranha.core.impl.DefaultWebApplicationExtensionContext) XPathExpressionException(javax.xml.xpath.XPathExpressionException) URL(java.net.URL) RunAs(jakarta.annotation.security.RunAs) PostConstruct(jakarta.annotation.PostConstruct) ClassInfo(org.jboss.jandex.ClassInfo) Node(org.jboss.shrinkwrap.api.Node) HttpWebApplicationServer(cloud.piranha.http.webapp.HttpWebApplicationServer) Resource(jakarta.annotation.Resource) ByteArrayInputStream(java.io.ByteArrayInputStream) DeclareRoles(jakarta.annotation.security.DeclareRoles) Arrays.asList(java.util.Arrays.asList) Map(java.util.Map) WebFilter(jakarta.servlet.annotation.WebFilter) AnnotationTarget(org.jboss.jandex.AnnotationTarget) ShrinkWrapResource(cloud.piranha.resource.shrinkwrap.ShrinkWrapResource) HttpServer(cloud.piranha.http.api.HttpServer) ServiceLoader(java.util.ServiceLoader) PreDestroy(jakarta.annotation.PreDestroy) PermitAll(jakarta.annotation.security.PermitAll) WebApplicationExtension(cloud.piranha.core.api.WebApplicationExtension) Objects(java.util.Objects) Stream(java.util.stream.Stream) AnnotationInstance(org.jboss.jandex.AnnotationInstance) DefaultWebApplication(cloud.piranha.core.impl.DefaultWebApplication) MultipartConfig(jakarta.servlet.annotation.MultipartConfig) CLASS(org.jboss.jandex.AnnotationTarget.Kind.CLASS) SAXException(org.xml.sax.SAXException) WebApplication(cloud.piranha.core.api.WebApplication) Annotation(java.lang.annotation.Annotation) Optional(java.util.Optional) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) TRUE(java.lang.Boolean.TRUE) Arrays.stream(java.util.Arrays.stream) Level(java.lang.System.Logger.Level) ArchiveAsset(org.jboss.shrinkwrap.api.asset.ArchiveAsset) ServletSecurity(jakarta.servlet.annotation.ServletSecurity) XPath(javax.xml.xpath.XPath) AnnotationManager(cloud.piranha.core.api.AnnotationManager) NODESET(javax.xml.xpath.XPathConstants.NODESET) Resources(jakarta.annotation.Resources) Function(java.util.function.Function) URLConnection(java.net.URLConnection) NamedNodeMap(org.w3c.dom.NamedNodeMap) Priority(jakarta.annotation.Priority) Index(org.jboss.jandex.Index) RolesAllowed(jakarta.annotation.security.RolesAllowed) HandlesTypes(jakarta.servlet.annotation.HandlesTypes) IndexReader(org.jboss.jandex.IndexReader) NodeList(org.w3c.dom.NodeList) DenyAll(jakarta.annotation.security.DenyAll) UTF_8(java.nio.charset.StandardCharsets.UTF_8) INFO(java.lang.System.Logger.Level.INFO) DotName.createSimple(org.jboss.jandex.DotName.createSimple) IOException(java.io.IOException) Archive(org.jboss.shrinkwrap.api.Archive) GlobalArchiveStreamHandler(cloud.piranha.resource.shrinkwrap.GlobalArchiveStreamHandler) Consumer(java.util.function.Consumer) WebListener(jakarta.servlet.annotation.WebListener) FIELD(org.jboss.jandex.AnnotationTarget.Kind.FIELD) XPathFactory(javax.xml.xpath.XPathFactory) METHOD(org.jboss.jandex.AnnotationTarget.Kind.METHOD) Logger(java.lang.System.Logger) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) WebInitParam(jakarta.servlet.annotation.WebInitParam) InternalAnnotationScanAnnotationManager(cloud.piranha.extension.annotationscan.internal.InternalAnnotationScanAnnotationManager) WebServlet(jakarta.servlet.annotation.WebServlet) InputStream(java.io.InputStream) DefaultWebApplicationExtensionContext(cloud.piranha.core.impl.DefaultWebApplicationExtensionContext) WebApplicationExtension(cloud.piranha.core.api.WebApplicationExtension) Index(org.jboss.jandex.Index) IOException(java.io.IOException) XPathExpressionException(javax.xml.xpath.XPathExpressionException) SAXException(org.xml.sax.SAXException) IOException(java.io.IOException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) HttpWebApplicationServer(cloud.piranha.http.webapp.HttpWebApplicationServer) GlobalArchiveStreamHandler(cloud.piranha.resource.shrinkwrap.GlobalArchiveStreamHandler) InternalAnnotationScanAnnotationManager(cloud.piranha.extension.annotationscan.internal.InternalAnnotationScanAnnotationManager) HttpServer(cloud.piranha.http.api.HttpServer) DefaultWebApplication(cloud.piranha.core.impl.DefaultWebApplication) WebApplication(cloud.piranha.core.api.WebApplication) HandlesTypes(jakarta.servlet.annotation.HandlesTypes)

Aggregations

AnnotationManager (cloud.piranha.core.api.AnnotationManager)1 WebApplication (cloud.piranha.core.api.WebApplication)1 WebApplicationExtension (cloud.piranha.core.api.WebApplicationExtension)1 DefaultWebApplication (cloud.piranha.core.impl.DefaultWebApplication)1 DefaultWebApplicationExtensionContext (cloud.piranha.core.impl.DefaultWebApplicationExtensionContext)1 InternalAnnotationScanAnnotationManager (cloud.piranha.extension.annotationscan.internal.InternalAnnotationScanAnnotationManager)1 HttpServer (cloud.piranha.http.api.HttpServer)1 HttpWebApplicationServer (cloud.piranha.http.webapp.HttpWebApplicationServer)1 GlobalArchiveStreamHandler (cloud.piranha.resource.shrinkwrap.GlobalArchiveStreamHandler)1 ShrinkWrapResource (cloud.piranha.resource.shrinkwrap.ShrinkWrapResource)1 PostConstruct (jakarta.annotation.PostConstruct)1 PreDestroy (jakarta.annotation.PreDestroy)1 Priority (jakarta.annotation.Priority)1 Resource (jakarta.annotation.Resource)1 Resources (jakarta.annotation.Resources)1 DeclareRoles (jakarta.annotation.security.DeclareRoles)1 DenyAll (jakarta.annotation.security.DenyAll)1 PermitAll (jakarta.annotation.security.PermitAll)1 RolesAllowed (jakarta.annotation.security.RolesAllowed)1 RunAs (jakarta.annotation.security.RunAs)1