Skip to content

Commit 9669a5e

Browse files
committed
complement on(env ...) callback with an orElse option fix #380
1 parent 8cf945c commit 9669a5e

2 files changed

Lines changed: 118 additions & 6 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.jooby.issues;
2+
3+
import org.jooby.test.ServerFeature;
4+
import org.junit.Test;
5+
6+
import com.typesafe.config.ConfigFactory;
7+
import com.typesafe.config.ConfigValueFactory;
8+
9+
public class Issue380 extends ServerFeature {
10+
11+
{
12+
use(ConfigFactory.empty().withValue("application.env", ConfigValueFactory.fromAnyRef("prod")));
13+
14+
on("dev", () -> {
15+
get("/", () -> "dev");
16+
}).orElse(() -> {
17+
get("/", () -> "prod");
18+
});
19+
}
20+
21+
@Test
22+
public void orElseEnvPredicate() throws Exception {
23+
request()
24+
.get("/")
25+
.expect("prod");
26+
}
27+
28+
}

jooby/src/main/java/org/jooby/Jooby.java

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,54 @@
399399
*/
400400
public class Jooby implements Routes, LifeCycle, Registry {
401401

402+
/**
403+
* <pre>{@code
404+
* {
405+
* on("dev", () -> {
406+
* // run something on dev
407+
* }).orElse(() -> {
408+
* // run something on prod
409+
* });
410+
* }
411+
* }</pre>
412+
*
413+
*/
414+
public interface EnvPredicate {
415+
416+
/**
417+
* <pre>{@code
418+
* {
419+
* on("dev", () -> {
420+
* // run something on dev
421+
* }).orElse(() -> {
422+
* // run something on prod
423+
* });
424+
* }
425+
* }</pre>
426+
*
427+
* @param callback Env callback.
428+
*/
429+
default void orElse(final Runnable callback) {
430+
orElse(conf -> callback.run());
431+
}
432+
433+
/**
434+
* <pre>{@code
435+
* {
436+
* on("dev", () -> {
437+
* // run something on dev
438+
* }).orElse(conf -> {
439+
* // run something on prod
440+
* });
441+
* }
442+
* }</pre>
443+
*
444+
* @param callback Env callback.
445+
*/
446+
void orElse(Consumer<Config> callback);
447+
448+
}
449+
402450
/**
403451
* A module can publish or produces: {@link Route.Definition routes}, {@link Parser},
404452
* {@link Renderer}, and any other application specific service or contract of your choice.
@@ -765,11 +813,23 @@ public Jooby onStop(final CheckedConsumer<Registry> callback) {
765813
* }
766814
* </pre>
767815
*
816+
* There is an else clause which is the opposite version of the env predicate:
817+
*
818+
* <pre>
819+
* {
820+
* on("dev", () {@literal ->} {
821+
* use(new DevModule());
822+
* }).orElse(() {@literal ->} {
823+
* use(new RealModule());
824+
* });
825+
* }
826+
* </pre>
827+
*
768828
* @param env Environment where we want to run the callback.
769829
* @param callback An env callback.
770830
* @return This jooby instance.
771831
*/
772-
public Jooby on(final String env, final Runnable callback) {
832+
public EnvPredicate on(final String env, final Runnable callback) {
773833
requireNonNull(env, "Env is required.");
774834
return on(envpredicate(env), callback);
775835
}
@@ -785,11 +845,23 @@ public Jooby on(final String env, final Runnable callback) {
785845
* }
786846
* </pre>
787847
*
848+
* There is an else clause which is the opposite version of the env predicate:
849+
*
850+
* <pre>
851+
* {
852+
* on("dev", conf {@literal ->} {
853+
* use(new DevModule());
854+
* }).orElse(conf {@literal ->} {
855+
* use(new RealModule());
856+
* });
857+
* }
858+
* </pre>
859+
*
788860
* @param env Environment where we want to run the callback.
789861
* @param callback An env callback.
790862
* @return This jooby instance.
791863
*/
792-
public Jooby on(final String env, final Consumer<Config> callback) {
864+
public EnvPredicate on(final String env, final Consumer<Config> callback) {
793865
requireNonNull(env, "Env is required.");
794866
return on(envpredicate(env), callback);
795867
}
@@ -805,11 +877,23 @@ public Jooby on(final String env, final Consumer<Config> callback) {
805877
* }
806878
* </pre>
807879
*
880+
* There is an else clause which is the opposite version of the env predicate:
881+
*
882+
* <pre>
883+
* {
884+
* on(env {@literal ->} env.equals("dev"), () {@literal ->} {
885+
* use(new DevModule());
886+
* }).orElse(() {@literal ->} {
887+
* use(new RealModule());
888+
* });
889+
* }
890+
* </pre>
891+
*
808892
* @param predicate Predicate to check the environment.
809893
* @param callback An env callback.
810894
* @return This jooby instance.
811895
*/
812-
public Jooby on(final Predicate<String> predicate, final Runnable callback) {
896+
public EnvPredicate on(final Predicate<String> predicate, final Runnable callback) {
813897
requireNonNull(predicate, "Predicate is required.");
814898
requireNonNull(callback, "Callback is required.");
815899

@@ -821,7 +905,7 @@ public Jooby on(final Predicate<String> predicate, final Runnable callback) {
821905
*
822906
* <pre>
823907
* {
824-
* on("dev", "test", () {@literal ->} {
908+
* on(env {@literal ->} env.equals("dev"), conf {@literal ->} {
825909
* use(new DevModule());
826910
* });
827911
* }
@@ -831,12 +915,12 @@ public Jooby on(final Predicate<String> predicate, final Runnable callback) {
831915
* @param callback An env callback.
832916
* @return This jooby instance.
833917
*/
834-
public Jooby on(final Predicate<String> predicate, final Consumer<Config> callback) {
918+
public EnvPredicate on(final Predicate<String> predicate, final Consumer<Config> callback) {
835919
requireNonNull(predicate, "Predicate is required.");
836920
requireNonNull(callback, "Callback is required.");
837921
this.bag.add(new EnvDep(predicate, callback));
838922

839-
return this;
923+
return otherwise -> this.bag.add(new EnvDep(predicate.negate(), otherwise));
840924
}
841925

842926
/**

0 commit comments

Comments
 (0)