guice modules / owner config
parent
5bee11d042
commit
c8ca810bcb
22
pom.xml
22
pom.xml
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package io.rudin.minetest.tileserver.cache;
|
||||
package io.rudin.minetest.tileserver.service;
|
||||
|
||||
import java.io.IOException;
|
||||
|
|
@ -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;
|
|
@ -1,4 +1,4 @@
|
|||
package io.rudin.minetest.util;
|
||||
package io.rudin.minetest.tileserver.util;
|
||||
|
||||
public class CoordinateResolver {
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package io.rudin.minetest.util;
|
||||
package io.rudin.minetest.tileserver.util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
|
@ -1,4 +1,4 @@
|
|||
package io.rudin.minetest.util;
|
||||
package io.rudin.minetest.tileserver.util;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue