/** * Copyright 2014 Lockheed Martin Corporation * * 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 streamflow.datastore.mongodb.config; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.mongodb.Mongo; import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.ServerAddress; import java.net.UnknownHostException; import streamflow.datastore.core.ComponentDao; import streamflow.datastore.core.FileContentDao; import streamflow.datastore.core.FrameworkDao; import streamflow.datastore.core.KafkaDao; import streamflow.datastore.core.ResourceDao; import streamflow.datastore.core.ResourceEntryDao; import streamflow.datastore.core.RoleDao; import streamflow.datastore.core.SerializationDao; import streamflow.datastore.core.TopologyDao; import streamflow.datastore.core.FileInfoDao; import streamflow.datastore.core.UserDao; import streamflow.datastore.mongodb.impl.MongoComponentDao; import streamflow.datastore.mongodb.impl.MongoDiskFileContentDao; import streamflow.datastore.mongodb.impl.MongoFrameworkDao; import streamflow.datastore.mongodb.impl.MongoKafkaDao; import streamflow.datastore.mongodb.impl.MongoResourceEntryDao; import streamflow.datastore.mongodb.impl.MongoResourceDao; import streamflow.datastore.mongodb.impl.MongoRoleDao; import streamflow.datastore.mongodb.impl.MongoSerializationDao; import streamflow.datastore.mongodb.impl.MongoTopologyDao; import streamflow.datastore.mongodb.impl.MongoFileInfoDao; import streamflow.datastore.mongodb.impl.MongoUserDao; import streamflow.model.config.DatastoreConfig; import org.mongodb.morphia.Datastore; import org.mongodb.morphia.Morphia; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MongoDatastoreModule extends AbstractModule { public static Logger LOG = LoggerFactory.getLogger(MongoDatastoreModule.class); @Override protected void configure() { LOG.info("Initializing MongoDB Datastore..."); bind(ComponentDao.class).to(MongoComponentDao.class); bind(FileInfoDao.class).to(MongoFileInfoDao.class); bind(FrameworkDao.class).to(MongoFrameworkDao.class); bind(ResourceEntryDao.class).to(MongoResourceEntryDao.class); bind(ResourceDao.class).to(MongoResourceDao.class); bind(RoleDao.class).to(MongoRoleDao.class); bind(SerializationDao.class).to(MongoSerializationDao.class); bind(TopologyDao.class).to(MongoTopologyDao.class); bind(UserDao.class).to(MongoUserDao.class); bind(FileContentDao.class).to(MongoDiskFileContentDao.class); bind(KafkaDao.class).to(MongoKafkaDao.class); } @Provides public Mongo providesMongoClient(DatastoreConfig datastoreConfig) { MongoClient mongoClient = null; MongoClientOptions.Builder clientOptions = MongoClientOptions.builder(); String serverAddressHost = datastoreConfig.getProperty("host", String.class); if (serverAddressHost == null) { serverAddressHost = "localhost"; } Integer serverAddressPort = datastoreConfig.getProperty("port", Integer.class); if (serverAddressPort == null) { serverAddressPort = 27017; } Integer acceptableLatencyDifference = datastoreConfig.getProperty("acceptableLatencyDifference", Integer.class); if (acceptableLatencyDifference != null) { clientOptions.acceptableLatencyDifference(acceptableLatencyDifference); } Integer connectTimeout = datastoreConfig.getProperty("connectTimeout", Integer.class); if (connectTimeout != null) { clientOptions.connectTimeout(connectTimeout); } Integer connectionsPerHost = datastoreConfig.getProperty("connectionsPerHost", Integer.class); if (connectionsPerHost != null) { clientOptions.connectionsPerHost(connectionsPerHost); } Boolean cursorFinalizerEnabled = datastoreConfig.getProperty("acceptableLatencyDifference", Boolean.class); if (cursorFinalizerEnabled != null) { clientOptions.cursorFinalizerEnabled(cursorFinalizerEnabled); } Integer heartbeatConnectRetryFrequency = datastoreConfig.getProperty("heartbeatConnectRetryFrequency", Integer.class); if (heartbeatConnectRetryFrequency != null) { clientOptions.heartbeatConnectRetryFrequency(heartbeatConnectRetryFrequency); } Integer heartbeatConnectTimeout = datastoreConfig.getProperty("heartbeatConnectTimeout", Integer.class); if (heartbeatConnectTimeout != null) { clientOptions.heartbeatConnectTimeout(heartbeatConnectTimeout); } Integer heartbeatFrequency = datastoreConfig.getProperty("heartbeatFrequency", Integer.class); if (heartbeatFrequency != null) { clientOptions.heartbeatFrequency(heartbeatFrequency); } Integer heartbeatSocketTimeout = datastoreConfig.getProperty("heartbeatSocketTimeout", Integer.class); if (heartbeatSocketTimeout != null) { clientOptions.heartbeatSocketTimeout(heartbeatSocketTimeout); } Integer heartbeatThreadCount = datastoreConfig.getProperty("heartbeatThreadCount", Integer.class); if (heartbeatThreadCount != null) { clientOptions.heartbeatThreadCount(heartbeatThreadCount); } Integer maxConnectionIdleTime = datastoreConfig.getProperty("maxConnectionIdleTime", Integer.class); if (maxConnectionIdleTime != null) { clientOptions.maxConnectionIdleTime(maxConnectionIdleTime); } Integer maxConnectionLifeTime = datastoreConfig.getProperty("maxConnectionLifeTime", Integer.class); if (maxConnectionLifeTime != null) { clientOptions.maxConnectionLifeTime(maxConnectionLifeTime); } Integer maxWaitTime = datastoreConfig.getProperty("maxWaitTime", Integer.class); if (maxWaitTime != null) { clientOptions.maxWaitTime(maxWaitTime); } Integer minConnectionsPerHost = datastoreConfig.getProperty("minConnectionsPerHost", Integer.class); if (minConnectionsPerHost != null) { clientOptions.minConnectionsPerHost(minConnectionsPerHost); } Boolean socketKeepAlive = datastoreConfig.getProperty("socketKeepAlive", Boolean.class); if (socketKeepAlive != null) { clientOptions.socketKeepAlive(socketKeepAlive); } Integer socketTimeout = datastoreConfig.getProperty("socketTimeout", Integer.class); if (socketTimeout != null) { clientOptions.socketTimeout(socketTimeout); } Integer threadsAllowedToBlockForConnectionMultiplier = datastoreConfig.getProperty("threadsAllowedToBlockForConnectionMultiplier", Integer.class); if (threadsAllowedToBlockForConnectionMultiplier != null) { clientOptions.threadsAllowedToBlockForConnectionMultiplier( threadsAllowedToBlockForConnectionMultiplier); } try { ServerAddress serverAddress = new ServerAddress( serverAddressHost, serverAddressPort); // Initialize the Mongo connection with the specified address and options mongoClient = new MongoClient(serverAddress, clientOptions.build()); } catch (UnknownHostException ex) { LOG.error("Exception occurred while building Mongo client connection", ex); } return mongoClient; } @Provides public Datastore providesMorphiaDatastore(Mongo mongo, DatastoreConfig datastoreConfig) { String dbName = datastoreConfig.getProperty("dbName", String.class); if (dbName == null || dbName.isEmpty()) { dbName = "streamflow"; } return new Morphia().createDatastore(mongo, dbName); } }