Skip to content

Commit 76d391f

Browse files
committed
output api: make sure outputfactory is accessible while creating the application
1 parent 2e4e193 commit 76d391f

11 files changed

Lines changed: 46 additions & 122 deletions

File tree

jooby/src/main/java/io/jooby/Jooby.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ public class Jooby implements Router, Registry {
8787

8888
private static Jooby owner;
8989
private static ExecutionMode BOOT_EXECUTION_MODE = ExecutionMode.DEFAULT;
90+
private static Server BOOT_SERVER;
9091

9192
private RouterImpl router;
9293

@@ -132,6 +133,14 @@ public Jooby() {
132133
startingCallbacks = new ArrayList<>();
133134
readyCallbacks = new ArrayList<>();
134135
lateExtensions = new ArrayList<>();
136+
server = BOOT_SERVER;
137+
if (server != null) {
138+
router.setOutputFactory(server.getOutputFactory());
139+
} else {
140+
// NOTE: fallback to default, this is required for direct instance creation of class
141+
// app bootstrap always ensures server instance.
142+
router.setOutputFactory(BufferedOutputFactory.create());
143+
}
135144
} else {
136145
copyState(owner, this);
137146
}
@@ -857,12 +866,6 @@ public BufferedOutputFactory getOutputFactory() {
857866
return router.getOutputFactory();
858867
}
859868

860-
@NonNull @Override
861-
public Jooby setOutputFactory(@NonNull BufferedOutputFactory outputFactory) {
862-
router.setOutputFactory(outputFactory);
863-
return this;
864-
}
865-
866869
@NonNull @Override
867870
public Jooby setHiddenMethod(@NonNull Function<Context, Optional<String>> provider) {
868871
router.setHiddenMethod(provider);
@@ -1210,8 +1213,7 @@ public static void runApp(
12101213
var apps = new ArrayList<Jooby>();
12111214
var targetServer = server.getLoggerOff().isEmpty() ? server : MutedServer.mute(server);
12121215
for (var factory : provider) {
1213-
var app = createApp(executionMode, factory);
1214-
app.server = targetServer;
1216+
var app = createApp(server, executionMode, factory);
12151217
/*
12161218
When running a single app instance, there is no issue with server options, when multiple
12171219
apps set options a warning will be printed
@@ -1248,7 +1250,9 @@ public static void runApp(
12481250
* @return Application.
12491251
*/
12501252
public static Jooby createApp(
1251-
@NonNull ExecutionMode executionMode, @NonNull Supplier<Jooby> provider) {
1253+
@NonNull Server server,
1254+
@NonNull ExecutionMode executionMode,
1255+
@NonNull Supplier<Jooby> provider) {
12521256
configurePackage(provider.getClass().getPackage());
12531257
/* Find application.env: */
12541258
String logfile =
@@ -1261,7 +1265,8 @@ public static Jooby createApp(
12611265

12621266
Jooby app;
12631267
try {
1264-
BOOT_EXECUTION_MODE = executionMode;
1268+
Jooby.BOOT_SERVER = server;
1269+
Jooby.BOOT_EXECUTION_MODE = executionMode;
12651270
app = provider.get();
12661271
} catch (Throwable t) {
12671272
LoggerFactory.getLogger(Jooby.class)
@@ -1271,7 +1276,8 @@ public static Jooby createApp(
12711276
? (StartupException) t
12721277
: new StartupException("Application initialization resulted in exception", t);
12731278
} finally {
1274-
BOOT_EXECUTION_MODE = ExecutionMode.DEFAULT;
1279+
Jooby.BOOT_EXECUTION_MODE = executionMode;
1280+
Jooby.BOOT_SERVER = null;
12751281
}
12761282

12771283
return app;
@@ -1426,5 +1432,6 @@ private static void copyState(Jooby source, Jooby dest) {
14261432
dest.readyCallbacks = source.readyCallbacks;
14271433
dest.startingCallbacks = source.startingCallbacks;
14281434
dest.stopCallbacks = source.stopCallbacks;
1435+
dest.server = source.server;
14291436
}
14301437
}

jooby/src/main/java/io/jooby/Router.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,8 +504,6 @@ default Object execute(@NonNull Context context) {
504504

505505
@NonNull BufferedOutputFactory getOutputFactory();
506506

507-
@NonNull Router setOutputFactory(@NonNull BufferedOutputFactory outputFactory);
508-
509507
/**
510508
* Attach a filter to the route pipeline.
511509
*

jooby/src/main/java/io/jooby/Server.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import edu.umd.cs.findbugs.annotations.NonNull;
3030
import edu.umd.cs.findbugs.annotations.Nullable;
31+
import io.jooby.buffer.BufferedOutputFactory;
3132
import io.jooby.exception.StartupException;
3233
import io.jooby.internal.MutedServer;
3334

@@ -158,6 +159,8 @@ public Server setOptions(@NonNull ServerOptions options) {
158159
protected abstract ServerOptions defaultOptions();
159160
}
160161

162+
@NonNull BufferedOutputFactory getOutputFactory();
163+
161164
/**
162165
* Set server options. This method should be called once, calling this method multiple times will
163166
* print a warning.

jooby/src/main/java/io/jooby/buffer/ByteBufferOutputFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.nio.ByteBuffer;
99

1010
import edu.umd.cs.findbugs.annotations.NonNull;
11-
import io.jooby.internal.buffer.ByteArrayWrappedOutput;
1211
import io.jooby.internal.buffer.ByteBufferOutput;
1312
import io.jooby.internal.buffer.ByteBufferWrappedOutput;
1413
import io.jooby.internal.buffer.CompsiteByteBufferOutput;
@@ -54,7 +53,7 @@ public BufferedOutput wrap(@NonNull ByteBuffer buffer) {
5453

5554
@Override
5655
public BufferedOutput wrap(@NonNull byte[] bytes) {
57-
return new ByteArrayWrappedOutput(bytes);
56+
return new ByteBufferWrappedOutput(ByteBuffer.wrap(bytes));
5857
}
5958

6059
@Override

jooby/src/main/java/io/jooby/internal/MutedServer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.jooby.LoggingService;
1717
import io.jooby.Server;
1818
import io.jooby.ServerOptions;
19+
import io.jooby.buffer.BufferedOutputFactory;
1920

2021
public class MutedServer implements Server {
2122
private Server delegate;
@@ -30,6 +31,11 @@ private MutedServer(Server server, LoggingService loggingService, List<String> m
3031
this.mute = mute;
3132
}
3233

34+
@NonNull @Override
35+
public BufferedOutputFactory getOutputFactory() {
36+
return delegate.getOutputFactory();
37+
}
38+
3339
/**
3440
* Muted a server when need it.
3541
*

jooby/src/main/java/io/jooby/internal/RouterImpl.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public Stack executor(Executor executor) {
170170

171171
private ValueFactory valueFactory = new ValueFactory();
172172

173-
private BufferedOutputFactory outputFactory = BufferedOutputFactory.create();
173+
private BufferedOutputFactory outputFactory;
174174

175175
public RouterImpl() {
176176
stack.addLast(new Stack(chi, null));
@@ -436,10 +436,8 @@ public BufferedOutputFactory getOutputFactory() {
436436
return outputFactory;
437437
}
438438

439-
@NonNull @Override
440-
public Router setOutputFactory(@NonNull BufferedOutputFactory outputFactory) {
439+
public void setOutputFactory(@NonNull BufferedOutputFactory outputFactory) {
441440
this.outputFactory = outputFactory;
442-
return this;
443441
}
444442

445443
@NonNull @Override

jooby/src/main/java/io/jooby/internal/buffer/ByteArrayWrappedOutput.java

Lines changed: 0 additions & 73 deletions
This file was deleted.

jooby/src/test/java/io/jooby/Issue3653.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,19 @@
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
1515

16+
import io.jooby.buffer.BufferedOutputFactory;
17+
1618
public class Issue3653 {
1719

1820
private static final ServerOptions defaultOptions = new ServerOptions();
1921

2022
private static class TestServer extends Server.Base {
2123

24+
@NotNull @Override
25+
public BufferedOutputFactory getOutputFactory() {
26+
return null;
27+
}
28+
2229
@Override
2330
protected ServerOptions defaultOptions() {
2431
return defaultOptions;

modules/jooby-kotlin/src/test/kotlin/io/jooby/kt/KotlinIdiomTest.kt

Lines changed: 0 additions & 21 deletions
This file was deleted.

modules/jooby-netty/src/main/java/io/jooby/internal/netty/NettyOutputFactory.java renamed to modules/jooby-netty/src/main/java/io/jooby/internal/netty/NettyBufferedOutputFactory.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import io.netty.buffer.Unpooled;
1717
import io.netty.util.ResourceLeakDetector;
1818

19-
public class NettyOutputFactory implements BufferedOutputFactory {
19+
public class NettyBufferedOutputFactory implements BufferedOutputFactory {
2020
private static final String LEAK_DETECTION = "io.netty.leakDetection.level";
2121

2222
static {
@@ -30,7 +30,7 @@ public class NettyOutputFactory implements BufferedOutputFactory {
3030
private final ByteBufAllocator allocator;
3131
private BufferOptions options;
3232

33-
public NettyOutputFactory(ByteBufAllocator allocator, BufferOptions options) {
33+
public NettyBufferedOutputFactory(ByteBufAllocator allocator, BufferOptions options) {
3434
this.allocator = allocator;
3535
this.options = options;
3636
}
@@ -58,22 +58,22 @@ public BufferedOutputFactory setOptions(BufferOptions options) {
5858

5959
@Override
6060
@NonNull public BufferedOutput wrap(@NonNull ByteBuffer buffer) {
61-
return new NettyWrappedOutput(Unpooled.wrappedBuffer(buffer));
61+
return new NettyByteBufferWrappedOutput(buffer);
6262
}
6363

6464
@Override
6565
public BufferedOutput wrap(@NonNull String value, @NonNull Charset charset) {
66-
return new NettyWrappedOutput(Unpooled.wrappedBuffer(value.getBytes(charset)));
66+
return new NettyBufferedOutput(Unpooled.wrappedBuffer(value.getBytes(charset)));
6767
}
6868

6969
@Override
7070
@NonNull public BufferedOutput wrap(@NonNull byte[] bytes) {
71-
return new NettyWrappedOutput(Unpooled.wrappedBuffer(bytes));
71+
return new NettyByteArrayWrappedOutput(bytes, 0, bytes.length);
7272
}
7373

7474
@Override
7575
@NonNull public BufferedOutput wrap(@NonNull byte[] bytes, int offset, int length) {
76-
return new NettyWrappedOutput(Unpooled.wrappedBuffer(bytes, offset, length));
76+
return new NettyByteArrayWrappedOutput(bytes, 0, bytes.length);
7777
}
7878

7979
@Override

0 commit comments

Comments
 (0)