mirror of
https://github.com/apache/sqoop.git
synced 2025-05-10 04:50:29 +08:00
Sqoop2: Validations: Provide Validation annotations
This commit is contained in:
parent
d8e336b3ea
commit
1a0e04ec4b
@ -17,14 +17,25 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.sqoop.model;
|
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.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class annotation. Each class that is used a configuration object where user
|
* Class annotation. Each class that is used a configuration object where user
|
||||||
* is expected to provide input need to have this annotation.
|
* is expected to provide input need to have this annotation.
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
public @interface ConfigurationClass {
|
public @interface ConfigurationClass {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of validators associated with this Configuration class.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Class<? extends Validator>[] validators() default {};
|
||||||
}
|
}
|
||||||
|
@ -17,13 +17,18 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.sqoop.model;
|
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.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Denote configuration class
|
* Denote configuration class
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
public @interface FormClass {
|
public @interface FormClass {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -32,4 +37,11 @@
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
short defaultSize() default -1;
|
short defaultSize() default -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of validators associated with this form.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Class<? extends Validator>[] validators() default {};
|
||||||
}
|
}
|
||||||
|
@ -17,14 +17,19 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.sqoop.model;
|
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.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Field annotation. Each field that user might change in configuration object
|
* Field annotation. Each field that user might change in configuration object
|
||||||
* need to have this annotation.
|
* need to have this annotation.
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
public @interface Input {
|
public @interface Input {
|
||||||
/**
|
/**
|
||||||
* Sqoop framework will ensure that sensitive information will not be easily
|
* Sqoop framework will ensure that sensitive information will not be easily
|
||||||
@ -40,4 +45,11 @@
|
|||||||
* @return Maximal length
|
* @return Maximal length
|
||||||
*/
|
*/
|
||||||
short size() default -1;
|
short size() default -1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of validators associated with this input.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Class<? extends Validator>[] validators() default {};
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validation message.
|
||||||
|
*
|
||||||
|
* Validation message have always two parts - severity and textual information about what
|
||||||
|
* is wrong. It can be associated with Input, Form or Configuration class.
|
||||||
|
*/
|
||||||
|
public class Message {
|
||||||
|
private Status status;
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public Message(Status status, String message) {
|
||||||
|
this.status = status;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Status getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (!(o instanceof Message)) return false;
|
||||||
|
|
||||||
|
Message message1 = (Message) o;
|
||||||
|
|
||||||
|
if (message != null ? !message.equals(message1.message) : message1.message != null)
|
||||||
|
return false;
|
||||||
|
if (status != message1.status) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = status != null ? status.hashCode() : 0;
|
||||||
|
result = 31 * result + (message != null ? message.hashCode() : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "{" + status.name() + ": " + message + "}";
|
||||||
|
}
|
||||||
|
}
|
@ -19,24 +19,26 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Status modes of a validation process.
|
* Status modes of a validation process.
|
||||||
|
*
|
||||||
|
* TODO: This should really be renamed to "severity"
|
||||||
*/
|
*/
|
||||||
public enum Status {
|
public enum Status {
|
||||||
/**
|
/**
|
||||||
* There are no issues, no warnings. Everything is correct.
|
* There are no issues, no warnings. Everything is correct.
|
||||||
*/
|
*/
|
||||||
FINE,
|
FINE, // TODO: Rename to "OK"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validated entity is correct enough to be processed. There might be some
|
* Validated entity is correct enough to be processed. There might be some
|
||||||
* warnings, but no errors.
|
* warnings, but no errors.
|
||||||
*/
|
*/
|
||||||
ACCEPTABLE,
|
ACCEPTABLE, // TODO: Rename to "WARNING"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* There are serious issues with validated entity. We can't proceed until
|
* There are serious issues with validated entity. We can't proceed until
|
||||||
* reported issues will be resolved.
|
* reported issues will be resolved.
|
||||||
*/
|
*/
|
||||||
UNACCEPTABLE,
|
UNACCEPTABLE, // TODO: Rename to "ERROR"
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* 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.Message;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that given String Input is a class that is available to this JVM.
|
||||||
|
*/
|
||||||
|
public class ClassAvailable extends Validator<String> {
|
||||||
|
@Override
|
||||||
|
public void validate(String klass) {
|
||||||
|
try {
|
||||||
|
Class.forName(klass);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
addMessage(new Message(Status.UNACCEPTABLE, "Class not found"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that given String is not empty.
|
||||||
|
*
|
||||||
|
* Will also ensure that the string is not null.
|
||||||
|
*/
|
||||||
|
public class NotEmpty extends Validator<String> {
|
||||||
|
@Override
|
||||||
|
public void validate(String instance) {
|
||||||
|
if (instance == null || instance.isEmpty()) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Can't be null nor empty");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that given object is never null.
|
||||||
|
*/
|
||||||
|
public class NotNull<T> extends Validator<T> {
|
||||||
|
@Override
|
||||||
|
public void validate(T instance) {
|
||||||
|
if (instance == null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Can't be null");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
* 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.Message;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract validator class.
|
||||||
|
*
|
||||||
|
* Can be used to validate inputs, forms and configuration classes.
|
||||||
|
*/
|
||||||
|
abstract public class Validator<T> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validation check.
|
||||||
|
*
|
||||||
|
* To be implemented by our children.
|
||||||
|
*
|
||||||
|
* @param instance Object to validate (depending on what we are validating)
|
||||||
|
*/
|
||||||
|
abstract public void validate(T instance);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Messages generated during validation.
|
||||||
|
*/
|
||||||
|
private List<Message> messages;
|
||||||
|
|
||||||
|
public Validator() {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addMessage(Message msg) {
|
||||||
|
messages.add(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addMessage(Status status, String msg) {
|
||||||
|
messages.add(new Message(status, msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Message> getMessages() {
|
||||||
|
return messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset validator state (all previous messages).
|
||||||
|
*/
|
||||||
|
public void reset() {
|
||||||
|
messages = new LinkedList<Message>();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
* 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.Message;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public class TestClassAvailable {
|
||||||
|
|
||||||
|
Validator validator = new ClassAvailable();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
List<Message> messages;
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate(ClassAvailable.class.getCanonicalName());
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate("java.lang.String");
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate("net.jarcec.super.private.project.Main");
|
||||||
|
assertEquals(1, validator.getMessages().size());
|
||||||
|
messages = validator.getMessages();
|
||||||
|
assertEquals(Status.UNACCEPTABLE, messages.get(0).getStatus());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
/**
|
||||||
|
* 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.Message;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public class TestNotEmpty {
|
||||||
|
|
||||||
|
Validator validator = new NotEmpty();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
List<Message> messages;
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate("Non empty");
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate("");
|
||||||
|
assertEquals(1, validator.getMessages().size());
|
||||||
|
messages = validator.getMessages();
|
||||||
|
assertEquals(Status.UNACCEPTABLE, messages.get(0).getStatus());
|
||||||
|
|
||||||
|
validator.reset();
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate(null);
|
||||||
|
assertEquals(1, validator.getMessages().size());
|
||||||
|
messages = validator.getMessages();
|
||||||
|
assertEquals(Status.UNACCEPTABLE, messages.get(0).getStatus());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* 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.Message;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public class TestNotNull {
|
||||||
|
|
||||||
|
Validator validator = new NotNull();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate("");
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate("Non empty");
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
|
||||||
|
validator.validate(null);
|
||||||
|
assertEquals(1, validator.getMessages().size());
|
||||||
|
|
||||||
|
List<Message> messages = validator.getMessages();
|
||||||
|
Message msg = messages.get(0);
|
||||||
|
assertEquals(Status.UNACCEPTABLE, msg.getStatus());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
/**
|
||||||
|
* 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.Message;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TestValidator {
|
||||||
|
public static class ValidatorImpl extends Validator<String> {
|
||||||
|
@Override
|
||||||
|
public void validate(String msg) {
|
||||||
|
addMessage(Status.FINE, msg);
|
||||||
|
addMessage(new Message(Status.UNACCEPTABLE, "Prefix: " + msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
ValidatorImpl validator = new ValidatorImpl();
|
||||||
|
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
validator.validate("X");
|
||||||
|
assertEquals(2, validator.getMessages().size());
|
||||||
|
|
||||||
|
Message msg = validator.getMessages().get(0);
|
||||||
|
assertEquals(Status.FINE, msg.getStatus());
|
||||||
|
assertEquals("X", msg.getMessage());
|
||||||
|
|
||||||
|
msg = validator.getMessages().get(1);
|
||||||
|
assertEquals(Status.UNACCEPTABLE, msg.getStatus());
|
||||||
|
assertEquals("Prefix: X", msg.getMessage());
|
||||||
|
|
||||||
|
validator.reset();
|
||||||
|
assertEquals(0, validator.getMessages().size());
|
||||||
|
}
|
||||||
|
}
|
@ -19,17 +19,44 @@
|
|||||||
|
|
||||||
import org.apache.sqoop.model.FormClass;
|
import org.apache.sqoop.model.FormClass;
|
||||||
import org.apache.sqoop.model.Input;
|
import org.apache.sqoop.model.Input;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
import org.apache.sqoop.validation.validators.NotEmpty;
|
||||||
|
import org.apache.sqoop.validation.validators.Validator;
|
||||||
|
import org.apache.sqoop.validation.validators.ClassAvailable;
|
||||||
|
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@FormClass
|
@FormClass(validators = {ConnectionForm.FormValidator.class})
|
||||||
public class ConnectionForm {
|
public class ConnectionForm {
|
||||||
@Input(size = 128) public String jdbcDriver;
|
@Input(size = 128, validators = {NotEmpty.class, ClassAvailable.class} )
|
||||||
@Input(size = 128) public String connectionString;
|
public String jdbcDriver;
|
||||||
@Input(size = 40) public String username;
|
|
||||||
@Input(size = 40, sensitive = true) public String password;
|
@Input(size = 128, validators = {NotEmpty.class} )
|
||||||
@Input public Map<String, String> jdbcProperties;
|
public String connectionString;
|
||||||
|
|
||||||
|
@Input(size = 40)
|
||||||
|
public String username;
|
||||||
|
|
||||||
|
@Input(size = 40, sensitive = true)
|
||||||
|
public String password;
|
||||||
|
|
||||||
|
@Input
|
||||||
|
public Map<String, String> jdbcProperties;
|
||||||
|
|
||||||
|
public static class FormValidator extends Validator<ConnectionForm> {
|
||||||
|
@Override
|
||||||
|
public void validate(ConnectionForm form) {
|
||||||
|
// See if we can connect to the database
|
||||||
|
try {
|
||||||
|
DriverManager.getConnection(form.connectionString, form.username, form.password);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
addMessage(Status.ACCEPTABLE, "Can't connect to the database with given credentials: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,19 +17,59 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.sqoop.connector.jdbc.configuration;
|
package org.apache.sqoop.connector.jdbc.configuration;
|
||||||
|
|
||||||
|
import org.apache.sqoop.connector.jdbc.GenericJdbcConnectorConstants;
|
||||||
import org.apache.sqoop.model.FormClass;
|
import org.apache.sqoop.model.FormClass;
|
||||||
import org.apache.sqoop.model.Input;
|
import org.apache.sqoop.model.Input;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
import org.apache.sqoop.validation.validators.Validator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@FormClass
|
@FormClass( validators = {FromTableForm.FormValidator.class})
|
||||||
public class FromTableForm {
|
public class FromTableForm {
|
||||||
@Input(size = 50) public String schemaName;
|
@Input(size = 50)
|
||||||
@Input(size = 50) public String tableName;
|
public String schemaName;
|
||||||
@Input(size = 2000) public String sql;
|
|
||||||
@Input(size = 50) public String columns;
|
@Input(size = 50)
|
||||||
@Input(size = 50) public String partitionColumn;
|
public String tableName;
|
||||||
@Input public Boolean partitionColumnNull;
|
|
||||||
@Input(size = 50) public String boundaryQuery;
|
@Input(size = 2000, validators = {SqlConditionTokenValidator.class})
|
||||||
|
public String sql;
|
||||||
|
|
||||||
|
@Input(size = 50)
|
||||||
|
public String columns;
|
||||||
|
|
||||||
|
@Input(size = 50)
|
||||||
|
public String partitionColumn;
|
||||||
|
|
||||||
|
@Input
|
||||||
|
public Boolean partitionColumnNull;
|
||||||
|
|
||||||
|
@Input(size = 50)
|
||||||
|
public String boundaryQuery;
|
||||||
|
|
||||||
|
public static class FormValidator extends Validator<FromTableForm> {
|
||||||
|
@Override
|
||||||
|
public void validate(FromTableForm form) {
|
||||||
|
if(form.tableName == null && form.sql == null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Either fromTable name or SQL must be specified");
|
||||||
|
}
|
||||||
|
if(form.tableName != null && form.sql != null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Both fromTable name and SQL cannot be specified");
|
||||||
|
}
|
||||||
|
if(form.schemaName != null && form.sql != null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Both schema name and SQL cannot be specified");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class SqlConditionTokenValidator extends Validator<String> {
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,11 +19,13 @@
|
|||||||
|
|
||||||
import org.apache.sqoop.model.FormClass;
|
import org.apache.sqoop.model.FormClass;
|
||||||
import org.apache.sqoop.model.Input;
|
import org.apache.sqoop.model.Input;
|
||||||
|
import org.apache.sqoop.validation.Status;
|
||||||
|
import org.apache.sqoop.validation.validators.Validator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@FormClass
|
@FormClass(validators = {ToTableForm.FormValidator.class})
|
||||||
public class ToTableForm {
|
public class ToTableForm {
|
||||||
@Input(size = 50) public String schemaName;
|
@Input(size = 50) public String schemaName;
|
||||||
@Input(size = 2000) public String tableName;
|
@Input(size = 2000) public String tableName;
|
||||||
@ -31,4 +33,22 @@ public class ToTableForm {
|
|||||||
@Input(size = 50) public String columns;
|
@Input(size = 50) public String columns;
|
||||||
@Input(size = 2000) public String stageTableName;
|
@Input(size = 2000) public String stageTableName;
|
||||||
@Input public Boolean clearStageTable;
|
@Input public Boolean clearStageTable;
|
||||||
|
|
||||||
|
public static class FormValidator extends Validator<ToTableForm> {
|
||||||
|
@Override
|
||||||
|
public void validate(ToTableForm form) {
|
||||||
|
if(form.tableName == null && form.sql == null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Either fromTable name or SQL must be specified");
|
||||||
|
}
|
||||||
|
if(form.tableName != null && form.sql != null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Both fromTable name and SQL cannot be specified");
|
||||||
|
}
|
||||||
|
if(form.tableName == null && form.stageTableName != null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Stage fromTable name cannot be specified without specifying fromTable name");
|
||||||
|
}
|
||||||
|
if(form.stageTableName == null && form.clearStageTable != null) {
|
||||||
|
addMessage(Status.UNACCEPTABLE, "Clear stage fromTable cannot be specified without specifying name of the stage fromTable.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user