mirror of
https://github.com/apache/sqoop.git
synced 2025-05-16 17:00:53 +08:00
SQOOP-584 Create facility to validate user supplied connection and job forms
git-svn-id: https://svn.apache.org/repos/asf/sqoop/branches/sqoop2@1377757 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9a77b4fff1
commit
c050e18ebc
@ -24,7 +24,7 @@
|
||||
* input gathering process to be broken down into multiple steps that can be
|
||||
* then paged through by the user interface.
|
||||
*/
|
||||
public final class MForm extends MNamedElement {
|
||||
public final class MForm extends MValidatedElement {
|
||||
|
||||
private final List<MInput<?>> inputs;
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
* or a job object.
|
||||
* @param <T> the value type associated with this parameter
|
||||
*/
|
||||
public abstract class MInput<T> extends MNamedElement {
|
||||
public abstract class MInput<T> extends MValidatedElement {
|
||||
private T value;
|
||||
|
||||
protected MInput(String name) {
|
||||
|
@ -28,8 +28,6 @@ public abstract class MNamedElement extends MPersistableEntity {
|
||||
private final String labelKey;
|
||||
private final String helpKey;
|
||||
|
||||
private String errorMessage;
|
||||
|
||||
protected MNamedElement(String name) {
|
||||
this.name = name;
|
||||
|
||||
@ -58,19 +56,5 @@ public String getHelpKey() {
|
||||
return helpKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param errMsg any error message associated with this parameter
|
||||
*/
|
||||
public void setErrorMessage(String errMsg) {
|
||||
this.errorMessage = errMsg;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return any error message associated with this parameter
|
||||
*/
|
||||
public String getErrorMessage() {
|
||||
return this.errorMessage;
|
||||
}
|
||||
|
||||
public abstract String toString();
|
||||
}
|
||||
|
@ -0,0 +1,150 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
/**
|
||||
* Element that can be validated for correctness.
|
||||
*
|
||||
* Two severity levels are supported at the moment - warning and error.
|
||||
*
|
||||
* Warning:
|
||||
* Warning is something suspicious, potentially wrong but something that
|
||||
* can be ignored. For example in case of JDBC URL element, warning would
|
||||
* be if specified host is not responding - it's warning because specified
|
||||
* URL might be wrong. However at the same time URL might be right as only
|
||||
* target host might be down.
|
||||
*
|
||||
* Error:
|
||||
* Error represents unacceptable element content. For example in case of JDBC
|
||||
* URL path, error would be empty element or element containing invalid URL.
|
||||
*/
|
||||
abstract public class MValidatedElement extends MNamedElement {
|
||||
|
||||
/**
|
||||
* Different levels of validation severity.
|
||||
*/
|
||||
public enum Severity {
|
||||
/**
|
||||
* Everything is fine, no issues with this element.
|
||||
*/
|
||||
OK,
|
||||
|
||||
/**
|
||||
* Warning is suspicious content of the element.
|
||||
*/
|
||||
WARNING,
|
||||
|
||||
/**
|
||||
* Error is incorrect, unacceptable content of the element.
|
||||
*/
|
||||
ERROR,
|
||||
}
|
||||
|
||||
/**
|
||||
* Validation message.
|
||||
*
|
||||
* One element can have only one message regardless of the type.
|
||||
*/
|
||||
private String validationMessage;
|
||||
|
||||
/**
|
||||
* Severity of the message.
|
||||
*/
|
||||
private Severity validationSeverity;
|
||||
|
||||
public MValidatedElement(String name) {
|
||||
super(name);
|
||||
// Everything is fine by default
|
||||
this.validationSeverity = Severity.OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set validation message and given severity.
|
||||
*
|
||||
* @param severity Message severity
|
||||
* @param msg Message itself
|
||||
*/
|
||||
public void setValidationMessage(Severity severity, String msg) {
|
||||
this.validationMessage = msg;
|
||||
this.validationSeverity = severity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return validation message for given severity.
|
||||
*
|
||||
* Return either associated message for given severity or null in case
|
||||
* that there is no message with given severity.
|
||||
*
|
||||
* @param severity Message severity
|
||||
*/
|
||||
public String getValidationMessage(Severity severity) {
|
||||
return (validationSeverity == severity) ? validationMessage : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return validation message.
|
||||
*
|
||||
* Return current validation message.
|
||||
*/
|
||||
public String getValidationMessage() {
|
||||
return validationMessage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return message severity.
|
||||
*/
|
||||
public Severity getValidationSeverity() {
|
||||
return validationSeverity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set error message for this element.
|
||||
*
|
||||
* @param errMsg Error message
|
||||
*/
|
||||
public void setErrorMessage(String errMsg) {
|
||||
setValidationMessage(Severity.ERROR, errMsg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return error message associated with this element.
|
||||
*
|
||||
* @return Error message
|
||||
*/
|
||||
public String getErrorMessage() {
|
||||
return getValidationMessage(Severity.ERROR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set warning message for this element.
|
||||
*
|
||||
* @param warnMsg Warning message
|
||||
*/
|
||||
public void setWarningMessage(String warnMsg) {
|
||||
setValidationMessage(Severity.WARNING, warnMsg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve warning message associated with this element.
|
||||
* @return
|
||||
*/
|
||||
public String getWarningMessage() {
|
||||
return getValidationMessage(Severity.WARNING);
|
||||
}
|
||||
|
||||
}
|
@ -32,6 +32,8 @@
|
||||
import org.apache.sqoop.model.MMapInput;
|
||||
import org.apache.sqoop.model.MStringInput;
|
||||
import org.apache.sqoop.connector.spi.SqoopConnector;
|
||||
import org.apache.sqoop.validation.Validator;
|
||||
|
||||
import static org.apache.sqoop.connector.jdbc.GenericJdbcConnectorConstants.*;
|
||||
|
||||
|
||||
@ -118,4 +120,9 @@ public Exporter getExporter() {
|
||||
return EXPORTER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Validator getValidator() {
|
||||
return new Validator();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
import org.apache.sqoop.model.MForm;
|
||||
import org.apache.sqoop.connector.spi.SqoopConnector;
|
||||
import org.apache.sqoop.model.MJobForms;
|
||||
import org.apache.sqoop.validation.Validator;
|
||||
|
||||
public class MySqlJdbcConnector implements SqoopConnector {
|
||||
|
||||
@ -61,4 +62,9 @@ public Exporter getExporter() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Validator getValidator() {
|
||||
return new Validator();
|
||||
}
|
||||
}
|
||||
|
@ -25,6 +25,7 @@
|
||||
import org.apache.sqoop.job.etl.Importer;
|
||||
import org.apache.sqoop.model.MJobForms;
|
||||
import org.apache.sqoop.model.MConnectionForms;
|
||||
import org.apache.sqoop.validation.Validator;
|
||||
|
||||
/**
|
||||
* Service provider interface for Sqoop Connectors.
|
||||
@ -57,4 +58,13 @@ public interface SqoopConnector {
|
||||
*/
|
||||
public Exporter getExporter();
|
||||
|
||||
/**
|
||||
* Returns validation object that Sqoop framework can use to validate user
|
||||
* supplied forms before accepting them. This object will be used both for
|
||||
* connection and job forms.
|
||||
*
|
||||
* @return Validator object
|
||||
*/
|
||||
public Validator getValidator();
|
||||
|
||||
}
|
||||
|
45
spi/src/main/java/org/apache/sqoop/validation/Status.java
Normal file
45
spi/src/main/java/org/apache/sqoop/validation/Status.java
Normal file
@ -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.validation;
|
||||
|
||||
/**
|
||||
* Status modes of a validation process.
|
||||
*/
|
||||
public enum Status {
|
||||
/**
|
||||
* Everything is correct.
|
||||
*
|
||||
* There are no issues, no warnings, nothing.
|
||||
*/
|
||||
FINE,
|
||||
|
||||
/**
|
||||
* Validated entity is correct enough to be processed.
|
||||
*
|
||||
* There might be some warnings, but no errors. It should be safe
|
||||
* to proceed with processing.
|
||||
*/
|
||||
ACCEPTABLE,
|
||||
|
||||
/**
|
||||
* There are serious issues with validated entity.
|
||||
*
|
||||
* We can't proceed until reported issues will be resolved.
|
||||
*/
|
||||
UNACCEPTABLE,
|
||||
}
|
114
spi/src/main/java/org/apache/sqoop/validation/Validator.java
Normal file
114
spi/src/main/java/org/apache/sqoop/validation/Validator.java
Normal file
@ -0,0 +1,114 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
import org.apache.sqoop.model.MConnectionForms;
|
||||
import org.apache.sqoop.model.MForm;
|
||||
import org.apache.sqoop.model.MJob;
|
||||
import org.apache.sqoop.model.MJobForms;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Connection and job metadata validator.
|
||||
*
|
||||
* This class should be extended by connector to provide form validation for
|
||||
* connection and job forms. All methods are returning only validation Status.
|
||||
* List of error and warning messages is directly updated in given structures.
|
||||
* You can use methods getErrorMessage and getWarningMessage to retrieve them
|
||||
* or setErrorMessage and setWarningMessage to set them.
|
||||
*
|
||||
* There are two major use cases of this class - simple and advanced. In simple
|
||||
* mode connector developer should override method validate(MForm). This method
|
||||
* will get exactly one form for validation at the time. All other methods in
|
||||
* default implementation will eventually delegate call to this method. There
|
||||
* is no implicit way how to distinguish between connection and job form or how
|
||||
* to reference different forms.
|
||||
*
|
||||
* In advance usage user should override methods validate(MConnectionForms) and
|
||||
* validate(MJobForms). Both methods will be called with all form gathered so far
|
||||
* and connector developer might use information from all forms to do cross
|
||||
* form validations.
|
||||
*/
|
||||
public class Validator {
|
||||
|
||||
/**
|
||||
* Validate one single form.
|
||||
*
|
||||
* @param form Form to be validated
|
||||
* @return Validation status
|
||||
*/
|
||||
public Status validate(MForm form) {
|
||||
return Status.FINE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method used to validate arbitrary list of forms.
|
||||
*
|
||||
* It's delegating validation to validate(MForm) method. Return
|
||||
* status will be the highest defined in Status enumeration (e.g. the worst).
|
||||
*
|
||||
* @param forms List of forms to be validated
|
||||
* @return Validation status
|
||||
*/
|
||||
protected Status validate(List<MForm> forms) {
|
||||
Status finalStatus = Status.FINE;
|
||||
for (MForm form : forms) {
|
||||
Status status = validate(form);
|
||||
|
||||
if ( finalStatus.compareTo(status) > 0 ) {
|
||||
finalStatus = status;
|
||||
}
|
||||
}
|
||||
|
||||
return finalStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate connection forms.
|
||||
*
|
||||
* This method will be called when user will try to create new connection
|
||||
* in the system. It must return FINE or ACCEPTABLE in order to proceed and
|
||||
* save the job in metadata repository.
|
||||
*
|
||||
* Default implementation will delegate the task to validate(MForm).
|
||||
*
|
||||
* @param connection Connection to be validated
|
||||
* @return Validation status
|
||||
*/
|
||||
public Status validate(MConnectionForms connection) {
|
||||
return validate(connection.getForms());
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate job forms.
|
||||
*
|
||||
* This method will be called when user will try to create new job in the
|
||||
* system. It must return FINE or ACCEPTABLE in order to proceed and save
|
||||
* the job in metadata repository.
|
||||
*
|
||||
* Default implementation will delegate the job to validate(MForm).
|
||||
*
|
||||
* @param job Job to be validated
|
||||
* @return Validation status
|
||||
*/
|
||||
public Status validate(MJobForms job) {
|
||||
return validate(job.getForms());
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user