@Override protected MongoClient doCreateClient(String clientName, MongoDbConfig.ClientConfig clientConfig, Coffig coffig) { AllOptions allOptions = coffig.get(AllOptions.class, String.format("mongoDb.clients.%s", clientName)); if (clientConfig.isConfiguredByUri()) { return new MongoClient(new MongoClientURI(clientConfig.getUri(), allOptions.options.get())); } else { return createMongoClient(clientName, clientConfig, allOptions.options.get().build()); } }
@SuppressWarnings("unchecked") private BuilderSupplier<?> instantiateBuilderSupplier(Type type) { Class<?> rawClass = rawClassOf(type); if (rawClass.equals(BuilderSupplier.class)) { // If the type equals to the supplier interface, instantiate a default supplier return BuilderSupplier.of( instantiateDefault(rawClassOf(((ParameterizedType) type).getActualTypeArguments()[0])) ); } else { // Otherwise try to instantiate the supplier return (BuilderSupplier<?>) instantiateDefault(rawClass); } }
private MongoClientSettings buildMongoClientSettings(MongoDbConfig.ClientConfig clientConfig, String clientName, Coffig coffig) { MongoClientSettings.Builder settingsBuilder = MongoClientSettings.builder(); AllSettings allSettings = coffig.get(AllSettings.class, String.format("mongoDb.clients.%s.settings", clientName)); // Apply hosts List<String> hosts = clientConfig.getHosts(); if (hosts.size() > 0) { allSettings.cluster.get().hosts(buildServerAddresses(clientName, hosts)); } // Apply credentials settingsBuilder.credentialList(buildMongoCredentials(clientName, clientConfig.getCredentials())); // Apply global settings Optional.ofNullable(allSettings.readPreference).ifPresent(settingsBuilder::readPreference); Optional.ofNullable(allSettings.writeConcern).ifPresent(settingsBuilder::writeConcern); Optional.ofNullable(allSettings.codecRegistry).map(Classes::instantiateDefault).ifPresent(settingsBuilder::codecRegistry); // Apply sub-settings settingsBuilder.clusterSettings(allSettings.cluster.get().build()); settingsBuilder.socketSettings(allSettings.socket.get().build()); settingsBuilder.heartbeatSocketSettings(allSettings.heartbeatSocket.get().build()); settingsBuilder.connectionPoolSettings(allSettings.connectionPool.get().build()); settingsBuilder.serverSettings(allSettings.server.get().build()); settingsBuilder.sslSettings(allSettings.ssl.get().build()); return settingsBuilder.build(); }
@Override public Object map(TreeNode treeNode, Type type) { BuilderSupplier<?> supplier = instantiateBuilderSupplier(type); Object builder = supplier.get(); Map<String, Method> builderMethods = getBuilderMethods(builder); treeNode.namedNodes().forEach(namedNode -> { Method method = builderMethods.get(namedNode.name()); if (method != null) { try { method.invoke(builder, coffig.getMapper().map(namedNode.node(), method.getGenericParameterTypes()[0])); } catch (IllegalAccessException | InvocationTargetException e) { throw ConfigurationException.wrap(e, ConfigurationErrorCode.ERROR_DURING_METHOD_INVOCATION) .put("method", method.toString()); } } }); return supplier; }