/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.metamodels.relational.aspects.validation.rules;
import java.util.Iterator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.core.validation.ObjectValidationRule;
import org.teiid.designer.core.validation.ValidationContext;
import org.teiid.designer.core.validation.ValidationProblem;
import org.teiid.designer.core.validation.ValidationProblemImpl;
import org.teiid.designer.core.validation.ValidationResult;
import org.teiid.designer.core.validation.ValidationResultImpl;
import org.teiid.designer.metamodels.relational.DirectionKind;
import org.teiid.designer.metamodels.relational.Procedure;
import org.teiid.designer.metamodels.relational.ProcedureParameter;
import org.teiid.designer.metamodels.relational.RelationalPlugin;
/**
* ProcedureParametersRule
*
* @since 8.0
*/
public class ProcedureParametersRule implements ObjectValidationRule {
/*
* @See org.teiid.designer.core.validation.ObjectValidationRule#validate(org.eclipse.emf.ecore.EObject, org.teiid.designer.core.validation.ValidationContext)
*/
@Override
public void validate(EObject eObject, ValidationContext context) {
CoreArgCheck.isInstanceOf(Procedure.class, eObject);
Procedure procedure = (Procedure) eObject;
ValidationResult result = new ValidationResultImpl(eObject);
// get the procedure parameters, check the direction on the
// parameter
// 1) Warn if the parameter direction is not set.
// 2) Warn if the parameter direction is 'UNKNOWN".
// 3) Error if more than one paramter is of 'RETURN' direction.
Iterator paramIter = procedure.getParameters().iterator();
boolean foundReturnParam = false;
while(paramIter.hasNext()) {
ProcedureParameter param = (ProcedureParameter) paramIter.next();
DirectionKind direction = param.getDirection();
if(direction == null) {
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, RelationalPlugin.Util.getString("ProcedureParametersRule.Parameter_{0}_does_not_have_a_direction._1", new Object[]{param.getName()})); //$NON-NLS-1$
result.addProblem(problem);
}
// validate the direction of the parameters in the procedure
int directionKind = direction.getValue();
if(directionKind == DirectionKind.UNKNOWN) {
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, RelationalPlugin.Util.getString("ProcedureParametersRule.Parameter_{0}_has_an_UNKNOWN_direction._1", new Object[]{param.getName()})); //$NON-NLS-1$
result.addProblem(problem);
} else if(directionKind == DirectionKind.RETURN) {
if(!foundReturnParam) {
foundReturnParam = true;
continue;
}
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, RelationalPlugin.Util.getString("ProcedureParametersRule.Procedure_{0}_has_more_than_one_parameter_with_RETURN_direction._1", new Object[]{procedure.getName()})); //$NON-NLS-1$
result.addProblem(problem);
context.addResult(result);
return;
}
}
// Need to validate for Pushdown Functions if "FUNCTION = TRUE" property set
// 1) Can have multiple input parameters
// 2) Requires "Output Parameter" and CANNOT have multiple
if( procedure.isFunction() ) {
paramIter = procedure.getParameters().iterator();
while(paramIter.hasNext()) {
ProcedureParameter param = (ProcedureParameter) paramIter.next();
DirectionKind direction = param.getDirection();
int directionKind = direction.getValue();
if( directionKind == DirectionKind.INOUT ||
directionKind == DirectionKind.OUT ||
directionKind == DirectionKind.UNKNOWN ) {
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, RelationalPlugin.Util.getString("ProcedureParametersRule.Procedure_{0}_is_defined_as_function_and_can_only_have_in_parameters_and_one_return_parameter", new Object[]{procedure.getName()})); //$NON-NLS-1$
result.addProblem(problem);
}
}
}
// add the result to the context
context.addResult(result);
}
}