diff --git a/common/src/main/java/org/apache/sqoop/model/ConfigurationClass.java b/common/src/main/java/org/apache/sqoop/model/ConfigurationClass.java index 5323bd99..73374d81 100644 --- a/common/src/main/java/org/apache/sqoop/model/ConfigurationClass.java +++ b/common/src/main/java/org/apache/sqoop/model/ConfigurationClass.java @@ -17,8 +17,6 @@ */ package org.apache.sqoop.model; -import org.apache.sqoop.validation.validators.Validator; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -37,5 +35,5 @@ * * @return */ - Class[] validators() default {}; + Validator[] validators() default {}; } diff --git a/common/src/main/java/org/apache/sqoop/model/FormClass.java b/common/src/main/java/org/apache/sqoop/model/FormClass.java index 48bff3c5..6048d039 100644 --- a/common/src/main/java/org/apache/sqoop/model/FormClass.java +++ b/common/src/main/java/org/apache/sqoop/model/FormClass.java @@ -17,8 +17,6 @@ */ package org.apache.sqoop.model; -import org.apache.sqoop.validation.validators.Validator; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -43,5 +41,5 @@ * * @return */ - Class[] validators() default {}; + Validator[] validators() default {}; } diff --git a/common/src/main/java/org/apache/sqoop/model/Input.java b/common/src/main/java/org/apache/sqoop/model/Input.java index 61fc01aa..2b32e43f 100644 --- a/common/src/main/java/org/apache/sqoop/model/Input.java +++ b/common/src/main/java/org/apache/sqoop/model/Input.java @@ -17,8 +17,6 @@ */ package org.apache.sqoop.model; -import org.apache.sqoop.validation.validators.Validator; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -51,5 +49,5 @@ * * @return */ - Class[] validators() default {}; + Validator[] validators() default {}; } diff --git a/common/src/main/java/org/apache/sqoop/model/Validator.java b/common/src/main/java/org/apache/sqoop/model/Validator.java new file mode 100644 index 00000000..6368a9d3 --- /dev/null +++ b/common/src/main/java/org/apache/sqoop/model/Validator.java @@ -0,0 +1,45 @@ +/** + * 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 org.apache.sqoop.model; + +import org.apache.sqoop.validation.validators.AbstractValidator; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Annotation for specifying validators + * + * Usage without any parameters: + * @Validator(ClassName.class) + * + * To specify string parameter call: + * @Validator(value = ClassName.class, strArg = "Hello World!") + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface Validator { + /** + * Validator implementation that should be executed. + */ + Class value(); + + /** + * Optional argument that should be given to the validator before execution. + */ + String strArg() default AbstractValidator.DEFAULT_STRING_ARGUMENT; +} diff --git a/common/src/main/java/org/apache/sqoop/validation/ValidationResult.java b/common/src/main/java/org/apache/sqoop/validation/ValidationResult.java index 2782fac0..ae8f1d1a 100644 --- a/common/src/main/java/org/apache/sqoop/validation/ValidationResult.java +++ b/common/src/main/java/org/apache/sqoop/validation/ValidationResult.java @@ -17,7 +17,7 @@ */ package org.apache.sqoop.validation; -import org.apache.sqoop.validation.validators.Validator; +import org.apache.sqoop.validation.validators.AbstractValidator; import java.util.HashMap; import java.util.List; @@ -49,7 +49,7 @@ public ValidationResult() { * @param name Full name of the validated object * @param validator Executed validator */ - public void addValidator(String name, Validator validator) { + public void addValidator(String name, AbstractValidator validator) { if(validator.getStatus() == Status.getDefault()) { return; } diff --git a/common/src/main/java/org/apache/sqoop/validation/ValidationRunner.java b/common/src/main/java/org/apache/sqoop/validation/ValidationRunner.java index 46e2d56e..f36faf2a 100644 --- a/common/src/main/java/org/apache/sqoop/validation/ValidationRunner.java +++ b/common/src/main/java/org/apache/sqoop/validation/ValidationRunner.java @@ -22,8 +22,9 @@ import org.apache.sqoop.model.FormClass; import org.apache.sqoop.model.FormUtils; import org.apache.sqoop.model.Input; +import org.apache.sqoop.model.Validator; import org.apache.sqoop.utils.ClassUtils; -import org.apache.sqoop.validation.validators.Validator; +import org.apache.sqoop.validation.validators.AbstractValidator; import java.lang.reflect.Field; @@ -114,14 +115,14 @@ public ValidationResult validateForm(String formName, Object form) { * * @param name Full name of the object * @param object Input, Form or Class instance - * @param classes Validators array + * @param validators Validators array * @return */ - private ValidationResult validateArray(String name, Object object, Class []classes) { + private ValidationResult validateArray(String name, Object object, Validator[] validators) { ValidationResult result = new ValidationResult(); - for (Class klass : classes) { - Validator v = executeValidator(object, klass); + for (Validator validator : validators) { + AbstractValidator v = executeValidator(object, validator); result.addValidator(name, v); } @@ -132,11 +133,12 @@ private ValidationResult validateArray(String name, Object object, Class klass) { - Validator instance = (Validator) ClassUtils.instantiate(klass); + private AbstractValidator executeValidator(Object object, Validator validator) { + AbstractValidator instance = (AbstractValidator) ClassUtils.instantiate(validator.value()); + instance.setStringArgument(validator.strArg()); instance.validate(object); return instance; } diff --git a/common/src/main/java/org/apache/sqoop/validation/validators/Validator.java b/common/src/main/java/org/apache/sqoop/validation/validators/AbstractValidator.java similarity index 76% rename from common/src/main/java/org/apache/sqoop/validation/validators/Validator.java rename to common/src/main/java/org/apache/sqoop/validation/validators/AbstractValidator.java index bdb7c209..9dbb44c8 100644 --- a/common/src/main/java/org/apache/sqoop/validation/validators/Validator.java +++ b/common/src/main/java/org/apache/sqoop/validation/validators/AbstractValidator.java @@ -28,7 +28,12 @@ * * Can be used to validate inputs, forms and configuration classes. */ -abstract public class Validator { +abstract public class AbstractValidator { + + /** + * Default value of String argument. + */ + public static final String DEFAULT_STRING_ARGUMENT = ""; /** * Validation check. @@ -49,7 +54,12 @@ abstract public class Validator { */ private Status status; - public Validator() { + /** + * Optional String argument that can be defined for the Validator + */ + private String stringArgument; + + public AbstractValidator() { reset(); } @@ -70,11 +80,24 @@ public Status getStatus() { return status; } + public void setStringArgument(String arg) { + this.stringArgument = arg; + } + + public String getStringArgument() { + return stringArgument; + } + /** - * Reset validator state (all previous messages). + * Reset validator state. + * + * * Previous messages + * * Status + * * Any stored arguments */ public void reset() { messages = new LinkedList(); status = Status.getDefault(); + stringArgument = DEFAULT_STRING_ARGUMENT; } } diff --git a/common/src/main/java/org/apache/sqoop/validation/validators/ClassAvailable.java b/common/src/main/java/org/apache/sqoop/validation/validators/ClassAvailable.java index 2adfe6c8..52a8fddf 100644 --- a/common/src/main/java/org/apache/sqoop/validation/validators/ClassAvailable.java +++ b/common/src/main/java/org/apache/sqoop/validation/validators/ClassAvailable.java @@ -23,7 +23,7 @@ /** * Ensure that given String Input is a class that is available to this JVM. */ -public class ClassAvailable extends Validator { +public class ClassAvailable extends AbstractValidator { @Override public void validate(String klass) { try { diff --git a/common/src/main/java/org/apache/sqoop/validation/validators/Contains.java b/common/src/main/java/org/apache/sqoop/validation/validators/Contains.java new file mode 100644 index 00000000..8920c72c --- /dev/null +++ b/common/src/main/java/org/apache/sqoop/validation/validators/Contains.java @@ -0,0 +1,32 @@ +/** + * 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 org.apache.sqoop.validation.validators; + +import org.apache.sqoop.validation.Status; + +/** + * String validator to verify presence of a sub string (provided as a String argument) + */ +public class Contains extends AbstractValidator { + @Override + public void validate(String str) { + if(str == null || !str.contains(getStringArgument())) { + addMessage(Status.UNACCEPTABLE, "String must contain substring: " + getStringArgument()); + } + } +} diff --git a/common/src/main/java/org/apache/sqoop/validation/validators/NotEmpty.java b/common/src/main/java/org/apache/sqoop/validation/validators/NotEmpty.java index 520beea3..248a2fa6 100644 --- a/common/src/main/java/org/apache/sqoop/validation/validators/NotEmpty.java +++ b/common/src/main/java/org/apache/sqoop/validation/validators/NotEmpty.java @@ -24,7 +24,7 @@ * * Will also ensure that the string is not null. */ -public class NotEmpty extends Validator { +public class NotEmpty extends AbstractValidator { @Override public void validate(String instance) { if (instance == null || instance.isEmpty()) { diff --git a/common/src/main/java/org/apache/sqoop/validation/validators/NotNull.java b/common/src/main/java/org/apache/sqoop/validation/validators/NotNull.java index fb8a9267..93b5fa74 100644 --- a/common/src/main/java/org/apache/sqoop/validation/validators/NotNull.java +++ b/common/src/main/java/org/apache/sqoop/validation/validators/NotNull.java @@ -22,7 +22,7 @@ /** * Ensure that given object is never null. */ -public class NotNull extends Validator { +public class NotNull extends AbstractValidator { @Override public void validate(T instance) { if (instance == null) { diff --git a/common/src/main/java/org/apache/sqoop/validation/validators/StartsWith.java b/common/src/main/java/org/apache/sqoop/validation/validators/StartsWith.java new file mode 100644 index 00000000..808e1f7c --- /dev/null +++ b/common/src/main/java/org/apache/sqoop/validation/validators/StartsWith.java @@ -0,0 +1,32 @@ +/** + * 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 org.apache.sqoop.validation.validators; + +import org.apache.sqoop.validation.Status; + +/** + * String validator to verify if Input starts with given string (String argument). + */ +public class StartsWith extends AbstractValidator { + @Override + public void validate(String str) { + if(str == null || !str.startsWith(getStringArgument())) { + addMessage(Status.UNACCEPTABLE, "String must start with: " + getStringArgument()); + } + } +} diff --git a/common/src/test/java/org/apache/sqoop/validation/TestValidationRunner.java b/common/src/test/java/org/apache/sqoop/validation/TestValidationRunner.java index 19614257..647abe06 100644 --- a/common/src/test/java/org/apache/sqoop/validation/TestValidationRunner.java +++ b/common/src/test/java/org/apache/sqoop/validation/TestValidationRunner.java @@ -21,9 +21,11 @@ import org.apache.sqoop.model.Form; import org.apache.sqoop.model.FormClass; import org.apache.sqoop.model.Input; +import org.apache.sqoop.model.Validator; +import org.apache.sqoop.validation.validators.Contains; import org.apache.sqoop.validation.validators.NotEmpty; import org.apache.sqoop.validation.validators.NotNull; -import org.apache.sqoop.validation.validators.Validator; +import org.apache.sqoop.validation.validators.AbstractValidator; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -33,12 +35,12 @@ */ public class TestValidationRunner { - @FormClass(validators = {FormA.FormValidator.class}) + @FormClass(validators = {@Validator(FormA.FormValidator.class)}) public static class FormA { - @Input(validators = {NotNull.class}) + @Input(validators = {@Validator(NotNull.class)}) String notNull; - public static class FormValidator extends Validator { + public static class FormValidator extends AbstractValidator { @Override public void validate(FormA form) { if(form.notNull == null) { @@ -80,7 +82,13 @@ public void testValidateForm() { @FormClass public static class FormB { - @Input(validators = {NotNull.class, NotEmpty.class}) + @Input(validators = {@Validator(NotNull.class), @Validator(NotEmpty.class)}) + String str; + } + + @FormClass + public static class FormC { + @Input(validators = {@Validator(value = Contains.class, strArg = "findme")}) String str; } @@ -98,14 +106,34 @@ public void testMultipleValidatorsOnSingleInput() { assertEquals(2, result.getMessages().get("formName.str").size()); } - @ConfigurationClass(validators = {ConfigurationA.ClassValidator.class}) + @Test + public void testValidatorWithParameters() { + FormC form = new FormC(); + ValidationRunner runner = new ValidationRunner(); + ValidationResult result; + + // Sub string not found + form.str = "Mordor"; + result = runner.validateForm("formName", form); + assertEquals(Status.UNACCEPTABLE, result.getStatus()); + assertEquals(1, result.getMessages().size()); + assertTrue(result.getMessages().containsKey("formName.str")); + + // Sub string found + form.str = "Morfindmedor"; + result = runner.validateForm("formName", form); + assertEquals(Status.FINE, result.getStatus()); + assertEquals(0, result.getMessages().size()); + } + + @ConfigurationClass(validators = {@Validator(ConfigurationA.ClassValidator.class)}) public static class ConfigurationA { @Form FormA formA; public ConfigurationA() { formA = new FormA(); } - public static class ClassValidator extends Validator { + public static class ClassValidator extends AbstractValidator { @Override public void validate(ConfigurationA conf) { if("error".equals(conf.formA.notNull)) { diff --git a/common/src/test/java/org/apache/sqoop/validation/validators/TestClassAvailable.java b/common/src/test/java/org/apache/sqoop/validation/validators/TestClassAvailable.java index 511b3b4a..62b2e0ad 100644 --- a/common/src/test/java/org/apache/sqoop/validation/validators/TestClassAvailable.java +++ b/common/src/test/java/org/apache/sqoop/validation/validators/TestClassAvailable.java @@ -29,7 +29,7 @@ */ public class TestClassAvailable { - Validator validator = new ClassAvailable(); + AbstractValidator validator = new ClassAvailable(); @Test public void test() { diff --git a/common/src/test/java/org/apache/sqoop/validation/validators/TestContains.java b/common/src/test/java/org/apache/sqoop/validation/validators/TestContains.java new file mode 100644 index 00000000..b5dce627 --- /dev/null +++ b/common/src/test/java/org/apache/sqoop/validation/validators/TestContains.java @@ -0,0 +1,90 @@ +/** + * 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 org.apache.sqoop.validation.validators; + +import org.apache.sqoop.validation.Status; +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +/** + */ +public class TestContains { + + AbstractValidator validator = new Contains(); + + @Test + public void test() { + assertEquals(0, validator.getMessages().size()); + + // Default, no string argument set + validator.validate("str"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // Searched substring is entire string + validator.reset(); + validator.setStringArgument("str"); + validator.validate("str"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // Just starts with + validator.reset(); + validator.setStringArgument("str"); + validator.validate("straaaaa"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // Ends with + validator.reset(); + validator.setStringArgument("str"); + validator.validate("aaastr"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // In the middle + validator.reset(); + validator.setStringArgument("str"); + validator.validate("aaastraaa"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // Null string + validator.reset(); + validator.setStringArgument("str"); + validator.validate(null); + assertEquals(Status.UNACCEPTABLE, validator.getStatus()); + assertEquals(1, validator.getMessages().size()); + + // Empty string + validator.reset(); + validator.setStringArgument("str"); + validator.validate(""); + assertEquals(Status.UNACCEPTABLE, validator.getStatus()); + assertEquals(1, validator.getMessages().size()); + + // "Random" string + validator.reset(); + validator.setStringArgument("str"); + validator.validate("Ahoj tady je meduza"); + assertEquals(Status.UNACCEPTABLE, validator.getStatus()); + assertEquals(1, validator.getMessages().size()); + } + +} diff --git a/common/src/test/java/org/apache/sqoop/validation/validators/TestNotEmpty.java b/common/src/test/java/org/apache/sqoop/validation/validators/TestNotEmpty.java index d225b063..5c9169a6 100644 --- a/common/src/test/java/org/apache/sqoop/validation/validators/TestNotEmpty.java +++ b/common/src/test/java/org/apache/sqoop/validation/validators/TestNotEmpty.java @@ -29,7 +29,7 @@ */ public class TestNotEmpty { - Validator validator = new NotEmpty(); + AbstractValidator validator = new NotEmpty(); @Test public void test() { diff --git a/common/src/test/java/org/apache/sqoop/validation/validators/TestNotNull.java b/common/src/test/java/org/apache/sqoop/validation/validators/TestNotNull.java index 9c5bed53..91e5398b 100644 --- a/common/src/test/java/org/apache/sqoop/validation/validators/TestNotNull.java +++ b/common/src/test/java/org/apache/sqoop/validation/validators/TestNotNull.java @@ -29,7 +29,7 @@ */ public class TestNotNull { - Validator validator = new NotNull(); + AbstractValidator validator = new NotNull(); @Test public void test() { diff --git a/common/src/test/java/org/apache/sqoop/validation/validators/TestStartsWith.java b/common/src/test/java/org/apache/sqoop/validation/validators/TestStartsWith.java new file mode 100644 index 00000000..92409d92 --- /dev/null +++ b/common/src/test/java/org/apache/sqoop/validation/validators/TestStartsWith.java @@ -0,0 +1,74 @@ +/** + * 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 org.apache.sqoop.validation.validators; + +import org.apache.sqoop.validation.Status; +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +/** + */ +public class TestStartsWith { + + AbstractValidator validator = new StartsWith(); + + @Test + public void test() { + assertEquals(0, validator.getMessages().size()); + + // Default, no string argument set + validator.validate("str"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // Searched substring is entire string + validator.validate("str"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // Just starts with + validator.reset(); + validator.setStringArgument("str"); + validator.validate("strstr"); + assertEquals(Status.FINE, validator.getStatus()); + assertEquals(0, validator.getMessages().size()); + + // Null string + validator.reset(); + validator.setStringArgument("str"); + validator.validate(null); + assertEquals(Status.UNACCEPTABLE, validator.getStatus()); + assertEquals(1, validator.getMessages().size()); + + // Empty string + validator.reset(); + validator.setStringArgument("str"); + validator.validate(""); + assertEquals(Status.UNACCEPTABLE, validator.getStatus()); + assertEquals(1, validator.getMessages().size()); + + // "Random" string + validator.reset(); + validator.setStringArgument("str"); + validator.validate("Ahoj tady je meduza"); + assertEquals(Status.UNACCEPTABLE, validator.getStatus()); + assertEquals(1, validator.getMessages().size()); + } + +} diff --git a/common/src/test/java/org/apache/sqoop/validation/validators/TestValidator.java b/common/src/test/java/org/apache/sqoop/validation/validators/TestValidator.java index 1a5dbddb..3f60ee6f 100644 --- a/common/src/test/java/org/apache/sqoop/validation/validators/TestValidator.java +++ b/common/src/test/java/org/apache/sqoop/validation/validators/TestValidator.java @@ -27,7 +27,7 @@ * */ public class TestValidator { - public static class ValidatorImpl extends Validator { + public static class ValidatorImpl extends AbstractValidator { @Override public void validate(String msg) { addMessage(Status.FINE, msg); diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java index e5137707..3b5d70a5 100644 --- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java +++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ConnectionForm.java @@ -19,10 +19,12 @@ import org.apache.sqoop.model.FormClass; import org.apache.sqoop.model.Input; +import org.apache.sqoop.model.Validator; import org.apache.sqoop.validation.Status; +import org.apache.sqoop.validation.validators.AbstractValidator; import org.apache.sqoop.validation.validators.NotEmpty; -import org.apache.sqoop.validation.validators.Validator; import org.apache.sqoop.validation.validators.ClassAvailable; +import org.apache.sqoop.validation.validators.StartsWith; import java.sql.DriverManager; import java.sql.SQLException; @@ -31,12 +33,12 @@ /** * */ -@FormClass(validators = {ConnectionForm.FormValidator.class}) +@FormClass(validators = {@Validator(ConnectionForm.FormValidator.class)}) public class ConnectionForm { - @Input(size = 128, validators = {NotEmpty.class, ClassAvailable.class} ) + @Input(size = 128, validators = {@Validator(NotEmpty.class), @Validator(ClassAvailable.class)} ) public String jdbcDriver; - @Input(size = 128, validators = {NotEmpty.class} ) + @Input(size = 128, validators = {@Validator(value = StartsWith.class, strArg = "jdbc:")} ) public String connectionString; @Input(size = 40) @@ -48,7 +50,7 @@ public class ConnectionForm { @Input public Map jdbcProperties; - public static class FormValidator extends Validator { + public static class FormValidator extends AbstractValidator { @Override public void validate(ConnectionForm form) { // See if we can connect to the database diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/FromTableForm.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/FromTableForm.java index 1c0b4293..ac725469 100644 --- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/FromTableForm.java +++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/FromTableForm.java @@ -20,13 +20,15 @@ import org.apache.sqoop.connector.jdbc.GenericJdbcConnectorConstants; import org.apache.sqoop.model.FormClass; import org.apache.sqoop.model.Input; +import org.apache.sqoop.model.Validator; import org.apache.sqoop.validation.Status; -import org.apache.sqoop.validation.validators.Validator; +import org.apache.sqoop.validation.validators.AbstractValidator; +import org.apache.sqoop.validation.validators.Contains; /** * */ -@FormClass( validators = {FromTableForm.FormValidator.class}) +@FormClass( validators = {@Validator(FromTableForm.FormValidator.class)}) public class FromTableForm { @Input(size = 50) public String schemaName; @@ -34,7 +36,7 @@ public class FromTableForm { @Input(size = 50) public String tableName; - @Input(size = 2000, validators = {SqlConditionTokenValidator.class}) + @Input(size = 2000, validators = {@Validator(value = Contains.class, strArg = GenericJdbcConnectorConstants.SQL_CONDITIONS_TOKEN)}) public String sql; @Input(size = 50) @@ -49,7 +51,7 @@ public class FromTableForm { @Input(size = 50) public String boundaryQuery; - public static class FormValidator extends Validator { + public static class FormValidator extends AbstractValidator { @Override public void validate(FromTableForm form) { if(form.tableName == null && form.sql == null) { @@ -63,13 +65,4 @@ public void validate(FromTableForm form) { } } } - - public static class SqlConditionTokenValidator extends Validator { - @Override - public void validate(String sql) { - if(sql != null && !sql.contains(GenericJdbcConnectorConstants.SQL_CONDITIONS_TOKEN)) { - addMessage(Status.UNACCEPTABLE, "SQL statement must contain placeholder for auto generated conditions - " + GenericJdbcConnectorConstants.SQL_CONDITIONS_TOKEN); - } - } - } } diff --git a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ToTableForm.java b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ToTableForm.java index 0601a398..642da111 100644 --- a/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ToTableForm.java +++ b/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/configuration/ToTableForm.java @@ -19,13 +19,14 @@ import org.apache.sqoop.model.FormClass; import org.apache.sqoop.model.Input; +import org.apache.sqoop.model.Validator; import org.apache.sqoop.validation.Status; -import org.apache.sqoop.validation.validators.Validator; +import org.apache.sqoop.validation.validators.AbstractValidator; /** * */ -@FormClass(validators = {ToTableForm.FormValidator.class}) +@FormClass(validators = {@Validator(ToTableForm.FormValidator.class)}) public class ToTableForm { @Input(size = 50) public String schemaName; @Input(size = 2000) public String tableName; @@ -34,7 +35,7 @@ public class ToTableForm { @Input(size = 2000) public String stageTableName; @Input public Boolean clearStageTable; - public static class FormValidator extends Validator { + public static class FormValidator extends AbstractValidator { @Override public void validate(ToTableForm form) { if(form.tableName == null && form.sql == null) {