Advertisement
Guest User

Untitled

a guest
May 10th, 2016
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.91 KB | None | 0 0
  1. package com.jacada.is.as.dao;
  2.  
  3. import java.net.UnknownHostException;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.concurrent.ConcurrentHashMap;
  8.  
  9. import javax.annotation.PostConstruct;
  10. import javax.annotation.PreDestroy;
  11. import javax.net.ssl.SSLSocketFactory;
  12.  
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.data.authentication.UserCredentials;
  19. import org.springframework.data.mongodb.MongoDbFactory;
  20. import org.springframework.data.mongodb.core.MongoTemplate;
  21. import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
  22. import org.springframework.data.mongodb.gridfs.GridFsTemplate;
  23.  
  24. import com.google.common.collect.Lists;
  25. import com.jacada.is.model.bean.tenant.Tenant;
  26. import com.jacada.is.model.resources.exceptions.CisException;
  27. import com.jacada.is.model.resources.exceptions.FailureCode;
  28. import com.mongodb.BasicDBObject;
  29. import com.mongodb.DB;
  30. import com.mongodb.DBCollection;
  31. import com.mongodb.DBObject;
  32. import com.mongodb.MongoClient;
  33. import com.mongodb.MongoClientOptions;
  34. import com.mongodb.MongoCredential;
  35. import com.mongodb.MongoException;
  36. import com.mongodb.ReadPreference;
  37. import com.mongodb.ServerAddress;
  38. import com.mongodb.WriteResult;
  39. import com.mongodb.util.JSON;
  40. import com.mongodb.util.JSONParseException;
  41.  
  42. public class MongoConnectionManager extends AbstractConnectionManager {
  43.  
  44. private final static Logger log = LoggerFactory.getLogger(MongoConnectionManager.class);
  45.  
  46. public final static String SYSTEM_TENANT_ID = "system";
  47. public static final int MONGO_DEFAULT_PORT = 27017;
  48. private static final String IP_DELIMITER = ",";
  49. final String ADMIN_DB_NAME = "admin";
  50.  
  51. MongoClient mongoClient;
  52.  
  53. MongoTemplate mongoTemplate;
  54.  
  55. GridFsTemplate gridFsTemplate;
  56.  
  57. @Autowired
  58. private ITenantDao tenantDao;
  59.  
  60. private Map<String, MongoConnection> mongoConnections = new ConcurrentHashMap<>();
  61.  
  62. private String systemTenantHost = "localhost";
  63.  
  64. private String systemTenantHostPort = "27017";
  65.  
  66. private String systemTenantHostUsername;
  67.  
  68. private String systemTenantHostPassword;
  69.  
  70. // Setting from properties and xml
  71. @Value("${mongo.ssl.mode}")
  72. private String mongoSslMode;
  73.  
  74. @Value("${mongo.ldap.mode}")
  75. private String mongoLdapMode;
  76.  
  77. @Value("${mongo.host}")
  78. private String mongoHost;
  79.  
  80. @Value("${mongo.systemhost}")
  81. private String mongoSystemHost;
  82.  
  83. @Value("${mongo.port}")
  84. private int mongoPort;
  85.  
  86. @Value("${mongo.database}")
  87. private String mongoDataBase;
  88.  
  89. @Value("${mongo.username}")
  90. private String username;
  91.  
  92. @Value("${mongo.password}")
  93. private String password;
  94.  
  95. @Value("${mongo.readSecondary}")
  96. private boolean readSecondary = false;
  97.  
  98. @Value("${mongo.connections.per.host}")
  99. private int connectionsPerHost;
  100.  
  101. @Value("${mongo.threads.allowed.to.block.for.connection.multiplier}")
  102. private int threadsAllowedToBlockForConnectionMultiplier;
  103.  
  104. @Value("${mongo.connect.timeout}")
  105. private int connectionTimeout;
  106.  
  107. @Value("${mongo.auto.connect.retry}")
  108. private boolean autoConnectRetry;
  109.  
  110. @Value("${mongo.max.wait.time}")
  111. private int maxWaitTime;
  112.  
  113. @Value("${mongo.write.number}")
  114. private int writeNumber;
  115.  
  116. @Value("${mongo.socket.timeout}")
  117. private int socketTimeout;
  118.  
  119. @Value("${mongo.write.fsync}")
  120. private boolean writeFsync;
  121.  
  122.  
  123. @Value("${reports.mongo.tags:default}")
  124. private String MONGO_TAGS_PHRASE;
  125.  
  126. private Object mongoTagsObject;
  127.  
  128. @PreDestroy
  129. public void destroy() {
  130. log.debug("\n Destroy all connections START");
  131. for (MongoConnection mongoConnection : mongoConnections.values()) {
  132. log.debug(" Destroy: {}", mongoConnection.mongoTemplate.getDb().getName());
  133. log.debug(" Before: connector is open: {}", mongoConnection.mongoTemplate.getDb().getMongo()
  134. .getConnector().isOpen());
  135. mongoConnection.mongoTemplate.getDb().getMongo().close();
  136. mongoConnection.mongoTemplate.getDb().getMongo().getConnector().close();
  137. log.debug(" After: connector is open: {}", mongoConnection.mongoTemplate.getDb().getMongo()
  138. .getConnector().isOpen());
  139. }
  140. log.debug("Destroy all connections END \n");
  141. }
  142.  
  143. @PostConstruct
  144. public void init() throws UnknownHostException {
  145. log.trace(" \n Account connections initialization START");
  146. mongoClient = new MongoClient(extractMongoHosts(), getMongoCredentials(), buildMongoClientOps());
  147. MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, mongoDataBase);
  148. mongoTemplate = new MongoTemplate(dbFactory);
  149. gridFsTemplate = new GridFsTemplate(dbFactory, mongoTemplate.getConverter());
  150.  
  151. MongoConnection connection = new MongoConnection();
  152. connection.mongoTemplate = mongoTemplate;
  153. connection.gridFsTemplate = gridFsTemplate;
  154.  
  155. mongoConnections.put(SYSTEM_TENANT_ID, connection);
  156.  
  157. // probably don't need this
  158. // deviceMetadataCollectionInitializer.init(SYSTEM_TENANT_ID);
  159.  
  160.  
  161.  
  162. List<Tenant> tenants = tenantDao.list();
  163. for (Tenant tenant : tenants) {
  164. createDatabase( tenant.getId(),
  165. getSystemTenantHost(),
  166. getSystemTenantHostPort(),
  167. getSystemTenantHostUsername(),
  168. getSystemTenantHostPassword());
  169. }
  170.  
  171. // createDatabaseForTests();
  172. log.trace("Account connections initialization END");
  173. }
  174.  
  175. /**
  176. *
  177. * @param tenantId
  178. * @return
  179. * @throws CisException
  180. */
  181. public MongoTemplate getConnection(String tenantId) throws CisException {
  182. MongoConnection mongoConnection = getMongoConnection(tenantId);
  183. return mongoConnection.mongoTemplate;
  184. }
  185.  
  186. public GridFsTemplate getGridFsTemplate(String tenantId) throws CisException {
  187. MongoConnection mongoConnection = getMongoConnection(tenantId);
  188. return mongoConnection.gridFsTemplate;
  189. }
  190.  
  191. private MongoConnection getMongoConnection(String tenantId) {
  192. if (!mongoConnections.containsKey(tenantId)) {
  193. Tenant tenant = tenantDao.get(tenantId);
  194. if (tenant == null) {
  195. log.error("There are no connections by this tenant Id: {}", tenantId);
  196. throw new CisException( "There are no connections by this tenant Id:" + tenantId,
  197. FailureCode.ERR_ILLEGAL_STATE);
  198. }
  199.  
  200. createDatabase( tenantId,
  201. getSystemTenantHost(),
  202. getSystemTenantHostPort(),
  203. getSystemTenantHostUsername(),
  204. getSystemTenantHostPassword());
  205. }
  206. MongoConnection mongoConnection = mongoConnections.get(tenantId);
  207. return mongoConnection;
  208. }
  209.  
  210. public void createDatabase(String tenantId) {
  211. createDatabase( tenantId,
  212. getSystemTenantHost(),
  213. getSystemTenantHostPort(),
  214. getSystemTenantHostUsername(),
  215. getSystemTenantHostPassword());
  216. }
  217.  
  218. private void createUserInDB(String tenantId, String username, String password) {
  219. final String ADMIN_DB_NAME = "admin";
  220. MongoCredential creds = MongoCredential
  221. .createMongoCRCredential(username, ADMIN_DB_NAME, password.toCharArray());
  222. MongoClient adminMongoClient = new MongoClient(mongoClient.getAllAddress(), Arrays.asList(creds));
  223. DB adminDb = adminMongoClient.getDB(tenantId);
  224.  
  225. DBCollection usersCollection = adminDb.getCollection("system.users");
  226. DBObject existingUser = usersCollection.findOne(new BasicDBObject("user", username));
  227. if (existingUser == null) {
  228. WriteResult res = adminDb.addUser(username, password.toCharArray());
  229. if (StringUtils.isNotBlank(res.getError())) {
  230. log.error("Cannot create user for new DB. Reason: " + res.getError());
  231. }
  232. }
  233. }
  234.  
  235. public void createDatabase(String tenantId, String hosts, String port, String username, String password) {
  236. log.trace("Create connection to the database: {}", tenantId);
  237.  
  238. if (readSecondary) { //used for reports war
  239. if(!MONGO_TAGS_PHRASE.equals("default")){
  240. try {
  241. mongoTagsObject = JSON.parse(MONGO_TAGS_PHRASE);
  242. mongoClient.setReadPreference(ReadPreference.secondaryPreferred((DBObject)mongoTagsObject, new BasicDBObject()));
  243. } catch (JSONParseException exception){
  244. log.error("could not parse the following mongo tags phrase: " + MONGO_TAGS_PHRASE + " for the following reason: " + exception.getMessage());
  245. mongoClient.setReadPreference(ReadPreference.secondaryPreferred());
  246. }
  247. } else {
  248. mongoClient.setReadPreference(ReadPreference.secondaryPreferred());
  249. }
  250. }
  251.  
  252. MongoTemplate mongoTemplate;
  253. GridFsTemplate gridFsTemplate;
  254. if (StringUtils.isNotBlank(username)) {
  255. createUserInDB(tenantId, username, password);
  256. UserCredentials credentials = new UserCredentials(username, password);
  257. mongoTemplate = new MongoTemplate(mongoClient, tenantId, credentials);
  258. MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, tenantId, credentials);
  259. gridFsTemplate = new GridFsTemplate(dbFactory, mongoTemplate.getConverter());
  260. } else {
  261. mongoTemplate = new MongoTemplate(mongoClient, tenantId);
  262. MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, tenantId);
  263. gridFsTemplate = new GridFsTemplate(dbFactory, mongoTemplate.getConverter());
  264. }
  265.  
  266. log.trace("Existing collections of database {}:", tenantId);
  267. for (String collectionName : mongoTemplate.getCollectionNames()) {
  268. log.trace(" {}", collectionName);
  269. }
  270.  
  271. MongoConnection connection = new MongoConnection();
  272. connection.mongoTemplate = mongoTemplate;
  273. connection.gridFsTemplate = gridFsTemplate;
  274. mongoConnections.put(tenantId, connection);
  275.  
  276. log.trace("Connection was added succesfully");
  277. }
  278.  
  279. public void deleteDatabase(String name) {
  280. // TenantConnectionBean tenantConnectionBean =
  281. // cachedMongoConnectionStorage.getValue(name);
  282. MongoConnection mongoConnection = mongoConnections.get(name);
  283. MongoTemplate template = mongoConnection.mongoTemplate;
  284. try {
  285. template.getDb().dropDatabase();
  286. mongoConnections.remove(name);
  287. } catch (MongoException e) {
  288. log.error("Database removing error! DB:" + name, e);
  289. return;
  290. }
  291. }
  292.  
  293. public void poll() {
  294. MongoConnection mongoConnection = mongoConnections.get(SYSTEM_TENANT_ID);
  295. MongoTemplate template = mongoConnection.mongoTemplate;
  296.  
  297. try {
  298. template.getDb().getStats();
  299. } catch (Exception e) {
  300. log.error("Database polling failed", e);
  301. throw e;
  302. }
  303. }
  304.  
  305. private static class MongoConnection {
  306.  
  307. MongoTemplate mongoTemplate;
  308. GridFsTemplate gridFsTemplate;
  309. }
  310.  
  311. public void putTenantToMongoConnections(String tenantId) {
  312. MongoConnection connection = new MongoConnection();
  313. connection.mongoTemplate = mongoTemplate;
  314. connection.gridFsTemplate = gridFsTemplate;
  315. mongoConnections.put(tenantId, connection);
  316. }
  317.  
  318. public String getSystemTenantHost() {
  319. return systemTenantHost;
  320. }
  321.  
  322. public void setSystemTenantHost(String systemTenantHost) {
  323. this.systemTenantHost = systemTenantHost;
  324. }
  325.  
  326. public String getSystemTenantHostPort() {
  327. return systemTenantHostPort;
  328. }
  329.  
  330. public void setSystemTenantHostPort(String systemTenantHostPort) {
  331. this.systemTenantHostPort = systemTenantHostPort;
  332. }
  333.  
  334. public String getSystemTenantHostUsername() {
  335. return systemTenantHostUsername;
  336. }
  337.  
  338. public void setSystemTenantHostUsername(String systemTenantHostUsername) {
  339. this.systemTenantHostUsername = systemTenantHostUsername;
  340. }
  341.  
  342. public String getSystemTenantHostPassword() {
  343. return systemTenantHostPassword;
  344. }
  345.  
  346. public void setSystemTenantHostPassword(String systemTenantHostPassword) {
  347. this.systemTenantHostPassword = systemTenantHostPassword;
  348. }
  349.  
  350. // mongo.write.number=1
  351. // mongo.write.fsync=false
  352. private MongoClientOptions buildMongoClientOps(){
  353. MongoClientOptions clientOptions = MongoClientOptions.builder().connectionsPerHost(connectionsPerHost).connectTimeout(connectionTimeout).
  354. maxWaitTime(maxWaitTime).socketTimeout(socketTimeout).
  355. threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier).build();
  356.  
  357. if(Boolean.valueOf(mongoSslMode)){
  358. clientOptions.builder().socketFactory(SSLSocketFactory.getDefault()).build(); //add ssl support
  359. }
  360.  
  361. return clientOptions;
  362. }
  363.  
  364. private List<ServerAddress> extractMongoHosts() throws UnknownHostException{
  365. List<ServerAddress> serverAddresses = Lists.newArrayList();
  366. String[] hostArr = mongoHost.split(IP_DELIMITER);
  367.  
  368. for (String host : hostArr) {
  369. String[] split = host.split(":");
  370. ServerAddress addr = new ServerAddress(host, Integer.valueOf(split[1]));
  371. serverAddresses.add(addr);
  372. }
  373.  
  374. return serverAddresses;
  375. }
  376.  
  377. private List<MongoCredential> getMongoCredentials(){
  378. List<MongoCredential> credentials = Lists.newArrayList();
  379.  
  380. if(StringUtils.isNotBlank(username)){
  381. if(Boolean.valueOf(mongoLdapMode)){
  382. credentials.add(MongoCredential.createPlainCredential("mongoroot", "$external", "Jacada2014".toCharArray()).withMechanismProperty("digestPassword", false));
  383. } else {
  384. credentials.add(MongoCredential.createMongoCRCredential(username, mongoDataBase, password.toCharArray()));
  385. }
  386. }
  387.  
  388. return credentials;
  389. }
  390. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement