/*
* 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.transformation.aspects.validation.rules;
import java.util.Iterator;
import java.util.List;
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.mapping.factory.DefaultMappableTree;
import org.teiid.designer.mapping.factory.IMappableTree;
import org.teiid.designer.mapping.factory.TreeMappingAdapter;
import org.teiid.designer.metamodels.transformation.InputBinding;
import org.teiid.designer.metamodels.transformation.InputParameter;
import org.teiid.designer.metamodels.transformation.MappingClass;
import org.teiid.designer.metamodels.transformation.MappingClassSet;
import org.teiid.designer.metamodels.xml.XmlDocument;
import org.teiid.designer.transformation.TransformationPlugin;
/**
* InputParameterValidationRule
*
* @since 8.0
*/
public class InputParameterValidationRule implements ObjectValidationRule {
/* (non-Javadoc)
* @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(InputParameter.class, eObject);
InputParameter inputParam = (InputParameter) eObject;
if(inputParam != null) {
MappingClass mappingClass = inputParam.getInputSet().getMappingClass();
Iterator bindingIterator = mappingClass.getMappingClassSet().getInputBinding().iterator();
// try to find the binding for the input parameter
InputBinding foundBinding = null;
while(foundBinding == null && bindingIterator.hasNext()) {
InputBinding binding = (InputBinding) bindingIterator.next();
InputParameter bindingParam = binding.getInputParameter();
if(bindingParam != null && bindingParam.equals(inputParam)) {
foundBinding = binding;
}
}
// if the input parameter is unbounded, there should be an error
if(foundBinding == null) {
String msg = TransformationPlugin.Util.getString("InputParameterValidationRule.The_inputParameter_{0}_on_the_inputSet_of_the_MappingClass_{1}_is_not_bound_to_any_mappingClass_column._1", inputParam.getName(), mappingClass.getName()); //$NON-NLS-1$
ValidationProblem failureProblem = new ValidationProblemImpl(0, IStatus.ERROR, msg);
ValidationResult validationResult = new ValidationResultImpl(eObject);
validationResult.addProblem(failureProblem);
context.addResult(validationResult);
} else {
EObject mcs = mappingClass.eContainer();
CoreArgCheck.isInstanceOf(MappingClassSet.class, mcs);
EObject target = ((MappingClassSet)mcs).getTarget();
CoreArgCheck.isInstanceOf(XmlDocument.class, target);
XmlDocument document = (XmlDocument)target;
TreeMappingAdapter mappingAdapter = new TreeMappingAdapter(document);
IMappableTree mappableTree = new DefaultMappableTree(document);
List parentMCs = XmlDocumentValidationRule.getParentMappingClasses(mappingClass,mappingAdapter,mappableTree);
boolean validColumn = false;
for (Iterator i = parentMCs.iterator(); i.hasNext() && !validColumn;) {
MappingClass parent = (MappingClass)i.next();
if (parent.getColumns().contains(foundBinding.getMappingClassColumn())) {
validColumn = true;
}
}
if (!validColumn) {
String msg = TransformationPlugin.Util.getString("InputParameterValidationRule.Invalid_binding", inputParam.getName(), mappingClass.getName()); //$NON-NLS-1$
ValidationProblem failureProblem = new ValidationProblemImpl(0, IStatus.ERROR, msg);
ValidationResult validationResult = new ValidationResultImpl(eObject);
validationResult.addProblem(failureProblem);
context.addResult(validationResult);
}
}
}
}
}