Skip to content

Commit

Permalink
Merge pull request #28 from Unknow0/27-use-commons-cli-instead-of-picoli
Browse files Browse the repository at this point in the history
gh-27 switch cli lib
  • Loading branch information
Unknow0 authored Dec 17, 2023
2 parents 573315e + cf41b19 commit 8f3ccb6
Show file tree
Hide file tree
Showing 13 changed files with 261 additions and 317 deletions.
14 changes: 4 additions & 10 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.release>11</maven.compiler.release>

<picocli.version>4.6.3</picocli.version>
<slf4j.version>[1.7.16,)</slf4j.version>
<slf4j.version>1.7.16</slf4j.version>
<javaparser.version>3.25.3</javaparser.version>
<junit.version>5.8.2</junit.version>
<swagger.version>2.2.2</swagger.version>
Expand Down Expand Up @@ -54,11 +53,6 @@
<version>3.10.1</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>info.picocli</groupId>
<artifactId>picocli-codegen</artifactId>
<version>${picocli.version}</version>
</path>
<path>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
Expand Down Expand Up @@ -196,9 +190,9 @@
<version>1</version>
</dependency>
<dependency>
<groupId>info.picocli</groupId>
<artifactId>picocli</artifactId>
<version>${picocli.version}</version>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,103 +1,106 @@
package unknow.server.http;

import java.net.InetSocketAddress;
import java.util.ServiceLoader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;

import jakarta.servlet.ServletContainerInitializer;
import jakarta.servlet.ServletException;
import picocli.CommandLine.Option;
import unknow.server.http.servlet.FilterConfigImpl;
import unknow.server.http.servlet.ServletConfigImpl;
import unknow.server.http.servlet.ServletContextImpl;
import unknow.server.http.utils.EventManager;
import unknow.server.http.utils.ServletManager;
import unknow.server.nio.cli.NIOServerCli;
import unknow.server.nio.NIOServer;
import unknow.server.nio.NIOServerBuilder;

