/**
* 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.ambari.view.property;
import org.apache.ambari.view.ViewContext;
import org.apache.ambari.view.ViewInstanceDefinition;
import org.apache.ambari.view.validation.Validator;
import org.apache.ambari.view.validation.ValidationResult;
import java.util.Map;
import java.net.URL;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
/**
* The validator class for the PropertyValidator view.
*
*/
public class MyValidator implements Validator {
private static final String PARAMETER_NAME_FREEFORM = "freeform";
private static final String PARAMETER_NAME_INTEGER = "integer";
private static final String PARAMETER_NAME_FIRST_VALUE = "first.value";
private static final String PARAMETER_NAME_SECOND_VALUE = "second.value";
private static final String PARAMETER_NAME_URL = "url";
private static final int SECOND_VALUE_MAX = 100;
@Override
public ValidationResult validateInstance(ViewInstanceDefinition definition, ValidationContext mode) {
// get the instance props
Map<String,String> props = definition.getPropertyMap();
// do a check to confirm first is less than or equals to second
return validateParameterFirstSecondValues(props);
}
@Override
public ValidationResult validateProperty(String property, ViewInstanceDefinition definition, ValidationContext mode) {
if (property.equals(PARAMETER_NAME_FREEFORM)) {
// do nothing, this property can be free form
} else if (property.equals(PARAMETER_NAME_URL)) {
return validateParameterURL(definition.getPropertyMap());
} else if (property.equals(PARAMETER_NAME_INTEGER)) {
return validateParameterInteger(definition.getPropertyMap());
} else if (property.equals(PARAMETER_NAME_FIRST_VALUE)) {
return validateParameterFirst(definition.getPropertyMap());
} else if (property.equals(PARAMETER_NAME_SECOND_VALUE)) {
return validateParameterSecond(definition.getPropertyMap());
}
return ValidationResult.SUCCESS;
}
/**
* Validates the parameter URL.
*
* @param properties the view instance parameters
* @return the validation result
*/
private ValidationResult validateParameterURL(Map<String,String> properties) {
String urlProp = properties.get(PARAMETER_NAME_URL);
URL u = null;
try {
u = new URL(urlProp);
} catch (MalformedURLException e) {
return new MyValidationResult(false, "Must be valid URL");
}
try {
u.toURI();
} catch (URISyntaxException e) {
return new MyValidationResult(false, "Must be valid URL");
}
return ValidationResult.SUCCESS;
}
/**
* Validates the parameter Integer.
*
* @param properties the view instance parameters
* @return the validation result
*/
private ValidationResult validateParameterInteger(Map<String,String> properties) {
String val = properties.get(PARAMETER_NAME_INTEGER);
int intValue = -1;
try {
checkInteger(val);
} catch (NumberFormatException nfe) {
return new MyValidationResult(false, "Must be an integer");
}
return ValidationResult.SUCCESS;
}
/**
* Validates the parameter first value.
*
* @param properties the view instance parameters
* @return the validation result
*/
private ValidationResult validateParameterFirst(Map<String,String> properties) {
String val = properties.get(PARAMETER_NAME_FIRST_VALUE);
int intValue = -1;
try {
checkInteger(val);
} catch (NumberFormatException nfe) {
return new MyValidationResult(false, "Must be an integer");
}
return ValidationResult.SUCCESS;
}
/**
* Validates the parameter second value.
*
* @param properties the view instance parameters
* @return the validation result
*/
private ValidationResult validateParameterSecond(Map<String,String> properties) {
String val = properties.get(PARAMETER_NAME_SECOND_VALUE);
int intValue = -1;
try {
intValue = checkInteger(val);
} catch (NumberFormatException nfe) {
return new MyValidationResult(false, "Must be an integer");
}
if (intValue > SECOND_VALUE_MAX)
return new MyValidationResult(false, "Must be less than "+SECOND_VALUE_MAX);
return ValidationResult.SUCCESS;
}
/**
* Validates the parameter First and Second values.
*
* @param properties the view instance parameters
* @return the validation result
*/
private ValidationResult validateParameterFirstSecondValues(Map<String,String> properties) {
// check that first is an int
String firstValue = properties.get(PARAMETER_NAME_FIRST_VALUE);
int firstIntValue = -1;
try {
firstIntValue = checkInteger(firstValue);
} catch (NumberFormatException nfe) {
return new MyValidationResult(false, "Must be an integer");
}
// check that second is an int
String secondValue = properties.get(PARAMETER_NAME_SECOND_VALUE);
int secondIntValue = -1;
try {
secondIntValue = checkInteger(secondValue);
} catch (NumberFormatException nfe) {
return new MyValidationResult(false, "Must be an integer");
}
// check that second >= first
if (secondIntValue < firstIntValue)
return new MyValidationResult(false, "Second value must be greater or equal to first");
return ValidationResult.SUCCESS;
}
/**
* Check integer.
*
* @param value the value
* @return the resulting integer
* @throws NumberFormatException if the value is not a valid integer
*/
private static int checkInteger(String value) {
return Integer.parseInt(value);
}
/**
* Represents a validation result for this validator.
*
*/
private static class MyValidationResult implements ValidationResult {
private boolean valid;
private String details;
/**
* Constructor.
*
* @param valid if <code>true</code>, result is valid
* @param details the details of the result
*
*/
public MyValidationResult(boolean valid, String details) {
this.valid = valid;
this.details = details;
}
@Override
public boolean isValid() {
return this.valid;
}
@Override
public String getDetail() {
return this.details;
}
} // end inner MyValidationResult class
} // end MyValidator class