>> handlerToAsyncHandler(Ha
};
}
+ /**
+ * Bridges a legacy callback-based service method (using {@link Either}) into a Vert.x {@link Future}.
+ *
+ * Many service methods in this codebase accept a {@code Handler>} as their last
+ * argument, where a {@link Either.Left} signals failure (with an error message) and a
+ * {@link Either.Right} signals success (with the result value). This utility wraps such a call
+ * into a {@link Future} so it can be composed with other async operations.
+ *
+ * {@code
+ * // Given a service method:
+ * // void findUser(String id, Handler> handler)
+ *
+ * Utils.eitherToFuture(handler -> userService.findUser(userId, handler))
+ * .compose(user -> Utils.eitherToFuture(handler -> roleService.getRoles(user.getString("id"), handler)))
+ * .onSuccess(roles -> renderJson(request, roles))
+ * .onFailure(err -> renderError(request, err));
+ * }
+ *
+ * @param call a consumer that invokes the legacy service method, passing along the provided handler
+ * @param the type of the success value
+ * @return a {@link Future} that completes with the right value on success, or fails with the left message on error
+ */
+ public static Future eitherToFuture(Consumer>> call) {
+ Promise promise = Promise.promise();
+ call.accept(res -> {
+ if (res.isRight()) promise.complete(res.right().getValue());
+ else promise.fail(res.left().getValue());
+ });
+ return promise.future();
+ }
+
}
diff --git a/src/main/java/fr/wseduc/webutils/http/BaseController.java b/src/main/java/fr/wseduc/webutils/http/BaseController.java
index 4118bad5..1d28cc45 100644
--- a/src/main/java/fr/wseduc/webutils/http/BaseController.java
+++ b/src/main/java/fr/wseduc/webutils/http/BaseController.java
@@ -17,7 +17,6 @@
package fr.wseduc.webutils.http;
import fr.wseduc.webutils.Controller;
-import fr.wseduc.webutils.Server;
import fr.wseduc.webutils.security.SecuredAction;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
@@ -37,7 +36,7 @@ public BaseController() {
this(null, null, null, null);
}
- public void init(Vertx vertx, JsonObject config, RouteMatcher rm,
+ public void init(Vertx vertx, JsonObject config, RouteMatcher rm,
Map securedActions) {
super.init(vertx, config, rm, securedActions);
}
diff --git a/src/main/java/fr/wseduc/webutils/template/FileTemplateProcessor.java b/src/main/java/fr/wseduc/webutils/template/FileTemplateProcessor.java
index 9bd2d871..c2a44017 100644
--- a/src/main/java/fr/wseduc/webutils/template/FileTemplateProcessor.java
+++ b/src/main/java/fr/wseduc/webutils/template/FileTemplateProcessor.java
@@ -82,17 +82,23 @@ public void processTemplate(String resourceName, JsonObject params, Reader r, fi
this.processTemplateToWriter(resourceName, params, handler);
}
+ public void processTemplate(String resourceName, JsonObject params, Reader r, Map lambdas, final Handler handler)
+ {
+ if(r != null)
+ this.processTemplate(compiler.compile(r), params, lambdas, handler);
+ else
+ this.processTemplateToWriter(resourceName, params, lambdas, handler);
+ }
+
@Override
protected void getTemplate(String resourceName, final Handler handler)
{
String path = this.templateFolder + resourceName;
final String p = absolutePath(path);
- if (this.useCache == true)
- {
+ if (this.useCache) {
Template cacheEntry = cache.get(p);
- if(cacheEntry != null)
- {
+ if(cacheEntry != null) {
handler.handle(cacheEntry);
return;
}
diff --git a/src/main/java/fr/wseduc/webutils/template/TemplateProcessor.java b/src/main/java/fr/wseduc/webutils/template/TemplateProcessor.java
index 8f5176f2..92f15834 100644
--- a/src/main/java/fr/wseduc/webutils/template/TemplateProcessor.java
+++ b/src/main/java/fr/wseduc/webutils/template/TemplateProcessor.java
@@ -93,14 +93,17 @@ public void handle(Writer w)
public void processTemplateToWriter(String templateString, JsonObject params, final Handler handler)
{
- this.getTemplate(templateString, new Handler()
- {
- @Override
- public void handle(Template t)
- {
- processTemplate(t, params, handler);
- }
- });
+ this.getTemplate(templateString, t -> processTemplate(t, params, handler));
+ }
+
+ public void processTemplate(String templateString, JsonObject params, Map lambdas, final Handler handler)
+ {
+ this.processTemplateToWriter(templateString, params, lambdas, w -> handler.handle(w == null ? null : w.toString()));
+ }
+
+ public void processTemplateToWriter(String templateString, JsonObject params, Map lambdas, final Handler handler)
+ {
+ this.getTemplate(templateString, t -> processTemplate(t, params, lambdas, handler));
}
protected void processTemplate(Template t, JsonObject params, final Handler handler)
@@ -127,6 +130,26 @@ protected void processTemplate(Template t, JsonObject params, final Handler lambdas, final Handler handler)
+ {
+ final JsonObject ctxParams = (params == null) ? new JsonObject() : params.copy();
+ final Map ctx = JsonUtils.convertMap(ctxParams);
+ ctx.putAll(lambdas);
+
+ if (t != null) {
+ try {
+ Writer writer = new StringWriter();
+ t.execute(ctx, writer);
+ handler.handle(writer);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ handler.handle(null);
+ }
+ } else {
+ handler.handle(null);
+ }
+ }
+
protected void getTemplate(String templateString, final Handler handler)
{
handler.handle(compiler.compile(templateString));