com.hpe.sw.cms.verticle.MongoStoreVerticle.java Source code

Java tutorial

Introduction

Here is the source code for com.hpe.sw.cms.verticle.MongoStoreVerticle.java

Source

/**
 * (c)Copyright[2016]Hewlett Packard Enterprise Development LP
 * Licensed under the Apache License,Version2.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.
 */
package com.hpe.sw.cms.verticle;

import com.hpe.sw.cms.store.Image;
import com.hpe.sw.cms.store.Store;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.FindOptions;
import io.vertx.ext.mongo.MongoClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * Created by keke on 3/28/16.
 */
public class MongoStoreVerticle extends AbstractVerticle implements Store {
    private static final Logger LOG = LoggerFactory.getLogger(MongoStoreVerticle.class);
    private MongoClient client;

    @Override
    public void start() throws Exception {
        super.start();
        client = MongoClient.createShared(vertx, config().getJsonObject("mongo"));
        vertx.eventBus().consumer(Events.GET_IMAGES.name(), msg -> {
            JsonObject param = (JsonObject) msg.body();
            JsonObject query = new JsonObject();
            if (param != null && param.getString("timestamp") != null) {
                Long timestamp = Long.parseLong(param.getString("timestamp"));
                query.put(Image.TIMESTAMP, new JsonObject().put("$gte", timestamp));
            } else if (param != null && param.getString("imageid") != null) {
                query.put(Image.IMAGE_ID, param.getString(Image.IMAGE_ID));
            }

            if (!query.containsKey(Image.IMAGE_ID) && (param == null || param.getString("include") == null
                    || !"all".equals(param.getString("include")))) {
                query.put(Image.IMAGE_ID, new JsonObject().put("$exists", true));
            }
            JsonArray images = new JsonArray();
            client.find("images", query, res -> {
                if (res.succeeded()) {
                    List<JsonObject> result = res.result();
                    for (JsonObject dbImage : result) {
                        images.add(Image.cloneImage(dbImage));
                    }
                    msg.reply(images);
                }
            });
        });

        vertx.eventBus().consumer(Events.DOWNLOAD_FILE.name(), msg -> {
            JsonObject query = (JsonObject) msg.body();
            LOG.debug("DOWNLOAD_FILE query is " + query);
            client.find("images", query, res -> {
                if (res.succeeded()) {
                    List<JsonObject> result = res.result();
                    LOG.debug("DOWNLOAD_FILE result is " + result.size());
                    if (result.size() > 0) {
                        msg.reply(result.get(0));
                    } else {
                        msg.reply(null);
                    }
                }
            });
        });

        vertx.eventBus().consumer(Events.IMAGES_UPDATED.name(), msg -> {
            JsonArray updates = new JsonArray();
            JsonObject query = new JsonObject();
            query.put(Image.IS_SCANNED, false);
            int fetchSize = Integer.valueOf(String.valueOf(msg.body()));
            FindOptions options = new FindOptions();
            JsonObject sort = new JsonObject();
            sort.put(Image.TIMESTAMP, -1);
            options.setLimit(fetchSize).setSort(sort);
            client.findWithOptions("images", query, options, res -> {
                if (res.succeeded()) {
                    List<JsonObject> result = res.result();
                    for (JsonObject update : result) {
                        updates.add(update);
                        LOG.debug("get image from DB :" + Image.getImageKey(update));
                    }
                    LOG.debug("IMAGES_UPDATED reply updates size " + updates.size());
                    msg.reply(updates);
                }
            });
        });

        vertx.eventBus().consumer(Events.SCANFILE_UPLOADED.name(), msg -> {
            JsonObject upFile = (JsonObject) msg.body();
            JsonObject query = new JsonObject();
            query.put(Image.HOST, upFile.getString(Image.HOST)).put(Image.NAME, upFile.getString(Image.NAME))
                    .put(Image.TAG, upFile.getString(Image.TAG));
            client.find("images", query, res -> {
                if (res.succeeded()) {
                    List<JsonObject> result = res.result();
                    if (result.size() == 0) {
                        LOG.error("no mapped image in DB for " + Image.getImageKey(upFile));
                        return;
                    }
                    for (JsonObject dbImage : result) {
                        if (upFile.getBoolean("isScanFailed")) {
                            //Failed in scanning.
                            LOG.info("store failed scan to DB " + Image.getImageKey(upFile));
                            dbImage.put(Image.IS_SCANNED, true);
                            dbImage.put(Image.IS_SCANNED_FAILED, true);
                        } else {
                            //successfully in scanning.
                            LOG.info("store scanfile to DB " + Image.getImageKey(upFile));
                            dbImage.put(Image.IS_SCANNED, true);
                            dbImage.put(Image.IS_SCANNED_FAILED, false);
                            dbImage.put(Image.IMAGE_ID, upFile.getString(Image.IMAGE_ID));
                            dbImage.put(Image.SCANNED_FILE, upFile.getBinary(Image.SCANNED_FILE));
                        }
                        client.save("images", dbImage, h -> {
                            if (h.succeeded()) {
                                LOG.info("SCANFILE_UPLOADED:Image " + Image.getImageKey(dbImage) + " updated !");
                            } else {
                                h.cause().printStackTrace();
                            }
                        });
                    }
                }
            });

        });

        vertx.eventBus().consumer(Events.ENRICHFILE_UPLOADED.name(), msg -> {
            JsonArray upFiles = (JsonArray) msg.body();
            for (Object upFileObj : upFiles) {
                JsonObject upFile = (JsonObject) upFileObj;
                if (upFile.getBinary("enrichedFile") == null) {
                    LOG.info("enrichedFile is emptry for " + upFile.getString("imageid"));
                    continue;
                }
                LOG.info("store enrichfile to DB " + upFile.getString("imageid"));
                JsonObject query = new JsonObject();
                query.put(Image.IMAGE_ID, upFile.getString(Image.IMAGE_ID));
                client.find("images", query, res -> {
                    if (res.succeeded()) {
                        List<JsonObject> result = res.result();
                        for (JsonObject dbImage : result) {
                            dbImage.put(Image.IS_ENRICHED, true);
                            dbImage.put(Image.ENRICHED_FILE, upFile.getBinary(Image.ENRICHED_FILE));
                            client.save("images", dbImage, h -> {
                                if (h.succeeded()) {
                                    LOG.info("ENRICHFILE_UPLOADED:Image " + Image.getImageKey(dbImage)
                                            + " updated !");
                                } else {
                                    h.cause().printStackTrace();
                                }
                            });
                        }
                    }
                });
            }

        });

        vertx.eventBus().consumer(Events.IMAGE_TO_ENRICH.name(), msg -> {
            JsonObject query = new JsonObject();
            query.put(Image.IS_SCANNED, true).put(Image.IS_SCANNED_FAILED, false).put(Image.IS_ENRICHED, false);
            client.find("images", query, res -> {
                if (res.succeeded()) {
                    List<JsonObject> result = res.result();
                    msg.reply(new JsonArray(result));
                }
            });
        });

        vertx.eventBus().consumer(Events.NEW_IMAGE.name(), msg -> {
            //to store events in
            JsonObject obj = (JsonObject) msg.body();
            JsonObject query = new JsonObject();
            query.put(Image.HOST, obj.getString(Image.HOST)).put(Image.NAME, obj.getString(Image.NAME))
                    .put(Image.TAG, obj.getString(Image.TAG));
            client.find("images", query, res -> {
                if (res.succeeded()) {
                    List<JsonObject> result = res.result();
                    if (result.isEmpty()) {
                        //inserted
                        client.insert("images", obj, h -> {
                            if (h.succeeded()) {
                                LOG.info("IMAGES_COMMING :Image " + Image.getImageKey(obj) + " inserted !");
                            } else {
                                h.cause().printStackTrace();
                            }
                        });
                    } else if (result.size() == 1) {
                        JsonObject toUpdate = result.get(0);
                        if (!obj.getString(Image.SIGN).equals(toUpdate.getString(Image.SIGN))) {
                            toUpdate.put(Image.TIMESTAMP, obj.getLong(Image.TIMESTAMP))
                                    .put(Image.SIGN, obj.getString(Image.SIGN))
                                    .put(Image.IS_SCANNED, obj.getBoolean(Image.IS_SCANNED))
                                    .put(Image.IS_ENRICHED, obj.getBoolean(Image.IS_ENRICHED));
                            //saved
                            client.save("images", toUpdate, h -> {
                                if (h.succeeded()) {
                                    LOG.info("IMAGES_COMMING :Image " + Image.getImageKey(obj) + " updated !");
                                } else {
                                    h.cause().printStackTrace();
                                }
                            });
                        } else {
                            LOG.info("IMAGES_COMMING :Image " + Image.getImageKey(obj)
                                    + " has the same sign with the coming image, so will not update to DB !");
                        }
                    } else {
                        throw new RuntimeException(
                                "IMAGES_COMMING :Found " + result.size() + " image for " + Image.getImageKey(obj));
                    }
                }
            });
        });
    }

    @Override
    public void stop() throws Exception {
        super.stop();
        client.close();
    }
}