/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 gobblin.util.jdbc;
import gobblin.configuration.ConfigurationKeys;
import gobblin.configuration.State;
import java.util.Properties;
import javax.sql.DataSource;
import lombok.ToString;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
@ToString(exclude = "passWord")
public class DataSourceBuilder {
private static final Logger LOG = LoggerFactory.getLogger(DataSourceBuilder.class);
private String url;
private String driver;
private String userName;
private String passWord;
private Integer maxIdleConnections;
private Integer maxActiveConnections;
private String cryptoKeyLocation;
private Boolean useStrongEncryption;
private State state;
public static DataSourceBuilder builder() {
return new DataSourceBuilder();
}
public DataSourceBuilder url(String url) {
this.url = url;
return this;
}
public DataSourceBuilder driver(String driver) {
this.driver = driver;
return this;
}
public DataSourceBuilder userName(String userName) {
this.userName = userName;
return this;
}
public DataSourceBuilder passWord(String passWord) {
this.passWord = passWord;
return this;
}
public DataSourceBuilder maxIdleConnections(int maxIdleConnections) {
this.maxIdleConnections = maxIdleConnections;
return this;
}
public DataSourceBuilder maxActiveConnections(int maxActiveConnections) {
this.maxActiveConnections = maxActiveConnections;
return this;
}
public DataSourceBuilder cryptoKeyLocation(String cryptoKeyLocation) {
this.cryptoKeyLocation = cryptoKeyLocation;
return this;
}
public DataSourceBuilder useStrongEncryption(boolean useStrongEncryption) {
this.useStrongEncryption = useStrongEncryption;
return this;
}
public DataSourceBuilder state(State state) {
this.state = state;
return this;
}
public DataSource build() {
validate();
Properties properties = new Properties();
if (this.state != null) {
properties = this.state.getProperties();
}
properties.setProperty(DataSourceProvider.CONN_URL, this.url);
properties.setProperty(DataSourceProvider.USERNAME, this.userName);
properties.setProperty(DataSourceProvider.PASSWORD, this.passWord);
properties.setProperty(DataSourceProvider.CONN_DRIVER, this.driver);
if (!StringUtils.isEmpty(this.cryptoKeyLocation)) {
properties.setProperty(ConfigurationKeys.ENCRYPT_KEY_LOC, this.cryptoKeyLocation);
}
if (this.maxIdleConnections != null) {
properties.setProperty(DataSourceProvider.MAX_IDLE_CONNS, this.maxIdleConnections.toString());
}
if (this.maxActiveConnections != null) {
properties.setProperty(DataSourceProvider.MAX_ACTIVE_CONNS, this.maxActiveConnections.toString());
}
if (this.useStrongEncryption != null) {
properties.setProperty(ConfigurationKeys.ENCRYPT_USE_STRONG_ENCRYPTOR, this.useStrongEncryption.toString());
}
if (LOG.isDebugEnabled()) {
LOG.debug("Building DataSource with properties " + properties);
}
return new DataSourceProvider(properties).get();
}
private void validate() {
validateNotEmpty(this.url, "url");
validateNotEmpty(this.driver, "driver");
validateNotEmpty(this.passWord, "passWord");
Preconditions.checkArgument(this.maxIdleConnections == null || this.maxIdleConnections > 0,
"maxIdleConnections should be a positive integer.");
Preconditions.checkArgument(this.maxActiveConnections == null || this.maxActiveConnections > 0,
"maxActiveConnections should be a positive integer.");
}
private static void validateNotEmpty(String s, String name) {
Preconditions.checkArgument(!StringUtils.isEmpty(s), name + " should not be empty.");
}
}