use of cloud.piranha.core.impl.DefaultWebApplicationExtensionContext 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.impl.DefaultWebApplicationExtensionContext in project piranha by piranhacloud.
the class MicroPiranha method run.
/**
* Run method.
*/
@Override
public void run() {
long startTime = System.currentTimeMillis();
LOGGER.log(INFO, () -> "Starting Piranha");
webApplicationServer = new HttpWebApplicationServer();
if (httpPort > 0) {
HttpServer httpServer = ServiceLoader.load(HttpServer.class).findFirst().orElseThrow();
httpServer.setServerPort(httpPort);
httpServer.setHttpServerProcessor(webApplicationServer);
httpServer.start();
}
if (httpsPort > 0) {
HttpServer httpsServer = ServiceLoader.load(HttpServer.class).findFirst().orElseThrow();
httpsServer.setHttpServerProcessor(webApplicationServer);
httpsServer.setServerPort(httpsPort);
httpsServer.setSSL(true);
httpsServer.start();
}
String contextPath = null;
if (warFile != null && warFile.getName().toLowerCase().endsWith(".war")) {
contextPath = warFile.getName().substring(0, warFile.getName().length() - 4);
if (webAppDir == null) {
webAppDir = new File(contextPath);
}
extractWarFile(warFile, webAppDir);
}
if (webAppDir != null && webAppDir.exists()) {
if (contextPath == null) {
contextPath = webAppDir.getName();
}
DefaultWebApplication webApplication = new DefaultWebApplication();
webApplication.addResource(new DirectoryResource(webAppDir));
DefaultWebApplicationClassLoader classLoader = new DefaultWebApplicationClassLoader(webAppDir);
webApplication.setClassLoader(classLoader);
if (Boolean.getBoolean("cloud.piranha.modular.enable") || jpmsEnabled) {
setupLayers(classLoader);
}
if (classLoader.getResource("/META-INF/services/" + WebApplicationExtension.class.getName()) == null) {
DefaultWebApplicationExtensionContext extensionContext = new DefaultWebApplicationExtensionContext();
extensionContext.add(extensionClass);
extensionContext.configure(webApplication);
} else {
DefaultWebApplicationExtensionContext extensionContext = new DefaultWebApplicationExtensionContext();
ServiceLoader<WebApplicationExtension> serviceLoader = ServiceLoader.load(WebApplicationExtension.class, classLoader);
extensionContext.add(serviceLoader.iterator().next());
extensionContext.configure(webApplication);
}
if (contextPath.equalsIgnoreCase("ROOT")) {
contextPath = "";
} else if (!contextPath.startsWith("/")) {
contextPath = "/" + contextPath;
}
webApplication.setContextPath(contextPath);
webApplicationServer.addWebApplication(webApplication);
try {
webApplication.initialize();
} catch (Exception e) {
LOGGER.log(ERROR, "Failed to initialize web application");
System.exit(0);
}
}
if (webAppDir == null && warFile == null) {
LOGGER.log(WARNING, "No web application deployed");
}
webApplicationServer.start();
long finishTime = System.currentTimeMillis();
LOGGER.log(INFO, "Started Piranha");
LOGGER.log(INFO, "It took {0} milliseconds", finishTime - startTime);
if (pid != null) {
File pidFile = new File("tmp", "piranha-micro.pid");
if (!pidFile.getParentFile().exists()) {
if (!pidFile.getParentFile().mkdirs()) {
LOGGER.log(WARNING, "Unable to create tmp directory for PID file");
}
}
try (PrintWriter writer = new PrintWriter(new FileWriter(pidFile))) {
writer.println(pid);
writer.flush();
} catch (IOException ioe) {
LOGGER.log(WARNING, "Unable to write PID file", ioe);
}
}
while (!stop) {
if (pid != null) {
File pidFile = new File("tmp", "piranha-micro.pid");
if (!pidFile.exists()) {
stop();
}
}
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
}
use of cloud.piranha.core.impl.DefaultWebApplicationExtensionContext in project piranha by piranhacloud.
the class ServerPiranha method run.
/**
* Run method.
*/
@Override
public void run() {
long startTime = System.currentTimeMillis();
LOGGER.log(INFO, () -> "Starting Piranha");
webApplicationServer = new HttpWebApplicationServer();
startHttpServer();
startHttpsServer();
webApplicationServer.start();
WebApplicationServerRequestMapper requestMapper = webApplicationServer.getRequestMapper();
File[] webapps = webAppsDir.listFiles();
if (webapps != null) {
for (File webapp : webapps) {
if (webapp.getName().toLowerCase().endsWith(".war")) {
String contextPath = webapp.getName().substring(0, webapp.getName().length() - 4);
File webAppDirectory = new File(webAppsDir, contextPath);
extractWarFile(webapp, webAppDirectory);
DefaultWebApplication webApplication = new ServerWebApplication(requestMapper);
webApplication.addResource(new DirectoryResource(webAppDirectory));
DefaultWebApplicationClassLoader classLoader = new DefaultWebApplicationClassLoader(webAppDirectory);
webApplication.setClassLoader(classLoader);
if (Boolean.getBoolean("cloud.piranha.modular.enable") || jpmsEnabled) {
setupLayers(classLoader);
}
if (classLoader.getResource("/META-INF/services/" + WebApplicationExtension.class.getName()) == null) {
DefaultWebApplicationExtensionContext extensionContext = new DefaultWebApplicationExtensionContext();
extensionContext.add(defaultExtensionClass);
extensionContext.configure(webApplication);
} else {
DefaultWebApplicationExtensionContext extensionContext = new DefaultWebApplicationExtensionContext();
ServiceLoader<WebApplicationExtension> serviceLoader = ServiceLoader.load(WebApplicationExtension.class, classLoader);
extensionContext.add(serviceLoader.iterator().next());
extensionContext.configure(webApplication);
}
if (contextPath.equalsIgnoreCase("ROOT")) {
contextPath = "";
} else if (!contextPath.startsWith("/")) {
contextPath = "/" + contextPath;
}
webApplication.setContextPath(contextPath);
try {
webApplication.initialize();
webApplication.start();
LOGGER.log(INFO, "Deployed " + webapp.getName() + " at " + webApplication.getContextPath());
} catch (Exception e) {
LOGGER.log(ERROR, () -> "Failed to initialize app " + webapp.getName(), e);
}
webApplicationServer.addWebApplication(webApplication);
}
}
}
long finishTime = System.currentTimeMillis();
LOGGER.log(INFO, "Started Piranha");
LOGGER.log(INFO, "It took {0} milliseconds", finishTime - startTime);
started = true;
File startedFile = new File("tmp/piranha.started");
File stoppedFile = new File("tmp/piranha.stopped");
if (stoppedFile.exists()) {
try {
Files.delete(stoppedFile.toPath());
} catch (IOException ioe) {
LOGGER.log(WARNING, "Error while deleting existing piranha.stopped file", ioe);
}
}
if (!startedFile.exists()) {
try {
startedFile.createNewFile();
} catch (IOException ioe) {
LOGGER.log(WARNING, "Unable to create piranha.started file", ioe);
}
}
File pidFile = new File(PID_FILE);
while (isRunning()) {
try {
Thread.sleep(2000);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
}
if (!pidFile.exists()) {
webApplicationServer.stop();
stopHttpServer();
if (httpsServer != null) {
httpsServer.stop();
}
}
}
finishTime = System.currentTimeMillis();
LOGGER.log(INFO, "Stopped Piranha");
LOGGER.log(INFO, "We ran for {0} milliseconds", finishTime - startTime);
if (startedFile.exists()) {
try {
Files.delete(startedFile.toPath());
} catch (IOException ioe) {
LOGGER.log(WARNING, "Error while deleting existing piranha.started file", ioe);
}
}
if (!stoppedFile.exists()) {
try {
stoppedFile.createNewFile();
} catch (IOException ioe) {
LOGGER.log(WARNING, "Unable to create piranha.stopped file", ioe);
}
}
if (exitOnStop) {
System.exit(0);
}
}
use of cloud.piranha.core.impl.DefaultWebApplicationExtensionContext in project piranha by piranhacloud.
the class ServletAnnotationsExtensionTest method testOnStartup7.
/**
* Test onStartup method.
*
* @throws Exception when a serious error occurs.
*/
@Test
void testOnStartup7() throws Exception {
DefaultWebApplication webApplication = new DefaultWebApplication();
webApplication.getManager().setAnnotationManager(new InternalAnnotationScanAnnotationManager());
webApplication.addInitializer(new AnnotationScanInitializer());
DefaultWebApplicationClassLoader classLoader = new DefaultWebApplicationClassLoader(new File(""));
classLoader.getResourceManager().addResource(new ClassResource(Test3Filter.class.getName()));
webApplication.setClassLoader(classLoader);
DefaultWebApplicationExtensionContext context = new DefaultWebApplicationExtensionContext();
context.add(ServletAnnotationsExtension.class);
context.configure(webApplication);
webApplication.initialize();
FilterRegistration registration = webApplication.getFilterRegistration("Test3Filter");
assertNotNull(registration);
FilterEnvironment filterEnvironment = (FilterEnvironment) registration;
assertEquals("value", filterEnvironment.getInitParameter("name"));
}
use of cloud.piranha.core.impl.DefaultWebApplicationExtensionContext in project piranha by piranhacloud.
the class ServletAnnotationsExtensionTest method testOnStartup3.
/**
* Test onStartup method.
*
* @throws Exception when a serious error occurs.
*/
@Test
void testOnStartup3() throws Exception {
DefaultWebApplication webApplication = new DefaultWebApplication();
webApplication.getManager().setAnnotationManager(new InternalAnnotationScanAnnotationManager());
webApplication.addInitializer(new AnnotationScanInitializer());
DefaultWebApplicationClassLoader classLoader = new DefaultWebApplicationClassLoader(new File(""));
classLoader.getResourceManager().addResource(new ClassResource(Test3Servlet.class.getName()));
webApplication.setClassLoader(classLoader);
DefaultWebApplicationExtensionContext context = new DefaultWebApplicationExtensionContext();
context.add(ServletAnnotationsExtension.class);
context.configure(webApplication);
webApplication.initialize();
ServletRegistration registration = webApplication.getServletRegistration("Test3Servlet");
assertNotNull(registration);
assertFalse(registration.getMappings().isEmpty());
}
Aggregations