/**
* Abstract server
*
* @author unknow
*/
public abstract class AbstractHttpServer extends NIOServerCli {

/**
* public vhost seen be the servlet (default to the binded address)
*/
@Option(names = "--vhost", description = "public vhost seen be the servlet (default to the binded address)", descriptionKey = "vhost")
public String vhost;

/**
* min number of execution thread to use, default to 0
*/
@Option(names = "--exec-min", description = "min number of exec thread to use, default to 0", descriptionKey = "exec-min")
public int execMin = 0;

/**
* max number of execution thread to use, default to Integer.MAX_VALUE
*/
@Option(names = "--exec-max", description = "max number of exec thread to use, default to Integer.MAX_VALUE", descriptionKey = "exec-max")
public int execMax = Integer.MAX_VALUE;

/**
* max idle time for exec thread, default to 60
*/
@Option(names = "--exec-idle", description = "max idle time for exec thread in seconds, default to 60", descriptionKey = "exec-idle")
public long execIdle = 60L;

/**
* max time to keep idle keepalive connection, default to -1
*/
@Option(names = "--keep-alive-idle", description = "max time to keep idle keepalive connection, -1: infinite, 0: no keep alive, default to -1", descriptionKey = "keep-alive-idle")
public int keepAliveIdle = 2000;

protected final ServletContextImpl ctx;
protected final ServletManager servlets;
protected final EventManager events;

protected AbstractHttpServer() {
servlets = createServletManager();
events = createEventManager();
ctx = createContext();
}
public abstract class AbstractHttpServer extends NIOServerBuilder {
private Opt addr;
private Opt vhost;
private Opt execMin;
private Opt execMax;
private Opt execIdle;
private Opt keepAlive;

protected ServletContextImpl ctx;
protected ServletManager servlets;
protected EventManager events;

protected abstract ServletManager createServletManager();

protected abstract EventManager createEventManager();

protected abstract ServletContextImpl createContext();
protected abstract ServletContextImpl createContext(String vhost);

protected abstract ServletConfigImpl[] createServlets();

protected abstract FilterConfigImpl[] createFilters();

protected void loadInitializer() throws ServletException {
for (ServletContainerInitializer i : ServiceLoader.load(ServletContainerInitializer.class)) {
i.onStartup(null, ctx);
}
@Override
protected void beforeParse() {
addr = withOpt("addr").withCli(Option.builder("a").longOpt("addr").hasArg().desc("address to bind to").build()).withValue(":8080");
vhost = withOpt("vhost").withCli(Option.builder().longOpt("vhost").desc("public vhost seen by the servlet, default to the binded address").build());
execMin = withOpt("exec-min").withCli(Option.builder().longOpt("exec-min").desc("min number of exec thread to use").build()).withValue("0");
execMax = withOpt("exec-max").withCli(Option.builder().longOpt("exec-max").desc("max number of exec thread to use").build())
.withValue(Integer.toString(Integer.MAX_VALUE));
execIdle = withOpt("exec-idle").withCli(Option.builder().longOpt("exec-idle").desc("max idle time for exec thread in seconds").build()).withValue("60");
keepAlive = withOpt("exec-idle")
.withCli(Option.builder().longOpt("exec-idle").desc("max time to keep idle keepalive connection, -1: infinite, 0: no keep alive").build()).withValue("2000");
}

@Override
protected final void init() throws Exception {
AtomicInteger i = new AtomicInteger();
ExecutorService executor = new ThreadPoolExecutor(execMin, execMax, execIdle, TimeUnit.SECONDS, new SynchronousQueue<>(), r -> {
Thread t = new Thread(r, "exec-" + i.getAndIncrement());
t.setDaemon(true);
return t;
});
protected void process(NIOServer server, CommandLine cli) throws Exception {
InetSocketAddress address = parseAddr(cli, addr, "");
String value = cli.getOptionValue(vhost.name());
if (value == null)
value = address.getHostString();

handler = () -> new HttpConnection(executor, ctx, keepAliveIdle);
servlets = createServletManager();
events = createEventManager();
ctx = createContext(value);

loadInitializer();
servlets.initialize(ctx, createServlets(), createFilters());
events.fireContextInitialized(ctx);

AtomicInteger i = new AtomicInteger();
ExecutorService executor = new ThreadPoolExecutor(parseInt(cli, execMin, 0), parseInt(cli, execMax, 0), parseInt(cli, execIdle, 0), TimeUnit.SECONDS,
new SynchronousQueue<>(), r -> {
Thread t = new Thread(r, "exec-" + i.getAndIncrement());
t.setDaemon(true);
return t;
});
int keepAliveIdle = parseInt(cli, keepAlive, -1);
server.bind(address, () -> new HttpConnection(executor, ctx, keepAliveIdle));
}

@Override
protected final void destroy() {
events.fireContextDestroyed(ctx);
protected void loadInitializer() throws ServletException {
for (ServletContainerInitializer i : ServiceLoader.load(ServletContainerInitializer.class)) {
i.onStartup(null, ctx);
}
}

public void process(String[] arg) throws Exception {
NIOServer nioServer = build(arg);
try {
nioServer.start();
nioServer.await();
} finally {
nioServer.stop();
nioServer.await();
events.fireContextDestroyed(ctx);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,8 @@
package unknow.server.maven.servlet.builder;

import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.expr.AssignExpr;
import com.github.javaparser.ast.expr.BinaryExpr;
import com.github.javaparser.ast.expr.BinaryExpr.Operator;
import com.github.javaparser.ast.expr.ConditionalExpr;
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.ast.expr.NullLiteralExpr;
import com.github.javaparser.ast.expr.ObjectCreationExpr;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import com.github.javaparser.ast.stmt.IfStmt;
import com.github.javaparser.ast.stmt.ReturnStmt;

import unknow.server.http.servlet.ServletContextImpl;
Expand All @@ -31,13 +24,7 @@ public void add(BuilderContext ctx) {
TypeCache t = ctx.type();

ctx.self().addMethod("createContext", Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL).setType(t.getClass(ServletContextImpl.class))
.addMarkerAnnotation(Override.class).createBody()
.addStatement(new IfStmt(new BinaryExpr(new NameExpr("vhost"), new NullLiteralExpr(), Operator.EQUALS),
new ExpressionStmt(new AssignExpr(new NameExpr("vhost"),
new ConditionalExpr(new BinaryExpr(new NameExpr("address"), new NullLiteralExpr(), Operator.EQUALS), Utils.text("localhost"),
new NameExpr("address")),
AssignExpr.Operator.ASSIGN)),
null))
.addParameter(String.class, "vhost").addMarkerAnnotation(Override.class).createBody()
.addStatement(new ReturnStmt(new ObjectCreationExpr(null, t.getClass(ServletContextImpl.class),
Utils.list(Utils.text(ctx.descriptor().name), new NameExpr("vhost"), Utils.mapString(ctx.descriptor().param, t), Names.SERVLETS, Names.EVENTS,
new ObjectCreationExpr(null, t.getClass(ctx.sessionFactory()), Utils.list()), Utils.mapString(ctx.descriptor().localeMapping, t),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.ast.expr.ObjectCreationExpr;
import com.github.javaparser.ast.expr.TypeExpr;

import picocli.CommandLine;
import unknow.server.maven.TypeCache;
import unknow.server.maven.Utils;
import unknow.server.maven.servlet.Builder;
Expand All @@ -22,9 +20,7 @@ public class Main extends Builder {
@Override
public void add(BuilderContext ctx) {
TypeCache t = ctx.type();
ctx.self().addMethod("main", Modifier.Keyword.PUBLIC, Modifier.Keyword.STATIC)
.addParameter(String[].class, "arg")
.createBody()
.addStatement(new MethodCallExpr(new TypeExpr(t.getClass(System.class)), "exit").addArgument(new MethodCallExpr(new ObjectCreationExpr(null, t.getClass(CommandLine.class), Utils.list(new ObjectCreationExpr(null, t.getClass(ctx.self()), Utils.list()))), "execute").addArgument(new NameExpr("arg"))));
ctx.self().addMethod("main", Modifier.Keyword.PUBLIC, Modifier.Keyword.STATIC).addParameter(String[].class, "arg").addThrownException(t.getClass(Exception.class))
.createBody().addStatement(new MethodCallExpr(new ObjectCreationExpr(null, t.getClass(ctx.self()), Utils.list()), "process", Utils.list(new NameExpr("arg"))));
}
}
4 changes: 2 additions & 2 deletions unknow-server-nio/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>info.picocli</groupId>
<artifactId>picocli</artifactId>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,11 @@
import java.nio.channels.SelectionKey;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import unknow.server.util.pool.Pool;

/**
* the NIO Server
*
Expand All @@ -31,8 +26,6 @@ public class NIOServer extends NIOLoop {
/** the listener */
private final NIOServerListener listener;

private final Map<Function<Pool<NIOConnection>, ? extends NIOConnection>, Pool<NIOConnection>> pools;

/**
* create new Server
*
Expand All @@ -45,7 +38,6 @@ public NIOServer(NIOWorkers workers, NIOServerListener listener) throws IOExcept
super("NIOServer", 0);
this.workers = workers;
this.listener = listener == null ? NIOServerListener.NOP : listener;
this.pools = new IdentityHashMap<>();
}

/**
Expand Down
Loading

0 comments on commit 8f3ccb6

Please sign in to comment.