com.iot.i4.server.I4Server.java Source code

Java tutorial

Introduction

Here is the source code for com.iot.i4.server.I4Server.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.iot.i4.server;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpHeaders;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.MongoClient;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.ext.web.handler.StaticHandler;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author ski8cob
 */
public class I4Server extends AbstractVerticle {

    private MongoClient mongo;

    @Override
    public void start() throws Exception {
        // Create a mongo client using all defaults (connect to localhost and default port) using the database name "demo".
        JsonObject config = new JsonObject().put("connection_string", "mongodb://localhost:27017").put("db_name",
                "i4");
        mongo = MongoClient.createShared(Vertx.vertx(), config);

        // the load function just populates some data on the storage
        loadData(mongo);

        Router router = Router.router(Vertx.vertx());
        router.route().handler(BodyHandler.create());

        //1.findAll payloads
        router.get("/api/payloads").handler(ctx -> {
            mongo.find("payloads", new JsonObject(), lookup -> {
                // error handling
                if (lookup.failed()) {
                    ctx.fail(500);
                    return;
                }

                // now convert the list to a JsonArray because it will be easier to encode the final object as the response.
                final JsonArray json = new JsonArray();
                for (JsonObject o : lookup.result()) {
                    json.add(o);
                }
                ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json");
                ctx.response().end(json.encode());
            });
        });

        //1. findAll
        router.get("/api/users").handler(ctx -> {
            mongo.find("users", new JsonObject(), lookup -> {
                // error handling
                if (lookup.failed()) {
                    ctx.fail(500);
                    return;
                }
                // now convert the list to a JsonArray because it will be easier to encode the final object as the response.
                final JsonArray json = new JsonArray();
                for (JsonObject o : lookup.result()) {
                    json.add(o);
                }
                ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json");
                ctx.response().end(json.encode());
            });
        });

        //2.findOne
        router.get("/api/users/:id").handler(ctx -> {
            mongo.findOne("users", new JsonObject().put("_id", ctx.request().getParam("id")), null, lookup -> {
                // error handling
                if (lookup.failed()) {
                    ctx.fail(500);
                    return;
                }

                JsonObject user = lookup.result();

                if (user == null) {
                    ctx.fail(404);
                } else {
                    ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json");
                    ctx.response().end(user.encode());
                }
            });
        });

        router.post("/api/users").handler(ctx -> {
            JsonObject newUser = ctx.getBodyAsJson();

            mongo.findOne("users", new JsonObject().put("username", newUser.getString("username")), null,
                    lookup -> {
                        // error handling
                        if (lookup.failed()) {
                            ctx.fail(500);
                            return;
                        }

                        JsonObject user = lookup.result();

                        if (user != null) {
                            // already exists
                            ctx.fail(500);
                        } else {
                            mongo.insert("users", newUser, insert -> {
                                // error handling
                                if (insert.failed()) {
                                    ctx.fail(500);
                                    return;
                                }

                                // add the generated id to the user object
                                newUser.put("_id", insert.result());

                                ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json");
                                ctx.response().end(newUser.encode());
                            });
                        }
                    });
        });

        router.put("/api/users/:id").handler(ctx -> {
            mongo.findOne("users", new JsonObject().put("_id", ctx.request().getParam("id")), null, lookup -> {
                // error handling
                if (lookup.failed()) {
                    ctx.fail(500);
                    return;
                }

                JsonObject user = lookup.result();

                if (user == null) {
                    // does not exist
                    ctx.fail(404);
                } else {

                    // update the user properties
                    JsonObject update = ctx.getBodyAsJson();

                    user.put("username", update.getString("username"));
                    user.put("firstName", update.getString("firstName"));
                    user.put("lastName", update.getString("lastName"));
                    user.put("address", update.getString("address"));

                    mongo.replace("users", new JsonObject().put("_id", ctx.request().getParam("id")), user,
                            replace -> {
                                // error handling
                                if (replace.failed()) {
                                    ctx.fail(500);
                                    return;
                                }

                                ctx.response().putHeader(HttpHeaders.CONTENT_TYPE, "application/json");
                                ctx.response().end(user.encode());
                            });
                }
            });
        });

        router.delete("/api/users/:id").handler(ctx -> {
            mongo.findOne("users", new JsonObject().put("_id", ctx.request().getParam("id")), null, lookup -> {
                // error handling
                if (lookup.failed()) {
                    ctx.fail(500);
                    return;
                }

                JsonObject user = lookup.result();

                if (user == null) {
                    // does not exist
                    ctx.fail(404);
                } else {

                    mongo.remove("users", new JsonObject().put("_id", ctx.request().getParam("id")), remove -> {
                        // error handling
                        if (remove.failed()) {
                            ctx.fail(500);
                            return;
                        }

                        ctx.response().setStatusCode(204);
                        ctx.response().end();
                    });
                }
            });
        });
        // Create a router endpoint for the static content.
        router.route().handler(StaticHandler.create());
        Vertx.vertx().createHttpServer().requestHandler(router::accept).listen(8080);
        //Vertx.vertx().createHttpServer().requestHandler(req -> req.response().end("Hello World From I4Server!")).listen(8080);
        System.out.println("Server started & listening to [8080]");
    }

    public static void main(String[] args) throws Exception {
        new I4Server().start();
    }

    private void loadData(MongoClient db) {
        /*
        db.dropCollection("users", drop -> {
        if (drop.failed()) {
            throw new RuntimeException(drop.cause());
        }
        List<JsonObject> users = new LinkedList<>();
        users.add(new JsonObject()
                .put("username", "mks")
                .put("firstName", "Siva")
                .put("lastName", "Kalidasan")
                .put("address", "India"));
        users.add(new JsonObject()
                .put("username", "timfox")
                .put("firstName", "Tim")
                .put("lastName", "Fox")
                .put("address", "The Moon"));
        for (JsonObject user : users) {
            db.insert("users", user, res -> {
                System.out.println("inserted " + user.encode());
            });
        }
        });*/

        List<JsonObject> users = new LinkedList<>();
        users.add(new JsonObject().put("username", "mks").put("firstName", "Siva").put("lastName", "Kalidasan")
                .put("address", "India"));
        users.add(new JsonObject().put("username", "timfox").put("firstName", "Tim").put("lastName", "Fox")
                .put("address", "The Moon"));
        for (JsonObject user : users) {
            //                db.insert("users", user, res -> {
            //                    System.out.println("inserted " + user.encode());
            //                });
        }

        //insert some payload
        List<JsonObject> payloads = new LinkedList<>();
        for (int i = 1; i <= 5000; i++) {
            payloads.add(new JsonObject().put("deviceId", "DEV0" + i).put("deviceName", "Arduino" + i)
                    .put("hubId", "CBE0" + i).put("status", "On").put("receivedOn", new Date().toString()));
        }

        for (JsonObject payload : payloads) {
            db.insert("payloads", payload, res -> {
                //System.out.println("inserted " + payload.encode());
            });
        }
        System.out.println("inserted");
    }
}