com.arangodb.internal.InternalArangoDBBuilder Maven / Gradle / Ivy
/*
* DISCLAIMER
*
* Copyright 2018 ArangoDB GmbH, Cologne, Germany
*
* 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.
*
* Copyright holder is ArangoDB GmbH, Cologne, Germany
*/
package com.arangodb.internal;
import com.arangodb.ArangoDBException;
import com.arangodb.Protocol;
import com.arangodb.config.ArangoConfigProperties;
import com.arangodb.config.HostDescription;
import com.arangodb.entity.LoadBalancingStrategy;
import com.arangodb.internal.net.*;
import com.arangodb.internal.serde.InternalSerdeProvider;
import com.arangodb.internal.util.HostUtils;
import com.arangodb.serde.ArangoSerde;
import com.arangodb.serde.ArangoSerdeProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLContext;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Mark Vollmary
*/
public abstract class InternalArangoDBBuilder {
private static final Logger LOG = LoggerFactory.getLogger(InternalArangoDBBuilder.class);
protected final List hosts = new ArrayList<>();
protected Protocol protocol;
protected Integer timeout;
protected String user;
protected String password;
protected String jwt;
protected Boolean useSsl;
protected SSLContext sslContext;
protected Boolean verifyHost;
protected Integer chunkSize;
protected Integer maxConnections;
protected Long connectionTtl;
protected Integer keepAliveInterval;
protected Boolean acquireHostList;
protected Integer acquireHostListInterval;
protected LoadBalancingStrategy loadBalancingStrategy;
protected ArangoSerde userDataSerde;
protected Integer responseQueueTimeSamples;
protected InternalArangoDBBuilder() {
// load default properties
doLoadProperties(new ArangoConfigProperties() {
});
}
protected static ArangoSerdeProvider serdeProvider() {
ServiceLoader loader = ServiceLoader.load(ArangoSerdeProvider.class);
Iterator it = loader.iterator();
ArangoSerdeProvider serdeProvider;
if (!it.hasNext()) {
LOG.warn("No ArangoSerdeProvider found, using InternalSerdeProvider. Please consider registering a custom " +
"ArangoSerdeProvider to avoid depending on internal classes which are not part of the public API.");
serdeProvider = new InternalSerdeProvider();
} else {
serdeProvider = it.next();
if (it.hasNext()) {
throw new ArangoDBException("Found multiple serde providers! Please set explicitly the one to use.");
}
}
return serdeProvider;
}
protected void doLoadProperties(final ArangoConfigProperties properties) {
hosts.addAll(properties.getHosts().orElse(ArangoDefaults.DEFAULT_HOSTS).stream()
.map(it -> new HostDescription(it.getHost(), it.getPort()))
.collect(Collectors.toList()));
protocol = properties.getProtocol().orElse(ArangoDefaults.DEFAULT_PROTOCOL);
timeout = properties.getTimeout().orElse(ArangoDefaults.DEFAULT_TIMEOUT);
user = properties.getUser().orElse(ArangoDefaults.DEFAULT_USER);
// FIXME: make password field Optional
password = properties.getPassword().orElse(null);
// FIXME: make jwt field Optional
jwt = properties.getJwt().orElse(null);
useSsl = properties.getUseSsl().orElse(ArangoDefaults.DEFAULT_USE_SSL);
verifyHost = properties.getVerifyHost().orElse(ArangoDefaults.DEFAULT_VERIFY_HOST);
chunkSize = properties.getChunkSize().orElse(ArangoDefaults.DEFAULT_CHUNK_SIZE);
// FIXME: make maxConnections field Optional
maxConnections = properties.getMaxConnections().orElse(null);
// FIXME: make connectionTtl field Optional
connectionTtl = properties.getConnectionTtl().orElse(null);
// FIXME: make keepAliveInterval field Optional
keepAliveInterval = properties.getKeepAliveInterval().orElse(null);
acquireHostList = properties.getAcquireHostList().orElse(ArangoDefaults.DEFAULT_ACQUIRE_HOST_LIST);
acquireHostListInterval = properties.getAcquireHostListInterval().orElse(ArangoDefaults.DEFAULT_ACQUIRE_HOST_LIST_INTERVAL);
loadBalancingStrategy = properties.getLoadBalancingStrategy().orElse(ArangoDefaults.DEFAULT_LOAD_BALANCING_STRATEGY);
responseQueueTimeSamples = properties.getResponseQueueTimeSamples().orElse(ArangoDefaults.DEFAULT_RESPONSE_QUEUE_TIME_SAMPLES);
}
protected void setHost(final String host, final int port) {
hosts.add(new HostDescription(host, port));
}
protected void setTimeout(final Integer timeout) {
this.timeout = timeout;
}
protected void setUser(final String user) {
this.user = user;
}
protected void setPassword(final String password) {
this.password = password;
}
protected void setJwt(final String jwt) {
this.jwt = jwt;
}
protected void setUseSsl(final Boolean useSsl) {
this.useSsl = useSsl;
}
protected void setSslContext(final SSLContext sslContext) {
this.sslContext = sslContext;
}
protected void setVerifyHost(final Boolean verifyHost) {
this.verifyHost = verifyHost;
}
protected void setChunkSize(final Integer chunkSize) {
this.chunkSize = chunkSize;
}
protected void setMaxConnections(final Integer maxConnections) {
this.maxConnections = maxConnections;
}
protected void setConnectionTtl(final Long connectionTtl) {
this.connectionTtl = connectionTtl;
}
protected void setKeepAliveInterval(final Integer keepAliveInterval) {
this.keepAliveInterval = keepAliveInterval;
}
protected void setAcquireHostList(final Boolean acquireHostList) {
this.acquireHostList = acquireHostList;
}
protected void setAcquireHostListInterval(final Integer acquireHostListInterval) {
this.acquireHostListInterval = acquireHostListInterval;
}
protected void setLoadBalancingStrategy(final LoadBalancingStrategy loadBalancingStrategy) {
this.loadBalancingStrategy = loadBalancingStrategy;
}
protected void setResponseQueueTimeSamples(final Integer responseQueueTimeSamples) {
this.responseQueueTimeSamples = responseQueueTimeSamples;
}
protected void setUserDataSerde(final ArangoSerde serde) {
this.userDataSerde = serde;
}
protected HostHandler createHostHandler(final HostResolver hostResolver) {
final HostHandler hostHandler;
if (loadBalancingStrategy != null) {
switch (loadBalancingStrategy) {
case ONE_RANDOM:
hostHandler = new RandomHostHandler(hostResolver, new FallbackHostHandler(hostResolver));
break;
case ROUND_ROBIN:
hostHandler = new RoundRobinHostHandler(hostResolver);
break;
case NONE:
default:
hostHandler = new FallbackHostHandler(hostResolver);
break;
}
} else {
hostHandler = new FallbackHostHandler(hostResolver);
}
LOG.debug("HostHandler is {}", hostHandler.getClass().getSimpleName());
return new DirtyReadHostHandler(hostHandler, new RoundRobinHostHandler(hostResolver));
}
protected HostResolver createHostResolver(final Collection hosts, final int maxConnections,
final ConnectionFactory connectionFactory) {
if (acquireHostList != null && acquireHostList) {
LOG.debug("acquireHostList -> Use ExtendedHostResolver");
return new ExtendedHostResolver(new ArrayList<>(hosts), maxConnections, connectionFactory,
acquireHostListInterval);
} else {
LOG.debug("Use SimpleHostResolver");
return new SimpleHostResolver(new ArrayList<>(hosts));
}
}
protected Collection createHostList(
final int maxConnections,
final ConnectionFactory connectionFactory) {
final Collection hostList = new ArrayList<>();
for (final HostDescription host : hosts) {
hostList.add(HostUtils.createHost(host, maxConnections, connectionFactory));
}
return hostList;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy