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

foo.bar.TestRuntime Maven / Gradle / Ivy

package foo.bar;

import bz.gsn.djinn.core.build.BuildEnvironment;
import bz.gsn.djinn.core.module.Runtime;
import bz.gsn.djinn.core.resource.ResourceRegistry;
import foo.bar.annotations.RequestHandler;
import io.undertow.Undertow;
import io.undertow.server.handlers.CanonicalPathHandler;
import io.undertow.util.Headers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.invoke.MethodHandle;
import java.nio.charset.StandardCharsets;
import java.util.Map;

public class TestRuntime extends Runtime {

	private static final Logger log = LoggerFactory.getLogger(TestRuntime.class);
	private final Map handles;
	private final Map contentTypes;
	private Undertow undertow;

	public TestRuntime(RequestHandler.Detector detector) {
		this.handles = detector.getMethodHandles();
		this.contentTypes = detector.getContentTypes();
	}

	@Override
	public void run(ResourceRegistry resourceRegistry) {
		log.info("I'm from the TestRuntime.");
		System.out.println("Build variables are " + BuildEnvironment.getBuildEnvironment().getProperties());
		log.info("Running Undertow on port 8080");
		this.undertow = Undertow.builder()
				.addHttpListener(8080, "localhost")
				.setHandler(new CanonicalPathHandler(
						exchange -> {
							var log = LoggerFactory.getLogger("path-handler");
							var path = exchange.getRelativePath();
							if(!path.endsWith("/")) path += "/";
							log.info("Requested for {}", path);
							try {
								if(handles.containsKey(path)) {
									exchange.setStatusCode(200);
									log.info("Invoking path handler for {}", path);
									exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, contentTypes.get(path));
									exchange.getResponseSender().send(handles.get(path).invoke().toString()); // static method
								} else {
									exchange.setStatusCode(404);
									exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
									exchange.getResponseSender().send("404!", StandardCharsets.UTF_8);
								}
							} catch(Throwable e) {
								throw new RuntimeException(e);
							}
						}
				))
				.build();
		this.undertow.start();
	}

	@Override
	public void stop(ResourceRegistry ignore) {
		this.undertow.stop();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy