package fi.otavanopisto.muikku.plugins.mongolog; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.codehaus.jackson.map.ObjectMapper; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.MongoTimeoutException; import com.mongodb.ServerAddress; import com.mongodb.util.JSON; import fi.otavanopisto.muikku.controller.PluginSettingsController; import fi.otavanopisto.muikku.plugins.commonlog.LogProvider; @ApplicationScoped public class MongoLogProvider implements LogProvider { private boolean enabled = true; @Inject private Logger logger; @Inject private PluginSettingsController pluginSettingsController; @PostConstruct public void init() { String user = pluginSettingsController.getPluginSetting("mongo-log", "database.user"); String password = pluginSettingsController.getPluginSetting("mongo-log", "database.password"); String host = pluginSettingsController.getPluginSetting("mongo-log", "database.host"); String port = pluginSettingsController.getPluginSetting("mongo-log", "database.port"); String database = pluginSettingsController.getPluginSetting("mongo-log", "database.name"); try { if (StringUtils.isNotBlank(user) && StringUtils.isNotBlank(password) && StringUtils.isNumeric(port) && StringUtils.isNotBlank(host) && StringUtils.isNotBlank(database)) { MongoCredential credential = MongoCredential.createMongoCRCredential(user, database, password.toCharArray()); ServerAddress addr = new ServerAddress(host, NumberUtils.createInteger(port)); mongo = new MongoClient(addr, Arrays.asList(credential)); db = mongo.getDB(database); } else { logger.warning("Could not initialize mongo log because some of the settings were missing"); enabled = false; } } catch (Exception e) { logger.warning("Cannot initialize connection to mongoDB"); enabled = false; } } @PreDestroy public void deinit() { mongo.close(); } @Override public void log(String collection, Object data) { if (!enabled) { return; } DBCollection c = db.getCollection(collection); try { String json = new ObjectMapper().writeValueAsString(data); DBObject o = (DBObject) JSON.parse(json); c.insert(o); } catch (IOException e) { logger.log(Level.WARNING, "Error while converting data to json"); } catch (MongoTimeoutException e) { logger.warning("Connection to mongoDB timed out!, disabling logging to mongoDB"); enabled = false; } } @SuppressWarnings("unchecked") @Override public ArrayList<HashMap<String, Object>> getLogEntries(String collection, Map<String, Object> query, int count) { if (!enabled) { return null; } try { DBCollection c = db.getCollection(collection); BasicDBObject queryObject = new BasicDBObject(); queryObject.putAll(query); DBCursor cursor = c.find(queryObject).sort(new BasicDBObject("time", -1)).limit(count); ArrayList<HashMap<String, Object>> results = new ArrayList<HashMap<String, Object>>(); while (cursor.hasNext()) { results.add((HashMap<String, Object>) cursor.next().toMap()); } return results; } catch (Exception e) { logger.warning("Connection to mongoDB timed out!, disabling logging to mongoDB"); enabled = false; return null; } } @Override public String getName() { return "mongo-provider"; } private MongoClient mongo; private DB db; }