Skip to content

Commit 6c34627

Browse files
committed
Add API debugging class, route definition, and example handler; update build dependencies
1 parent 7b6bea3 commit 6c34627

15 files changed

Lines changed: 171 additions & 31 deletions

File tree

build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ dependencies {
7070
implementation 'io.projectreactor:reactor-core:3.8.1'
7171
implementation 'io.projectreactor.netty:reactor-netty-core'
7272
implementation 'io.projectreactor.netty:reactor-netty-http'
73+
implementation 'io.javalin:javalin:6.7.0'
74+
75+
implementation 'ch.qos.logback:logback-classic:1.4.14'
76+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.2'
77+
78+
implementation 'org.reflections:reflections:0.10.2'
7379
}
7480

7581
test {

src/main/java/io/nodelink/server/NodeLink.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.nodelink.server;
22

3+
import io.nodelink.server.app.node.api.NodeStarter;
34
import io.nodelink.server.log.Logger;
45
import io.nodelink.server.update.Updater;
56

@@ -52,5 +53,9 @@ public Updater getUpdater() {
5253
return Updater.getUpdaterSingleton();
5354
}
5455

56+
public NodeStarter getNodeStarter() {
57+
return NodeStarter.getNodeStarterSingleton();
58+
}
59+
5560
}
5661

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.nodelink.server.app;
2+
3+
import io.nodelink.server.NodeLink;
4+
5+
public class APIDebug {
6+
7+
static void main(String[] args) {
8+
System.out.println("API Debugging...");
9+
10+
NodeLink.getInstance().getNodeStarter().startServer();
11+
12+
try {
13+
Thread.sleep(50000);
14+
} catch (InterruptedException e) {
15+
throw new RuntimeException(e);
16+
}
17+
}
18+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.nodelink.server.app.config;
2+
3+
import io.javalin.http.Context;
4+
5+
@FunctionalInterface
6+
public interface ApiHandler {
7+
void handle(Context ctx) throws Exception;
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.nodelink.server.app.config;
2+
3+
import io.javalin.http.Context;
4+
import io.javalin.http.HandlerType;
5+
6+
public interface RouteDefinition {
7+
HandlerType method(); // GET, POST, etc.
8+
String path(); // /example
9+
boolean enabled(); // Activé ou non
10+
void handle(Context ctx); // La logique (le handler)
11+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package io.nodelink.server.app.config;
2+
3+
import io.javalin.Javalin;
4+
import org.reflections.Reflections;
5+
import java.util.Set;
6+
7+
public class RouteHandler {
8+
public static void registerAllRoutes(Javalin app, String basePackage) {
9+
Reflections reflections = new Reflections(basePackage);
10+
Set<Class<? extends RouteDefinition>> routeClasses = reflections.getSubTypesOf(RouteDefinition.class);
11+
12+
for (Class<? extends RouteDefinition> routeClass : routeClasses) {
13+
try {
14+
RouteDefinition route = routeClass.getDeclaredConstructor().newInstance();
15+
16+
if (route.enabled()) {
17+
String pkg = routeClass.getPackageName();
18+
String[] parts = pkg.split("\\.");
19+
String version = "v1";
20+
21+
for (String part : parts) {
22+
if (part.matches("v\\d+")) {
23+
version = part;
24+
break;
25+
}
26+
}
27+
28+
String fullPath = "/api/" + version + route.path();
29+
30+
app.addHttpHandler(route.method(), fullPath, route::handle);
31+
}
32+
} catch (Exception e) {
33+
System.err.println("[ERROR] Could not register route: " + routeClass.getName());
34+
e.printStackTrace();
35+
}
36+
}
37+
}
38+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.nodelink.server.app.node.api;
2+
3+
import io.javalin.Javalin;
4+
import io.nodelink.server.NodeLink;
5+
import io.nodelink.server.app.config.RouteHandler;
6+
import org.slf4j.LoggerFactory;
7+
import ch.qos.logback.classic.Level;
8+
import ch.qos.logback.classic.LoggerContext;
9+
import reactor.core.publisher.Mono;
10+
import reactor.core.scheduler.Schedulers;
11+
12+
public class NodeStarter {
13+
14+
private static final NodeStarter INSTANCE = new NodeStarter();
15+
private Javalin app;
16+
17+
static {
18+
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
19+
loggerContext.getLogger("io.javalin").setLevel(Level.OFF);
20+
loggerContext.getLogger("org.eclipse.jetty").setLevel(Level.OFF);
21+
loggerContext.getLogger("reactor").setLevel(Level.OFF);
22+
}
23+
24+
public void startServer() {
25+
Mono.fromRunnable(() -> {
26+
app = Javalin.create(config -> {
27+
config.showJavalinBanner = false;
28+
config.router.contextPath = "/bone";
29+
}).start(8080);
30+
31+
RouteHandler.registerAllRoutes(app, "io.nodelink.server.app.node.api.routes");
32+
33+
NodeLink.getInstance().getLogger().SUCCESS("Node API Server started");
34+
})
35+
.subscribeOn(Schedulers.boundedElastic())
36+
.subscribe();
37+
}
38+
39+
public Javalin getApp() {
40+
return app;
41+
}
42+
43+
public static NodeStarter getNodeStarterSingleton() {
44+
return INSTANCE;
45+
}
46+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.nodelink.server.app.node.api.routes.v1.definition;
2+
3+
import io.javalin.http.Context;
4+
import io.javalin.http.HandlerType;
5+
import io.nodelink.server.app.config.RouteDefinition;
6+
import io.nodelink.server.app.node.api.routes.v1.handler.ExampleHandler;
7+
8+
public class ExampleDef implements RouteDefinition {
9+
10+
@Override
11+
public HandlerType method() { return HandlerType.GET; }
12+
13+
@Override
14+
public String path() { return "/status"; }
15+
16+
@Override
17+
public boolean enabled() { return true; }
18+
19+
@Override
20+
public void handle(Context ctx) {
21+
new ExampleHandler().handle(ctx);
22+
}
23+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.nodelink.server.app.node.api.routes.v1.handler;
2+
3+
import io.javalin.http.Context;
4+
import io.nodelink.server.app.config.ApiHandler;
5+
6+
import java.util.Map;
7+
8+
public class ExampleHandler implements ApiHandler {
9+
@Override
10+
public void handle(Context ctx) {
11+
ctx.json(Map.of("status", "Operational..."));
12+
}
13+
}

src/main/java/io/nodelink/server/command/CommandDispatcher.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
import java.util.*;
44
import java.util.function.Consumer;
55

6-
/**
7-
* Dispatcher simple : associe un Enum (handler key) à une action (Consumer<String[]>).
8-
* Lors de l'exécution, on trouve le noeud le plus profond et on invoque le handler enregistré pour son owner.
9-
*/
106
public class CommandDispatcher {
117

128
private final CommandRegistry registry;

0 commit comments

Comments
 (0)