/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.datasource.jdbc;
import com.google.common.base.Strings;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class JdbcDatasourceSettings {
public static final int MAX_BATCH_SIZE = 1000;
//
// Instance Variables
//
private String defaultEntityType;
private Set<String> mappedTables;
private Set<JdbcValueTableSettings> tableSettings;
private Set<JdbcValueTableSettingsFactory> tableSettingsFactories;
private boolean useMetadataTables;
/**
* True if meta data tables schema supports multiple datasources.
*/
private boolean multipleDatasources;
/**
* The default column name for entity identification.
*/
private String defaultEntityIdColumnName;
/**
* The default column name for creation timestamps
*/
private String defaultCreatedTimestampColumnName;
/**
* The default column name for update timestamps
*/
private String defaultUpdatedTimestampColumnName;
private int batchSize = 100;
private boolean multilines = false;
//
// Constructors
//
private JdbcDatasourceSettings(String entityType) {
this.defaultEntityType = entityType;
this.defaultEntityIdColumnName = JdbcValueTableSettings.ENTITY_ID_COLUMN;
}
//
// Methods
//
public int getBatchSize() {
return batchSize;
}
public String getDefaultEntityType() {
return defaultEntityType;
}
@NotNull
public Set<String> getMappedTables() {
if (mappedTables == null) mappedTables = new HashSet<>();
return mappedTables;
}
public boolean hasMappedTables() {
return !getMappedTables().isEmpty();
}
public boolean hasMappedTable(String tableName) {
return getMappedTables().contains(tableName);
}
public void addTableSettings(JdbcValueTableSettings settings) {
getTableSettings().add(settings);
}
@NotNull
public Set<JdbcValueTableSettings> getTableSettings() {
if (tableSettings == null) tableSettings = new HashSet<>();
return tableSettings;
}
public void addTableSettingsFactories(JdbcValueTableSettingsFactory settingsFactory) {
getTableSettingsFactories().add(settingsFactory);
}
public boolean hasTableSettingsFactories() {
return !getTableSettingsFactories().isEmpty();
}
public Set<JdbcValueTableSettingsFactory> getTableSettingsFactories() {
if (tableSettingsFactories == null) tableSettingsFactories = new HashSet<>();
return tableSettingsFactories;
}
public boolean hasTableSettingsForSqlTable(String sqlTableName) {
for (JdbcValueTableSettings settings : getTableSettings()) {
if (settings.getSqlTableName().equals(sqlTableName)) {
return true;
}
}
return false;
}
@Nullable
public List<JdbcValueTableSettings> getTableSettingsForSqlTable(String sqlTableName) {
return getTableSettings().stream() //
.filter(settings -> settings.getSqlTableName().equals(sqlTableName)) //
.collect(Collectors.toList());
}
@Nullable
public JdbcValueTableSettings getTableSettingsForMagmaTable(String magmaTableName) {
for (JdbcValueTableSettings settings : getTableSettings()) {
if (settings.getMagmaTableName().equals(magmaTableName)) {
return settings;
}
}
return null;
}
public boolean isUseMetadataTables() {
return useMetadataTables;
}
public boolean isMultipleDatasources() {
return multipleDatasources;
}
public String getDefaultEntityIdColumnName() {
return defaultEntityIdColumnName;
}
public boolean hasEntityIdColumnName() {
return !Strings.isNullOrEmpty(defaultEntityIdColumnName);
}
public String getDefaultCreatedTimestampColumnName() {
return defaultCreatedTimestampColumnName;
}
public String getDefaultUpdatedTimestampColumnName() {
return defaultUpdatedTimestampColumnName;
}
public boolean hasCreatedTimestampColumnName() {
return !Strings.isNullOrEmpty(defaultCreatedTimestampColumnName);
}
public boolean hasUpdatedTimestampColumnName() {
return !Strings.isNullOrEmpty(defaultUpdatedTimestampColumnName);
}
public boolean isMultilines() {
return multilines;
}
public static Builder newSettings(String defaultEntityType) {
return new Builder(defaultEntityType);
}
public static class Builder {
private JdbcDatasourceSettings settings;
private Builder(String defaultEntityType) {
this.settings = new JdbcDatasourceSettings(defaultEntityType);
}
public Builder mappedTables(Set<String> mappedTables) {
settings.mappedTables = mappedTables;
return this;
}
public Builder multipleDatasources() {
return multipleDatasources(true);
}
public Builder multipleDatasources(boolean multipleDatasources) {
settings.multipleDatasources = multipleDatasources;
return this;
}
public Builder tableSettings(Set<JdbcValueTableSettings> tableSettings) {
settings.tableSettings = tableSettings;
return this;
}
public Builder tableSettingsFactories(Set<JdbcValueTableSettingsFactory> tableSettingsFactories) {
settings.tableSettingsFactories = tableSettingsFactories;
return this;
}
public Builder useMetadataTables() {
useMetadataTables(true);
return this;
}
public Builder useMetadataTables(boolean useMetadataTables) {
settings.useMetadataTables = useMetadataTables;
return this;
}
public Builder batchSize(int batchSize) {
if (batchSize < 1 || batchSize > MAX_BATCH_SIZE) throw new IllegalArgumentException("Invalid batchSize");
settings.batchSize = batchSize;
return this;
}
public Builder createdTimestampColumn(String name) {
settings.defaultCreatedTimestampColumnName = name;
return this;
}
public Builder updatedTimestampColumn(String name) {
settings.defaultUpdatedTimestampColumnName = name;
return this;
}
public Builder entityIdentifierColumn(String name) {
settings.defaultEntityIdColumnName = Strings.isNullOrEmpty(name) ? JdbcValueTableSettings.ENTITY_ID_COLUMN : name;
return this;
}
public Builder multilines() {
return multilines(true);
}
public Builder multilines(boolean multilines) {
settings.multilines = multilines;
return this;
}
public JdbcDatasourceSettings build() {
if (settings.defaultEntityType == null) throw new IllegalArgumentException("null defaultEntityType");
return settings;
}
}
}