5
0
mirror of https://github.com/apache/sqoop.git synced 2025-05-06 17:20:31 +08:00

SQOOP-1930: Sqoop2: Enforce a non empty schema name and column names

(Veena Basavaraj via Abraham Elmahrek)
This commit is contained in:
Abraham Elmahrek 2014-12-19 13:59:42 -08:00
parent 938317c3d0
commit 8cb7fc48ab
7 changed files with 51 additions and 16 deletions

View File

@ -20,14 +20,16 @@
import org.apache.sqoop.schema.type.Binary;
/***
* Schema holding a single field of Binary data
* Used to support connectors to schemaless / unstructured systems
* Such as HDFS or Kafka
* Schema holding a single field of Binary data Used to support connectors to
* schemaless / unstructured systems Such as HDFS or Kafka
*/
public class ByteArraySchema extends Schema {
private static final String BYTE_ARRAY_SCHEMA_NAME = "ByteArraySchema";
private static final String BYTE_ARRAY_COLUMN_NAME = "ByteArraySchema_Bytes";
public static final ByteArraySchema instance = (ByteArraySchema) new ByteArraySchema()
.addColumn(new Binary("ByteArraySchema_Bytes"));
.addColumn(new Binary(BYTE_ARRAY_COLUMN_NAME));
public static ByteArraySchema getInstance() {
return instance;
@ -35,6 +37,6 @@ public static ByteArraySchema getInstance() {
// To avoid instantiation
private ByteArraySchema() {
super("ByteArraySchema");
super(BYTE_ARRAY_SCHEMA_NAME);
}
}

View File

@ -19,6 +19,7 @@
public class NullSchema extends Schema {
private static final String NULL_SCHEMA_NAME = "NullSchema";
public static final NullSchema instance = new NullSchema();
public static NullSchema getInstance() {
@ -27,6 +28,6 @@ public static NullSchema getInstance() {
private NullSchema() {
// empty string is the name
super("");
super(NULL_SCHEMA_NAME);
}
}

View File

@ -65,7 +65,9 @@ private Schema() {
public Schema(String name) {
this();
assert name != null;
if (StringUtils.isEmpty(name)) {
throw new SqoopException(SchemaError.SCHEMA_0006, "Schema: " + name);
}
this.name = name;
}
@ -80,10 +82,6 @@ public Schema(String name) {
* @return a reference to this object
*/
public Schema addColumn(Column column) {
if(column.getName() == null) {
throw new SqoopException(SchemaError.SCHEMA_0001, "Column: " + column);
}
if(columNames.contains(column.getName())) {
throw new SqoopException(SchemaError.SCHEMA_0002, "Column: " + column);
}

View File

@ -34,7 +34,9 @@ public enum SchemaError implements ErrorCode {
SCHEMA_0004("Non-null target column has no matching source column"),
SCHEMA_0005("No matching method available for source and target schemas")
SCHEMA_0005("No matching method available for source and target schemas"),
SCHEMA_0006("Schema without name"),
;

View File

@ -18,6 +18,8 @@
package org.apache.sqoop.schema.type;
import org.apache.commons.lang.StringUtils;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.schema.SchemaError;
/**
* Base class for all the supported types in the Sqoop {@link #Schema}
@ -42,7 +44,9 @@ public Column(String name) {
}
public Column(String name, Boolean nullable) {
assert !StringUtils.isEmpty(name);
if (StringUtils.isEmpty(name)) {
throw new SqoopException(SchemaError.SCHEMA_0001, "Column name: " + name);
}
this.name = name;
setNullable(nullable);
}

View File

@ -37,13 +37,10 @@ public class TestSchemaBean extends TestSchemaSerialization {
protected Schema transfer(Schema schema) {
SchemaBean extractBean = new SchemaBean(schema);
JSONObject extractJson = extractBean.extract(true);
String transferredString = extractJson.toJSONString();
JSONObject restoreJson = JSONUtils.parse(transferredString);
SchemaBean restoreBean = new SchemaBean();
restoreBean.restore(restoreJson);
return restoreBean.getSchema();
}
}

View File

@ -23,7 +23,9 @@
import java.util.Collections;
import java.util.HashSet;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.json.JSONUtils;
import org.apache.sqoop.schema.ByteArraySchema;
import org.apache.sqoop.schema.NullSchema;
import org.apache.sqoop.schema.Schema;
import org.apache.sqoop.schema.type.Array;
@ -61,6 +63,35 @@ public void testNullSchemaObject() {
transferAndAssert(NullSchema.getInstance());
}
@SuppressWarnings("unused")
@Test(expected = SqoopException.class)
public void testEmptySchemaName() {
Schema schema = new Schema("");
}
@SuppressWarnings("unused")
@Test(expected = SqoopException.class)
public void testNullSchemaName() {
Schema schema = new Schema(null);
}
@SuppressWarnings("unused")
@Test(expected = SqoopException.class)
public void testSchemaWithNullColumnName() {
Schema schema = new Schema("test").addColumn(new Text(null));
}
@SuppressWarnings("unused")
@Test(expected = SqoopException.class)
public void testSchemaWithEmptyColumnName() {
Schema schema = new Schema("test").addColumn(new Text(""));
}
@Test
public void testByteArraySchemaObject() {
transferAndAssert(ByteArraySchema.getInstance());
}
@Test
public void testArray() {
// create an array type containing decimals