Skip to content

Commit

Permalink
Command-line shortcuts for simple SQL-based handlers.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Sep 23, 2016
1 parent db59d36 commit eb1ffd4
Show file tree
Hide file tree
Showing 8 changed files with 138 additions and 5 deletions.
2 changes: 1 addition & 1 deletion docker-tests/output/admin-service-foo.txt
Expand Up @@ -20,5 +20,5 @@ Exception in thread "main" java.lang.IllegalArgumentException: Unknown service:
at org.rapidoid.setup.ServiceBootstrap.run(ServiceBootstrap.java:39)
at org.rapidoid.setup.AppBootstrap.services(AppBootstrap.java:136)
at org.rapidoid.setup.App.boot(App.java:124)
at org.rapidoid.setup.App.bootstrap(App.java:98)
at org.rapidoid.setup.App.bootstrap(App.java:103)
at org.rapidoid.standalone.Main.main(Main.java:35)
2 changes: 1 addition & 1 deletion docker-tests/output/app-service-foo.txt
Expand Up @@ -20,5 +20,5 @@ Exception in thread "main" java.lang.IllegalArgumentException: Unknown service:
at org.rapidoid.setup.ServiceBootstrap.run(ServiceBootstrap.java:39)
at org.rapidoid.setup.AppBootstrap.services(AppBootstrap.java:136)
at org.rapidoid.setup.App.boot(App.java:124)
at org.rapidoid.setup.App.bootstrap(App.java:98)
at org.rapidoid.setup.App.bootstrap(App.java:103)
at org.rapidoid.standalone.Main.main(Main.java:35)
Expand Up @@ -58,6 +58,7 @@ public Config map(String name) throws Exception {
public static final Config ADMIN = section("admin");
public static final Config TOKEN = section("token");
public static final Config PROXY = section("proxy");
public static final Config SQL = section("sql");

static void applyConfig(Config config) {

Expand Down
4 changes: 4 additions & 0 deletions rapidoid-commons/src/main/java/org/rapidoid/util/Msc.java
Expand Up @@ -1121,6 +1121,10 @@ private static void processSpecialArg(Map<String, Object> arguments, String arg)
left = "proxy." + left;
break;

case "<=":
left = "sql." + left;
break;

default:
throw U.rte("Argument operator not supported: " + sep);
}
Expand Down
54 changes: 51 additions & 3 deletions rapidoid-http-server/src/main/java/org/rapidoid/setup/App.java
Expand Up @@ -28,6 +28,10 @@
import org.rapidoid.config.Conf;
import org.rapidoid.config.ConfigHelp;
import org.rapidoid.data.JSON;
import org.rapidoid.http.HttpVerb;
import org.rapidoid.http.Req;
import org.rapidoid.http.ReqRespHandler;
import org.rapidoid.http.Resp;
import org.rapidoid.io.Res;
import org.rapidoid.ioc.IoC;
import org.rapidoid.ioc.IoCContext;
Expand All @@ -39,6 +43,7 @@
import org.rapidoid.reverseproxy.Reverse;
import org.rapidoid.scan.ClasspathUtil;
import org.rapidoid.scan.Scan;
import org.rapidoid.sql.JDBC;
import org.rapidoid.u.U;
import org.rapidoid.util.Msc;

Expand Down Expand Up @@ -112,17 +117,60 @@ public static AppBootstrap run(String... args) {
private static AppBootstrap boot() {
Jobs.initialize();

bootstrapProxy();
bootstrapSqlRoutes();

AppBootstrap bootstrap = new AppBootstrap();
bootstrap.services();
return bootstrap;
}

private static void bootstrapProxy() {
if (!Conf.PROXY.isEmpty()) {
for (Map.Entry<String, Object> e : Conf.PROXY.toMap().entrySet()) {
String uri = e.getKey();
String upstream = (String) e.getValue();
Reverse.proxy().map(uri).to(upstream.split("\\s*\\,\\s*"));
}
}
}

AppBootstrap bootstrap = new AppBootstrap();
bootstrap.services();
return bootstrap;
private static void bootstrapSqlRoutes() {
if (!Conf.SQL.isEmpty()) {
for (Map.Entry<String, Object> e : Conf.SQL.toMap().entrySet()) {

String[] verbUri = e.getKey().trim().split("\\s+");

final HttpVerb verb;
String uri;

if (verbUri.length == 1) {
verb = HttpVerb.GET;
uri = verbUri[0];

} else if (verbUri.length == 2) {
verb = HttpVerb.from(verbUri[0]);
uri = verbUri[1];

} else {
throw U.rte("Invalid route!");
}

final String sql = (String) e.getValue();

On.route(verb.name(), uri).json(new ReqRespHandler() {
@Override
public Object execute(Req req, Resp resp) throws Exception {
if (verb == HttpVerb.GET) {
return JDBC.query(sql);
} else {
JDBC.execute(sql);
return U.map("success", true); // FIXME improve
}
}
});
}
}
}

public static void profiles(String... profiles) {
Expand Down
@@ -0,0 +1,64 @@
package org.rapidoid.jdbc;

/*
* #%L
* rapidoid-integration-tests
* %%
* Copyright (C) 2014 - 2016 Nikolche Mihajlovski and contributors
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/

import org.junit.Before;
import org.junit.Test;
import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.commons.Env;
import org.rapidoid.config.Conf;
import org.rapidoid.http.IntegrationTestCommons;
import org.rapidoid.setup.App;
import org.rapidoid.sql.JDBC;

@Authors("Nikolche Mihajlovski")
@Since("5.2.5")
public class SqlRoutesTest extends IntegrationTestCommons {

@Before
public void reset() {
Env.reset();
Conf.reset();
}

@Test
public void testSqlRoutes() {
String all = "SELECT * FROM nums";
String add = "insert into nums values (3, 'three')";

App.run("/nums <= " + all, "POST /add <= " + add);

JDBC.execute("create table nums (id int, name varchar(10))");

JDBC.execute("insert into nums values (?, ?)", 1, "one");
JDBC.execute("insert into nums values (?, ?)", 2, "two");

isFalse(Conf.SQL.isEmpty());

eq(Conf.SQL.get("/nums"), all);
eq(Conf.SQL.get("POST /add"), add);

onlyPost("/add");
onlyGet("/nums");
}

}
@@ -0,0 +1,8 @@
HTTP/1.1 200 OK
Connection: keep-alive
Server: Rapidoid
Date: XXXXX GMT
Content-Type: application/json
Content-Length: 69

[{"ID":1,"NAME":"one"},{"ID":2,"NAME":"two"},{"ID":3,"NAME":"three"}]
@@ -0,0 +1,8 @@
HTTP/1.1 200 OK
Connection: keep-alive
Server: Rapidoid
Date: XXXXX GMT
Content-Type: application/json
Content-Length: 16

{"success":true}

0 comments on commit eb1ffd4

Please sign in to comment.