/*
* Copyright 2014 the original author or authors.
*
* 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.
*/
package org.springframework.xd.jdbc;
import static org.springframework.xd.module.options.spi.ModulePlaceholders.XD_JOB_NAME;
import javax.validation.constraints.AssertTrue;
import org.springframework.util.StringUtils;
import org.springframework.xd.module.options.mixins.BatchJobCommitIntervalOptionMixin;
import org.springframework.xd.module.options.mixins.BatchJobFieldDelimiterOptionMixin;
import org.springframework.xd.module.options.mixins.BatchJobSinglestepPartitionSupportOptionMixin;
import org.springframework.xd.module.options.mixins.HadoopConfigurationMixin;
import org.springframework.xd.module.options.spi.Mixin;
import org.springframework.xd.module.options.spi.ModuleOption;
/**
* Captures options for the {@code jdbchdfs} job.
*
* @author Eric Bottard
* @author Luke Taylor
* @author Ilayaperumal Gopinathan
* @author Thomas Risberg
* @author Glenn Renfro
* @author Michael Minella
*/
@Mixin({ JdbcConnectionMixin.class, JdbcConnectionPoolMixin.class, BatchJobFieldDelimiterOptionMixin.class,
BatchJobCommitIntervalOptionMixin.class, HadoopConfigurationMixin.class,
BatchJobSinglestepPartitionSupportOptionMixin.class})
public class JdbcHdfsOptionsMetadata {
private String tableName = "";
private String columns = "";
private String partitionColumn = "";
private int partitions = 1;
private String sql = "";
private String fileName = XD_JOB_NAME;
private int rollover = 1000000;
private String directory = "/xd/" + XD_JOB_NAME;
private String fileExtension = "csv";
private String checkColumn = "";
@ModuleOption("the column to be examined when determining which rows to import")
public void setCheckColumn(String checkColumn) {
this.checkColumn = checkColumn;
}
@ModuleOption("the table to read data from")
public void setTableName(String tableName) {
this.tableName = tableName;
}
@ModuleOption("the column names to read from the supplied table")
public void setColumns(String columns) {
this.columns = columns;
}
@ModuleOption("the column to use for partitioning, should be numeric and uniformly distributed")
public void setPartitionColumn(String partitionColumn) {
this.partitionColumn = partitionColumn;
}
@ModuleOption("the number of partitions")
public void setPartitions(int partitions) {
this.partitions = partitions;
}
@ModuleOption("the SQL to use to extract data")
public void setSql(String sql) {
this.sql = sql;
}
@AssertTrue(message = "Use ('tableName' AND 'columns') OR 'sql' to define the data import")
boolean isEitherSqlOrTableAndColumns() {
if (!StringUtils.hasText(sql)) {
return StringUtils.hasText(tableName) && StringUtils.hasText(columns);
}
else {
return !StringUtils.hasText(tableName) && !StringUtils.hasText(columns);
}
}
@AssertTrue(message = "Use ('tableName' AND 'columns') when using partition column")
boolean isPartitionedWithTableName() {
if (StringUtils.hasText(partitionColumn)) {
return StringUtils.hasText(tableName) && !StringUtils.hasText(sql);
}
else {
return true;
}
}
@ModuleOption("the filename to use in HDFS")
public void setFileName(String fileName) {
this.fileName = fileName;
}
@ModuleOption("the number of bytes to write before creating a new file in HDFS")
public void setRollover(int rollover) {
this.rollover = rollover;
}
@ModuleOption("the directory to write the file(s) to in HDFS")
public void setDirectory(String directory) {
this.directory = directory;
}
@ModuleOption("the file extension to use")
public void setFileExtension(String fileExtension) {
this.fileExtension = fileExtension;
}
public String getTableName() {
return tableName;
}
public String getColumns() {
return columns;
}
public String getSql() {
return sql;
}
public String getPartitionColumn() {
return partitionColumn;
}
public int getPartitions() {
return partitions;
}
public String getFileName() {
return fileName;
}
public int getRollover() {
return rollover;
}
public String getDirectory() {
return directory;
}
public String getFileExtension() {
return fileExtension;
}
public String getCheckColumn() {
return checkColumn;
}
}