guice modules / owner config

master
Thomas Rudin 2018-04-13 09:09:01 +00:00
parent 5bee11d042
commit c8ca810bcb
18 changed files with 311 additions and 76 deletions

22
pom.xml
View File

@ -29,6 +29,18 @@
<dependencies>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.aeonbits.owner</groupId>
<artifactId>owner-java8</artifactId>
<version>1.0.10</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
@ -58,12 +70,12 @@
<artifactId>jooq-codegen</artifactId>
<version>${jooq-version}</version>
</dependency>
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.7.2</version>
</dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>

View File

@ -13,6 +13,8 @@ import java.io.IOException;
import java.util.zip.DataFormatException;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jooq.DSLContext;
import org.jooq.Result;
@ -21,15 +23,17 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.rudin.minetest.tileserver.blockdb.tables.records.BlocksRecord;
import io.rudin.minetest.tileserver.cache.TileCache;
import io.rudin.minetest.util.CoordinateResolver;
import io.rudin.minetest.util.CoordinateResolver.MapBlockCoordinateInfo;
import io.rudin.minetest.util.WhiteTile;
import io.rudin.minetest.tileserver.service.TileCache;
import io.rudin.minetest.tileserver.util.CoordinateResolver;
import io.rudin.minetest.tileserver.util.CoordinateResolver.MapBlockCoordinateInfo;
import io.rudin.minetest.tileserver.util.WhiteTile;
@Singleton
public class TileRenderer {
private static final Logger logger = LoggerFactory.getLogger(TileRenderer.class);
@Inject
public TileRenderer(DSLContext ctx, ColorTable colorTable, TileCache cache) {
this.ctx = ctx;
this.colorTable = colorTable;

View File

@ -0,0 +1,46 @@
package io.rudin.minetest.tileserver;
import static spark.Spark.get;
import static spark.Spark.init;
import static spark.Spark.port;
import static spark.Spark.staticFileLocation;
import static spark.Spark.stop;
import com.google.inject.Guice;
import com.google.inject.Injector;
import io.rudin.minetest.tileserver.config.TileServerConfig;
import io.rudin.minetest.tileserver.module.ConfigModule;
import io.rudin.minetest.tileserver.module.DBModule;
import io.rudin.minetest.tileserver.module.ServiceModule;
import io.rudin.minetest.tileserver.route.TileRoute;
public class TileServer {
private static Injector injector;
public static void main(String[] args) throws Exception {
Injector injector = Guice.createInjector(
new ConfigModule(),
new DBModule(),
new ServiceModule()
);
TileServerConfig cfg = injector.getInstance(TileServerConfig.class);
staticFileLocation("/public");
port(cfg.httPort());
init();
get("/tiles/:z/:x/:y", injector.getInstance(TileRoute.class));
System.in.read();
stop();
}
}

View File

@ -0,0 +1,35 @@
package io.rudin.minetest.tileserver.config;
import org.aeonbits.owner.Config;
import org.aeonbits.owner.Config.Sources;
@Sources({
"file:./tileserver.properties"
})
public interface TileServerConfig extends Config {
@Key("http.port")
@DefaultValue("8080")
int httPort();
@Key("tiles.directory")
@DefaultValue("target/tiles")
String tileDirectory();
@Key("minetest.db.url")
@DefaultValue("jdbc:postgresql://10.0.0.131:5432/minetest")
String minetestDatabaseUrl();
@Key("minetest.db.username")
@DefaultValue("postgres")
String minetestDatabaseUsername();
@Key("minetest.db.password")
@DefaultValue("enter")
String minetestDatabasePassword();
@Key("minetest.db.driver")
@DefaultValue("org.postgresql.Driver")
String minetestDatabaseDriver();
}

View File

@ -0,0 +1,16 @@
package io.rudin.minetest.tileserver.module;
import org.aeonbits.owner.ConfigFactory;
import com.google.inject.AbstractModule;
import io.rudin.minetest.tileserver.config.TileServerConfig;
public class ConfigModule extends AbstractModule {
@Override
protected void configure() {
bind(TileServerConfig.class).toInstance(ConfigFactory.create(TileServerConfig.class));
}
}

View File

@ -0,0 +1,22 @@
package io.rudin.minetest.tileserver.module;
import org.jooq.DSLContext;
import com.google.inject.AbstractModule;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.rudin.minetest.tileserver.provider.DSLContextProvider;
import io.rudin.minetest.tileserver.provider.HikariConfigProvider;
import io.rudin.minetest.tileserver.provider.HikariDatasourceProvider;
public class DBModule extends AbstractModule {
@Override
protected void configure() {
bind(HikariConfig.class).toProvider(HikariConfigProvider.class);
bind(HikariDataSource.class).toProvider(HikariDatasourceProvider.class);
bind(DSLContext.class).toProvider(DSLContextProvider.class);
}
}

View File

@ -0,0 +1,14 @@
package io.rudin.minetest.tileserver.module;
import com.google.inject.AbstractModule;
import io.rudin.minetest.tileserver.service.TileCache;
import io.rudin.minetest.tileserver.service.impl.FileTileCache;
public class ServiceModule extends AbstractModule {
@Override
protected void configure() {
bind(TileCache.class).to(FileTileCache.class);
}
}

View File

@ -0,0 +1,20 @@
package io.rudin.minetest.tileserver.provider;
import javax.inject.Provider;
import javax.inject.Singleton;
import io.rudin.minetest.tileserver.ColorTable;
import io.rudin.minetest.tileserver.FetchMap;
@Singleton
public class ColorTableProvider implements Provider<ColorTable> {
@Override
@Singleton
public ColorTable get() {
ColorTable colorTable = new ColorTable();
colorTable.load(FetchMap.class.getResourceAsStream("/colors.txt"));
return colorTable;
}
}

View File

@ -0,0 +1,28 @@
package io.rudin.minetest.tileserver.provider;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import com.zaxxer.hikari.HikariDataSource;
@Singleton
public class DSLContextProvider implements Provider<DSLContext> {
@Inject
public DSLContextProvider(HikariDataSource ds) {
this.ds = ds;
}
private final HikariDataSource ds;
@Override
public DSLContext get() {
return DSL.using(ds, SQLDialect.POSTGRES);
}
}

View File

@ -0,0 +1,33 @@
package io.rudin.minetest.tileserver.provider;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import com.zaxxer.hikari.HikariConfig;
import io.rudin.minetest.tileserver.config.TileServerConfig;
@Singleton
public class HikariConfigProvider implements Provider<HikariConfig> {
@Inject
public HikariConfigProvider(TileServerConfig cfg) {
this.cfg = cfg;
}
private final TileServerConfig cfg;
@Override
@Singleton
public HikariConfig get() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setUsername(cfg.minetestDatabaseUsername());
hikariConfig.setPassword(cfg.minetestDatabasePassword());
hikariConfig.setJdbcUrl(cfg.minetestDatabaseUrl());
hikariConfig.setDriverClassName(cfg.minetestDatabaseDriver());
return hikariConfig;
}
}

View File

@ -0,0 +1,26 @@
package io.rudin.minetest.tileserver.provider;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@Singleton
public class HikariDatasourceProvider implements Provider<HikariDataSource> {
@Inject
public HikariDatasourceProvider(HikariConfig cfg) {
this.cfg = cfg;
}
private final HikariConfig cfg;
@Override
@Singleton
public HikariDataSource get() {
return new HikariDataSource(cfg);
}
}

View File

@ -0,0 +1,31 @@
package io.rudin.minetest.tileserver.route;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.rudin.minetest.tileserver.TileRenderer;
import spark.Request;
import spark.Response;
import spark.Route;
@Singleton
public class TileRoute implements Route {
@Inject
public TileRoute(TileRenderer renderer) {
this.renderer = renderer;
}
private final TileRenderer renderer;
@Override
public Object handle(Request req, Response res) throws Exception {
res.header("Content-Type", "image/png");
int z = Integer.parseInt(req.params(":z"));
int y = Integer.parseInt(req.params(":y"));
int x = Integer.parseInt(req.params(":x"));
return renderer.render(x, y, z);
}
}

View File

@ -1,4 +1,4 @@
package io.rudin.minetest.tileserver.cache;
package io.rudin.minetest.tileserver.service;
import java.io.IOException;

View File

@ -1,4 +1,4 @@
package io.rudin.minetest.tileserver.cache;
package io.rudin.minetest.tileserver.service.impl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@ -7,12 +7,19 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import io.rudin.minetest.util.StreamUtil;
import javax.inject.Inject;
import javax.inject.Singleton;
import io.rudin.minetest.tileserver.config.TileServerConfig;
import io.rudin.minetest.tileserver.service.TileCache;
import io.rudin.minetest.tileserver.util.StreamUtil;
@Singleton
public class FileTileCache implements TileCache {
public FileTileCache(File baseDirectory) {
this.baseDirectory = baseDirectory;
@Inject
public FileTileCache(TileServerConfig cfg) {
this.baseDirectory = new File(cfg.tileDirectory());
}
private final File baseDirectory;

View File

@ -1,4 +1,4 @@
package io.rudin.minetest.util;
package io.rudin.minetest.tileserver.util;
public class CoordinateResolver {

View File

@ -1,4 +1,4 @@
package io.rudin.minetest.util;
package io.rudin.minetest.tileserver.util;
import java.io.IOException;
import java.io.InputStream;

View File

@ -1,4 +1,4 @@
package io.rudin.minetest.util;
package io.rudin.minetest.tileserver.util;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

View File

@ -1,59 +0,0 @@
package io.rudin.minetest.tileserver;
import static spark.Spark.get;
import static spark.Spark.init;
import static spark.Spark.staticFileLocation;
import static spark.Spark.stop;
import java.io.File;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import io.rudin.minetest.tileserver.cache.FileTileCache;
import io.rudin.minetest.tileserver.cache.TileCache;
public class TileServer {
public static void main(String[] args) throws Exception {
HikariConfig cfg = new HikariConfig();
cfg.setUsername("postgres");
cfg.setPassword("enter");
cfg.setJdbcUrl("jdbc:postgresql://10.0.0.131:5432/minetest");
cfg.setDriverClassName("org.postgresql.Driver");
HikariDataSource dataSource = new HikariDataSource(cfg);
DSLContext ctx = DSL.using(dataSource, SQLDialect.POSTGRES);
TileCache cache = new FileTileCache(new File("target/tiles"));
ColorTable colorTable = new ColorTable();
colorTable.load(FetchMap.class.getResourceAsStream("/colors.txt"));
TileRenderer renderer = new TileRenderer(ctx, colorTable, cache);
staticFileLocation("/public");
init();
get("/tiles/:z/:x/:y", (req, res) -> {
res.header("Content-Type", "image/png");
int z = Integer.parseInt(req.params(":z"));
int y = Integer.parseInt(req.params(":y"));
int x = Integer.parseInt(req.params(":x"));
return renderer.render(x, y, z);
});
System.in.read();
stop();
}
}