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

io.datakernel.launchers.cube.CubeHttpServerLauncher Maven / Gradle / Ivy

There is a newer version: 3.1.0
Show newest version
package io.datakernel.launchers.cube;

import com.google.inject.Module;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import io.datakernel.async.AsyncCallable;
import io.datakernel.async.EventloopTaskScheduler;
import io.datakernel.async.Stage;
import io.datakernel.config.Config;
import io.datakernel.cube.Cube;
import io.datakernel.cube.http.ReportingServiceServlet;
import io.datakernel.cube.ot.CubeDiff;
import io.datakernel.eventloop.Eventloop;
import io.datakernel.http.AsyncServlet;
import io.datakernel.launcher.Launcher;
import io.datakernel.launchers.http.HttpServerLauncher;
import io.datakernel.logfs.ot.LogDiff;
import io.datakernel.ot.OTStateManager;
import io.datakernel.util.guice.SimpleModule;

import javax.inject.Named;
import java.time.Duration;
import java.util.Collection;
import java.util.Collections;

import static com.google.inject.util.Modules.combine;
import static io.datakernel.config.ConfigConverters.ofDuration;
import static java.lang.Boolean.parseBoolean;
import static java.util.Arrays.asList;

public abstract class CubeHttpServerLauncher extends HttpServerLauncher {
	public static final String EAGER_SINGLETONS_MODE = "eagerSingletonsMode";
	public static final String CUBE_MODULE_PROP = "cubeModule";

	@Override
	protected final Collection getBusinessLogicModules() {
		return asList(
				combine(getCubeModules()),
				new SimpleModule() {
					@Provides
					@Singleton
					@Named("CubePullScheduler")
					EventloopTaskScheduler pullScheduler(Config config, Eventloop eventloop,
					                                     OTStateManager> cubeStateManager) {
						return EventloopTaskScheduler.create(eventloop, pullOrCheckoutTask(cubeStateManager))
								.withPeriod(config.get(ofDuration(), "CubeHttpServer.metadataRefreshPeriod", Duration.ofMillis(10_000)));
					}

					@Provides
					@Singleton
					AsyncServlet asyncServlet(Eventloop eventloop, Cube cube) {
						return ReportingServiceServlet.createRootServlet(eventloop, cube);
					}
				});
	}

	private AsyncCallable pullOrCheckoutTask(OTStateManager> cubeStateManager) {
		return () -> cubeStateManager.pull()
				.thenComposeEx((revisionId, throwable) ->
						throwable == null ?
								Stage.of(null) :
								cubeStateManager.checkout().toVoid());
	}

	protected abstract Collection getCubeModules();

	public static void main(String[] args) throws Exception {
		String cubeModuleName = System.getProperty(CUBE_MODULE_PROP);
		Module cubeModule = cubeModuleName != null ?
				(Module) Class.forName(cubeModuleName).newInstance() :
				new ExampleCubeModule();

		Launcher launcher = new CubeHttpServerLauncher() {
			@Override
			protected Collection getCubeModules() {
				return Collections.singletonList(cubeModule);
			}
		};
		launcher.launch(parseBoolean(System.getProperty(EAGER_SINGLETONS_MODE)), args);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy