Skip to content

Instantly share code, notes, and snippets.

@ajay-gov
Created November 14, 2020 21:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ajay-gov/282ac4c28ed5027b0cecb75eb3f7c918 to your computer and use it in GitHub Desktop.
Save ajay-gov/282ac4c28ed5027b0cecb75eb3f7c918 to your computer and use it in GitHub Desktop.
Custom Loader to set the port that a swim application binds to at runtime
package org.myproject;
import java.io.IOException;
import swim.actor.ActorKernel;
import swim.api.service.ServiceDef;
import swim.api.service.ServiceFactory;
import swim.api.space.SpaceDef;
import swim.auth.AuthenticatorKernel;
import swim.java.JavaKernel;
import swim.kernel.BootKernel;
import swim.kernel.Kernel;
import swim.kernel.KernelException;
import swim.kernel.KernelLoader;
import swim.remote.RemoteKernel;
import swim.service.ServiceKernel;
import swim.service.web.WebServiceDef;
import swim.service.web.WebServiceKernel;
import swim.store.db.DbStoreKernel;
import swim.store.mem.MemStoreKernel;
import swim.structure.Item;
import swim.structure.Value;
public final class CustomServerLoader {
private CustomServerLoader() {
// static
}
public static Kernel loadServer() {
return loadServer(KernelLoader.class.getClassLoader());
}
public static Kernel loadServer(ClassLoader classLoader) {
try {
Value kernelConfig = KernelLoader.loadConfig(classLoader);
if (kernelConfig == null) {
kernelConfig = KernelLoader.loadConfigResource(classLoader, "server.recon");
}
if (kernelConfig == null) {
kernelConfig = Value.absent();
}
final Kernel kernel = loadServerStack(classLoader, kernelConfig);
loadSpaces(kernel, kernelConfig, classLoader);
loadServices(kernel, kernelConfig, classLoader);
return kernel;
} catch (IOException cause) {
throw new KernelException(cause);
}
}
public static Kernel loadServerStack() {
return loadServerStack(KernelLoader.class.getClassLoader());
}
public static Kernel loadServerStack(ClassLoader classLoader) {
return injectServerStack(classLoader, null);
}
public static Kernel loadServerStack(ClassLoader classLoader, Value kernelConfig) {
Kernel kernel = KernelLoader.loadKernelStack(classLoader, kernelConfig);
kernel = injectServerStack(classLoader, kernel);
return kernel;
}
public static Kernel injectServerStack(ClassLoader classLoader, Kernel kernel) {
if (kernel == null) {
kernel = new BootKernel();
} else if (kernel.unwrapKernel(BootKernel.class) == null) {
kernel = kernel.injectKernel(new BootKernel());
}
if (kernel.unwrapKernel(MemStoreKernel.class) == null) {
kernel = kernel.injectKernel(new MemStoreKernel());
}
if (kernel.unwrapKernel(DbStoreKernel.class) == null) {
kernel = kernel.injectKernel(new DbStoreKernel());
}
if (kernel.unwrapKernel(RemoteKernel.class) == null) {
kernel = kernel.injectKernel(new RemoteKernel());
}
if (kernel.unwrapKernel(ServiceKernel.class) == null) {
kernel = kernel.injectKernel(new ServiceKernel());
}
if (kernel.unwrapKernel(WebServiceKernel.class) == null) {
kernel = kernel.injectKernel(new WebServiceKernel());
}
if (kernel.unwrapKernel(AuthenticatorKernel.class) == null) {
kernel = kernel.injectKernel(new AuthenticatorKernel());
}
if (kernel.unwrapKernel(ActorKernel.class) == null) {
kernel = kernel.injectKernel(new ActorKernel());
}
if (kernel.unwrapKernel(JavaKernel.class) == null) {
kernel = kernel.injectKernel(new JavaKernel());
}
return kernel;
}
public static void loadSpaces(Kernel kernel, Value kernelConfig, ClassLoader classLoader) {
for (int i = 0, n = kernelConfig.length(); i < n; i += 1) {
final Item item = kernelConfig.getItem(i);
final SpaceDef spaceDef = kernel.defineSpace(item);
if (spaceDef != null) {
kernel.openSpace(spaceDef);
}
}
}
public static void loadServices(Kernel kernel, Value kernelConfig, ClassLoader classLoader) {
for (int i = 0, n = kernelConfig.length(); i < n; i += 1) {
final Item item = kernelConfig.getItem(i);
final ServiceDef serviceDef = kernel.defineService(item);
if (serviceDef instanceof WebServiceDef) {
final WebServiceDef oldDef = ((WebServiceDef) serviceDef);
int port = Integer.parseInt(System.getProperty("port", "9002"));
final WebServiceDef newDef = oldDef.port(port);
System.out.println("Will bind to port " + port);
final ServiceFactory<?> serviceFactory = kernel.createServiceFactory(newDef, classLoader);
kernel.openService(serviceDef.serviceName(), serviceFactory);
} else {
final ServiceFactory<?> serviceFactory = kernel.createServiceFactory(serviceDef, classLoader);
kernel.openService(serviceDef.serviceName(), serviceFactory);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment