Skip to content

Commit 3c14368

Browse files
committed
Rename Renderer -> MessageEncoder
1 parent 8bc983d commit 3c14368

File tree

25 files changed

+153
-158
lines changed

25 files changed

+153
-158
lines changed

docs/asciidoc/body.adoc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,19 @@ Response body is generated from `handler` function:
160160
<3> Set the `date` header
161161
<4> Send a `Response` string to the client
162162

163-
==== Renderer
163+
==== Message Encoder
164164

165-
Response rendering is achieved using the javadoc:Renderer[] functional interface.
165+
Response enconding is achieved using the javadoc:MessageEncoder[] functional interface.
166166

167167
[source, java]
168168
----
169-
public interface Renderer {
169+
public interface MessageEncoder {
170170
171-
byte[] render(@Nonnull Context ctx, @Nonnull Object value) throws Exception;
171+
byte[] encode(@Nonnull Context ctx, @Nonnull Object value) throws Exception;
172172
}
173173
----
174174

175-
Renderer has a single `render` method that accepts two input arguments: `(context, result)` and
175+
MessageEncoder has a single `encode` method that accepts two input arguments: `(context, result)` and
176176
produces a result.
177177

178178
.JSON example:
@@ -181,7 +181,7 @@ produces a result.
181181
{
182182
FavoriteJson lib = new FavoriteJson(); // <1>
183183
184-
renderer(MediaType.json, (ctx, result) -> { // <2>
184+
encoder(MediaType.json, (ctx, result) -> { // <2>
185185
186186
String json = lib.toJson(result); // <3>
187187
@@ -203,7 +203,7 @@ produces a result.
203203
{
204204
val lib = FavoriteJson() // <1>
205205
206-
renderer(MediaType.json, { ctx, result -> // <2>
206+
encoder(MediaType.json, { ctx, result -> // <2>
207207
208208
val json = lib.toJson(result) // <3>
209209
@@ -229,7 +229,7 @@ produces a result.
229229
[TIP]
230230
====
231231
232-
Jooby comes with a `json` renderer built on top of https://github.com/FasterXML/jackson-databind[Jackson]:
232+
Jooby comes with a `json` encoder built on top of https://github.com/FasterXML/jackson-databind[Jackson]:
233233
234234
[dependency, artifactId="jooby-jackson"]
235235
.

docs/asciidoc/responses.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This chapter covers some special response types, like `raw responses`, `streamin
44

55
=== Raw
66

7-
Raw responses are NOT processed by a <<renderer, Renderer>>. These response types are considered `raw`:
7+
Raw responses are NOT processed by a <<encoder, Renderer>>. These response types are considered `raw`:
88

99
- String/CharSequence
1010
- byte[]
@@ -35,7 +35,7 @@ Raw responses are NOT processed by a <<renderer, Renderer>>. These response type
3535
}
3636
----
3737

38-
No matter if there is a JSON renderer installed, a raw response is always send directly to client.
38+
No matter if there is a JSON encoder installed, a raw response is always send directly to client.
3939

4040
=== Streaming / Chunked
4141

jooby/src/main/java/io/jooby/Context.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,8 +1064,8 @@ default long getRequestLength() {
10641064
default @Nonnull Context render(@Nonnull Object value) {
10651065
try {
10661066
Route route = getRoute();
1067-
Renderer renderer = route.getRenderer();
1068-
byte[] bytes = renderer.render(this, value);
1067+
MessageEncoder encoder = route.getEncoder();
1068+
byte[] bytes = encoder.encode(this, value);
10691069
send(bytes);
10701070
return this;
10711071
} catch (Exception x) {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ public <T> Jooby mvc(@Nonnull Class<T> router, @Nonnull Provider<T> provider) {
288288
return this;
289289
}
290290

291-
@Nonnull @Override public Jooby renderer(@Nonnull Renderer renderer) {
292-
router.renderer(renderer);
291+
@Nonnull @Override public Jooby renderer(@Nonnull MessageEncoder encoder) {
292+
router.renderer(encoder);
293293
return this;
294294
}
295295

@@ -300,8 +300,8 @@ public <T> Jooby mvc(@Nonnull Class<T> router, @Nonnull Provider<T> provider) {
300300
}
301301

302302
@Nonnull @Override
303-
public Jooby renderer(@Nonnull MediaType contentType, @Nonnull Renderer renderer) {
304-
router.renderer(contentType, renderer);
303+
public Jooby renderer(@Nonnull MediaType contentType, @Nonnull MessageEncoder encoder) {
304+
router.renderer(contentType, encoder);
305305
return this;
306306
}
307307

jooby/src/main/java/io/jooby/Renderer.java renamed to jooby/src/main/java/io/jooby/MessageEncoder.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@
1414
* @author edgar
1515
* @since 2.0.0
1616
*/
17-
public interface Renderer {
17+
public interface MessageEncoder {
1818

1919
/** To string renderer. */
20-
Renderer TO_STRING = (ctx, value) -> {
20+
MessageEncoder TO_STRING = (ctx, value) -> {
2121
if (ctx.accept(ctx.getResponseType())) {
2222
return value.toString().getBytes(StandardCharsets.UTF_8);
2323
}
2424
throw new StatusCodeException(StatusCode.NOT_ACCEPTABLE);
2525
};
2626

2727
/**
28-
* Renderer a value into a byte array or <code>null</code> if given object isn't supported it.
28+
* MessageEncoder a value into a byte array or <code>null</code> if given object isn't supported it.
2929
*
3030
* @param ctx Web context.
3131
* @param value Value to render.
3232
* @return Value as byte array or <code>null</code> if given object isn't supported it.
3333
* @throws Exception If something goes wrong.
3434
*/
35-
@Nonnull byte[] render(@Nonnull Context ctx, @Nonnull Object value) throws Exception;
35+
@Nonnull byte[] encode(@Nonnull Context ctx, @Nonnull Object value) throws Exception;
3636

3737
/**
3838
* Execute this renderer only if the <code>Accept</code> header matches the content-type
@@ -41,10 +41,10 @@ public interface Renderer {
4141
* @param contentType Mediatype to test.
4242
* @return A new renderer with accept header matching.
4343
*/
44-
@Nonnull default Renderer accept(@Nonnull MediaType contentType) {
44+
@Nonnull default MessageEncoder accept(@Nonnull MediaType contentType) {
4545
return (ctx, value) -> {
4646
if (ctx.accept(contentType)) {
47-
return render(ctx, value);
47+
return encode(ctx, value);
4848
}
4949
return null;
5050
};

jooby/src/main/java/io/jooby/Route.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ public interface Handler extends Serializable {
256256

257257
private Handler pipeline;
258258

259-
private Renderer renderer;
259+
private MessageEncoder encoder;
260260

261261
private Type returnType;
262262

@@ -433,22 +433,22 @@ public Route(@Nonnull String method, @Nonnull String pattern, @Nonnull Handler h
433433
}
434434

435435
/**
436-
* Route renderer.
436+
* Route encoder.
437437
*
438-
* @return Route renderer.
438+
* @return Route encoder.
439439
*/
440-
public @Nonnull Renderer getRenderer() {
441-
return renderer;
440+
public @Nonnull MessageEncoder getEncoder() {
441+
return encoder;
442442
}
443443

444444
/**
445-
* Set renderer.
445+
* Set encoder.
446446
*
447-
* @param renderer Renderer.
447+
* @param encoder MessageEncoder.
448448
* @return This route.
449449
*/
450-
public @Nonnull Route setRenderer(@Nonnull Renderer renderer) {
451-
this.renderer = renderer;
450+
public @Nonnull Route setEncoder(@Nonnull MessageEncoder encoder) {
451+
this.encoder = encoder;
452452
return this;
453453
}
454454

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,21 +223,21 @@ interface Match {
223223
@Nonnull List<Route> getRoutes();
224224

225225
/**
226-
* Register a route response renderer.
226+
* Register a route response encoder.
227227
*
228-
* @param renderer Renderer instance.
228+
* @param encoder MessageEncoder instance.
229229
* @return This router.
230230
*/
231-
@Nonnull Router renderer(@Nonnull Renderer renderer);
231+
@Nonnull Router renderer(@Nonnull MessageEncoder encoder);
232232

233233
/**
234-
* Register a route response renderer.
234+
* Register a route response encoder.
235235
*
236236
* @param contentType Accept header should matches the content-type.
237-
* @param renderer Renderer instance.
237+
* @param encoder MessageEncoder instance.
238238
* @return This router.
239239
*/
240-
@Nonnull Router renderer(@Nonnull MediaType contentType, @Nonnull Renderer renderer);
240+
@Nonnull Router renderer(@Nonnull MediaType contentType, @Nonnull MessageEncoder encoder);
241241

242242
/**
243243
* Application temporary directory.

jooby/src/main/java/io/jooby/TemplateEngine.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* @since 2.0.0
1515
* @author edgar
1616
*/
17-
public interface TemplateEngine extends Renderer {
17+
public interface TemplateEngine extends MessageEncoder {
1818

1919
/** Name of application property that defines the template path. */
2020
String TEMPLATE_PATH = "templates.path";
@@ -30,11 +30,11 @@ public interface TemplateEngine extends Renderer {
3030
* @return Rendered template.
3131
* @throws Exception If something goes wrong.
3232
*/
33-
String apply(Context ctx, ModelAndView modelAndView) throws Exception;
33+
String render(Context ctx, ModelAndView modelAndView) throws Exception;
3434

35-
@Override default byte[] render(@Nonnull Context ctx, @Nonnull Object value) throws Exception {
35+
@Override default byte[] encode(@Nonnull Context ctx, @Nonnull Object value) throws Exception {
3636
ctx.setDefaultResponseType(MediaType.html);
37-
String output = apply(ctx, (ModelAndView) value);
37+
String output = render(ctx, (ModelAndView) value);
3838
return output.getBytes(StandardCharsets.UTF_8);
3939
}
4040

jooby/src/main/java/io/jooby/internal/$Chi.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
package io.jooby.internal;
77

88
import io.jooby.Context;
9-
import io.jooby.Renderer;
9+
import io.jooby.MessageEncoder;
1010
import io.jooby.Route;
11-
import io.jooby.Router;
1211

1312
import java.util.Arrays;
1413
import java.util.HashMap;
@@ -632,7 +631,7 @@ public void insert(Route route) {
632631
root.destroy();
633632
}
634633

635-
public RouterMatch find(Context context, String path, Renderer renderer, List<RadixTree> more) {
634+
public RouterMatch find(Context context, String path, MessageEncoder encoder, List<RadixTree> more) {
636635
String method = context.getMethod();
637636
RouterMatch result = new RouterMatch();
638637
Route route = root.findRoute(result, method, path);
@@ -642,12 +641,12 @@ public RouterMatch find(Context context, String path, Renderer renderer, List<Ra
642641
if (more != null) {
643642
// expand search
644643
for (RadixTree tree : more) {
645-
RouterMatch match = tree.find(context, path, renderer, null);
644+
RouterMatch match = tree.find(context, path, encoder, null);
646645
if (match.matches) {
647646
return match;
648647
}
649648
}
650649
}
651-
return result.missing(method, path, renderer);
650+
return result.missing(method, path, encoder);
652651
}
653652
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package io.jooby.internal;
7+
8+
import io.jooby.Context;
9+
import io.jooby.MessageEncoder;
10+
import io.jooby.ModelAndView;
11+
import io.jooby.TemplateEngine;
12+
13+
import javax.annotation.Nonnull;
14+
import java.util.Iterator;
15+
import java.util.LinkedList;
16+
17+
public class CompositeMessageEncoder implements MessageEncoder {
18+
19+
private LinkedList<MessageEncoder> list = new LinkedList<>();
20+
21+
private MessageEncoder templateEngine;
22+
23+
public CompositeMessageEncoder() {
24+
list.add(MessageEncoder.TO_STRING);
25+
}
26+
27+
public CompositeMessageEncoder add(MessageEncoder encoder) {
28+
if (encoder instanceof TemplateEngine) {
29+
templateEngine = computeRenderer(templateEngine, encoder);
30+
} else {
31+
list.addFirst(encoder);
32+
}
33+
return this;
34+
}
35+
36+
private MessageEncoder computeRenderer(MessageEncoder it, MessageEncoder next) {
37+
if (it == null) {
38+
return next;
39+
} else if (it instanceof CompositeMessageEncoder) {
40+
((CompositeMessageEncoder) it).list.addFirst(next);
41+
return it;
42+
} else {
43+
CompositeMessageEncoder composite = new CompositeMessageEncoder();
44+
composite.list.addFirst(it);
45+
composite.list.addFirst(next);
46+
return composite;
47+
}
48+
}
49+
50+
@Override public byte[] encode(@Nonnull Context ctx, @Nonnull Object value) throws Exception {
51+
if (value instanceof ModelAndView) {
52+
return templateEngine.encode(ctx, value);
53+
} else {
54+
Iterator<MessageEncoder> iterator = list.iterator();
55+
/** NOTE: looks like an infinite loop but there is a default renderer at the end of iterator. */
56+
byte[] result = null;
57+
while (result == null) {
58+
MessageEncoder next = iterator.next();
59+
result = next.encode(ctx, value);
60+
}
61+
return result;
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)