use of cloud.piranha.core.api.WebApplication in project piranha by piranhacloud.
the class MicroInnerDeployer method getWebApplication.
WebApplication getWebApplication(Archive<?> archive, ClassLoader newClassLoader) {
WebApplication webApplication = new DefaultWebApplication();
webApplication.setClassLoader(newClassLoader);
// The main resource representing the (war) archive itself.
webApplication.addResource(new ShrinkWrapResource(archive));
// Get the list of embedded archives containing a "/META-INF/resources" folder.
Node resourceNodes = archive.get("/META-INF/piranha/resource-libs");
if (resourceNodes != null) {
for (Node resourceNode : resourceNodes.getChildren()) {
ArchiveAsset resourceArchiveAsset = (ArchiveAsset) resourceNode.getAsset();
// Add the archive as a resource with the "/META-INF/resources" folder shifted to its root
webApplication.addResource(new ShrinkWrapResource("/META-INF/resources", resourceArchiveAsset.getArchive()));
}
}
return webApplication;
}
use of cloud.piranha.core.api.WebApplication 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;
}
}
use of cloud.piranha.core.api.WebApplication in project piranha by piranhacloud.
the class EmbeddedResponseBuilderTest method testWebApplication.
/**
* Test webApplication method.
*
* @throws Exception when an error occurs.
*/
@Test
void testWebApplication() throws Exception {
DefaultWebApplication webApplication = new DefaultWebApplication();
EmbeddedResponse response = new EmbeddedResponseBuilder().webApplication(webApplication).build();
assertTrue(response.getWebApplication() instanceof WebApplication);
assertEquals(webApplication, response.getWebApplication());
}
use of cloud.piranha.core.api.WebApplication in project piranha by piranhacloud.
the class WebXmlInitializer method onStartup.
/**
* On startup.
*
* @param classes the classes.
* @param servletContext the servlet context.
* @throws ServletException when a servlet error occurs.
*/
@Override
public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException {
LOGGER.log(DEBUG, () -> "Entering WebXmlInitializer.onStartup");
try {
WebApplication webApplication = (WebApplication) servletContext;
InternalWebXmlManager manager = new InternalWebXmlManager();
webApplication.getManager().setWebXmlManager(manager);
InternalWebXmlParser parser = new InternalWebXmlParser();
InputStream inputStream = servletContext.getResourceAsStream("WEB-INF/web.xml");
if (inputStream != null) {
WebXml webXml = parser.parse(servletContext.getResourceAsStream("WEB-INF/web.xml"));
manager.setWebXml(webXml);
manager.setInitialWebXml(webXml);
}
ArrayList<WebXml> webFragments = new ArrayList<>();
List<URL> webFragmentUrls = Collections.list(servletContext.getClassLoader().getResources("META-INF/web-fragment.xml"));
for (URL url : webFragmentUrls) {
try (InputStream stream = url.openStream()) {
WebXml webFragment = parser.parse(stream);
webFragment.setFragment(true);
webFragments.add(webFragment);
}
}
if (!webFragments.isEmpty()) {
manager.setWebFragments(webFragments);
}
if (manager.getWebXml() == null) {
manager.setWebXml(new WebXml());
}
if (manager.getWebXml() != null) {
WebXml webXml = manager.getWebXml();
InternalWebXmlProcessor processor = new InternalWebXmlProcessor();
processor.process(webXml, webApplication);
if (webXml.getMetadataComplete()) {
return;
}
removeExistingServletMappings(webApplication, manager);
manager.getOrderedFragments().forEach(fragment -> processor.process(fragment, webApplication));
} else {
LOGGER.log(DEBUG, "No web.xml found!");
}
} catch (IOException e) {
LOGGER.log(WARNING, "Unable to parse web.xml", e);
}
LOGGER.log(DEBUG, () -> "Exiting WebXmlInitializer.onStartup");
}
use of cloud.piranha.core.api.WebApplication in project piranha by piranhacloud.
the class SoteriaInitializer method onStartup.
/**
* Initialize Soteria.
*
* @param classes the classes.
* @param servletContext the Servlet context.
* @throws ServletException when a Servlet error occurs.
*/
@Override
public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException {
LOGGER.log(DEBUG, "Initializing Soteria");
WebApplication webApplication = (WebApplication) servletContext;
webApplication.getManager().getSecurityManager().setUsernamePasswordLoginHandler(new IdentityStoreLoginHandler());
SamRegistrationInstaller installer = new SamRegistrationInstaller();
installer.onStartup(classes, servletContext);
LOGGER.log(DEBUG, "Initialized Soteria");
}
Aggregations