/** * 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.tajo.rule.base; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.apache.tajo.conf.TajoConf; import org.apache.tajo.rule.EvaluationContext; import org.apache.tajo.rule.EvaluationResult; import org.apache.tajo.rule.SelfDiagnosisRuleVisibility; import org.apache.tajo.rule.EvaluationResult.EvaluationResultCode; import org.apache.tajo.rule.SelfDiagnosisRuleDefinition; import org.apache.tajo.rule.SelfDiagnosisRule; import org.apache.tajo.validation.ConstraintViolation; import org.apache.tajo.validation.ConstraintViolationException; import org.apache.tajo.validation.Validator; @SelfDiagnosisRuleDefinition(category="base", name="TajoConfValidationRule", priority=0) @SelfDiagnosisRuleVisibility.Public public class TajoConfValidationRule implements SelfDiagnosisRule { private Collection<ConstraintViolation> isValidationTestPassed(TajoConf.ConfVars confVar, String varValue) { Set<ConstraintViolation> violationSet = new HashSet<>(); if (varValue != null && confVar.valueClass() != null && confVar.validator() != null) { Class<?> valueClazz = confVar.valueClass(); Validator validator = confVar.validator(); if (Integer.class.getName().equals(valueClazz.getName())) { int intValue = Integer.parseInt(varValue); violationSet.addAll(validator.validate(intValue)); } else if (Long.class.getName().equals(valueClazz.getName())) { long longValue = Long.parseLong(varValue); violationSet.addAll(validator.validate(longValue)); } else if (Float.class.getName().equals(valueClazz.getName())) { float floatValue = Float.parseFloat(varValue); violationSet.addAll(validator.validate(floatValue)); } else { violationSet.addAll(validator.validate(varValue)); } } return violationSet; } @Override public EvaluationResult evaluate(EvaluationContext context) { EvaluationResult result = new EvaluationResult(); Object tajoConfObj = context.getParameter(TajoConf.class.getName()); result.setReturnCode(EvaluationResultCode.OK); if (tajoConfObj != null && tajoConfObj instanceof TajoConf) { TajoConf tajoConf = (TajoConf) tajoConfObj; for (TajoConf.ConfVars confVar: TajoConf.ConfVars.values()) { String varValue = tajoConf.get(confVar.keyname()); Collection<ConstraintViolation> violationSet = isValidationTestPassed(confVar, varValue); if (violationSet.size() > 0) { result.setReturnCode(EvaluationResultCode.ERROR); result.setMessage("Validation Test has been failed on " + confVar.keyname() + ". Actual value is " + varValue); result.setThrowable(new ConstraintViolationException(violationSet)); break; } } } return result; } }