ru.frostman.web.MongoPlugin.java Source code

Java tutorial

Introduction

Here is the source code for ru.frostman.web.MongoPlugin.java

Source

/******************************************************************************
 * WebJavin - Java Web Framework.                                             *
 *                                                                            *
 * Copyright (c) 2011 - Sergey "Frosman" Lukjanov, me@frostman.ru             *
 *                                                                            *
 * 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.                                             *
 ******************************************************************************/

package ru.frostman.web;

import com.google.code.morphia.Morphia;
import com.google.code.morphia.annotations.Embedded;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.logging.MorphiaLoggerFactory;
import com.google.code.morphia.logging.slf4j.SLF4JLogrImplFactory;
import com.google.common.collect.Lists;
import com.mongodb.Mongo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.frostman.web.classloading.AppClass;
import ru.frostman.web.mongo.config.MongoConfig;
import ru.frostman.web.plugin.Plugin;
import ru.frostman.web.thr.JavinRuntimeException;

import java.net.UnknownHostException;
import java.util.List;
import java.util.Map;

/**
 * @author slukjanov aka Frostman
 */
public class MongoPlugin extends Plugin {
    private static final Logger log = LoggerFactory.getLogger(MongoPlugin.class);
    private static boolean firstLoad = true;

    private static Mongo mongo;
    private static Morphia morphia;

    public MongoPlugin() {
        super(1);
    }

    @Override
    public boolean reload() {
        if (firstLoad) {
            MorphiaLoggerFactory.registerLogger(SLF4JLogrImplFactory.class);
            firstLoad = false;
        }

        boolean changed = MongoConfig.update();

        if (changed || mongo == null || morphia == null) {
            try {
                mongo = new Mongo(MongoConfig.get().getMongoReplicaSet());

                String mongoVersion = mongo.getVersion();
                log.debug("Successfully connected to MongoDB v." + mongoVersion);

                morphia = new Morphia();
            } catch (UnknownHostException e) {
                throw new JavinRuntimeException("Can't connect to MongoDB", e);
            }
            log.info("Mongo plugin loaded successfully");
        }

        return changed;
    }

    @Override
    public void afterClassesEnhance(Map<String, AppClass> classes) {
        List<Class> morphiaClasses = Lists.newLinkedList();

        for (Map.Entry<String, AppClass> entry : classes.entrySet()) {
            Class<?> clazz = entry.getValue().getJavaClass();

            if (clazz.getAnnotation(Entity.class) != null || clazz.getAnnotation(Embedded.class) != null) {
                morphiaClasses.add(clazz);
                morphia.map(clazz);
            }
        }

        log.debug("All app classes successfully added to Morphia");
    }

    public static Mongo getMongo() {
        return mongo;
    }

    public static Morphia getMorphia() {
        return morphia;
    }

    @Override
    public List<String> getAppClassesPackages() {
        return Lists.newArrayList("ru.frostman.web.mongo");
    }
}