/*
* 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 org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.mapping.Mapping;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.core.ModelEditor;
import org.teiid.designer.core.ModelerCore;
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.transformation.TransformationMapping;
import org.teiid.designer.transformation.TransformationPlugin;
/**
* TransformationMappingValidationRule
*
* @since 8.0
*/
public class TransformationMappingValidationRule implements ObjectValidationRule {
private static char DELIMITER = '.';
/*
* @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(TransformationMapping.class, eObject);
Mapping transMapping = (Mapping) eObject;
String problemMessage = getProblem(transMapping);
if(problemMessage != null) {
ValidationResult validationResult = new ValidationResultImpl(eObject);
// create validation problem and addit to the resuls
ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR, problemMessage);
validationResult.addProblem(problem);
context.addResult(validationResult);
}
}
/**
* Return a problem message after validating the Mapping object.
*/
private String getProblem(Mapping transMapping) {
EList outputs = transMapping.getOutputs();
EList inputs = transMapping.getInputs();
String modelName = getModelName(transMapping);
// Check for unresolved proxies in the inputs
for (Iterator iter = inputs.iterator(); iter.hasNext();) {
EObject inputElement = (EObject)iter.next();
if (inputElement.eIsProxy()) {
Object[] params = new Object[]{modelName,((InternalEObject)inputElement).eProxyURI()};
return TransformationPlugin.Util.getString("TransformationMappingValidationRule.Sql_transformation_in_the_model_contains_the_unresolved_reference_1",params); //$NON-NLS-1$
}
}
String inputElements = getInputNames(inputs);
if(outputs.size() < 1) {
if(!inputElements.equals(CoreStringUtil.Constants.EMPTY_STRING)) {
return TransformationPlugin.Util.getString("TransformationMappingValidationRule.Sql_transformation_in_the_model__1")+modelName+TransformationPlugin.Util.getString("TransformationMappingValidationRule._does_not_have_targets_mapped_for_source_element/s__2")+inputElements; //$NON-NLS-1$ //$NON-NLS-2$
}
return TransformationPlugin.Util.getString("TransformationMappingValidationRule.Sql_transformation_in_the_model__3")+modelName+TransformationPlugin.Util.getString("TransformationMappingValidationRule._does_not_have_target_elements._4"); //$NON-NLS-1$ //$NON-NLS-2$
} else if(outputs.size() > 1) {
if(!inputElements.equals(CoreStringUtil.Constants.EMPTY_STRING)) {
return TransformationPlugin.Util.getString("TransformationMappingValidationRule.Sql_transformation_in_the_model__5")+modelName+TransformationPlugin.Util.getString("TransformationMappingValidationRule._cannot_have_multiple_targets_mapped_for_source_element/s__6")+inputElements; //$NON-NLS-1$ //$NON-NLS-2$
}
return TransformationPlugin.Util.getString("TransformationMappingValidationRule.Sql_transformation_in_the_model__7")+modelName+TransformationPlugin.Util.getString("TransformationMappingValidationRule._cannot_have_multiple_target_elements._8"); //$NON-NLS-1$ //$NON-NLS-2$
}
return null;
}
/**
* Get the model name of an EObject
*/
private String getModelName(EObject eObj) {
ModelEditor modelEditor = ModelerCore.getModelEditor();
return modelEditor.getModelName(eObj).toString();
}
/**
* Get the fully qualified name of an EObject
*/
private String getName(EObject eObj) {
ModelEditor modelEditor = ModelerCore.getModelEditor();
String objectPath = modelEditor.getModelRelativePathIncludingModel(eObj).toString();
return objectPath.replace(IPath.SEPARATOR, DELIMITER);
}
/**
* Return a String containing fully qualified names of the EObjects in the given list.
*/
private String getInputNames(EList inputs) {
Iterator inputIter = inputs.iterator();
StringBuffer buf = new StringBuffer();
while(inputIter.hasNext()) {
EObject inputElement = (EObject) inputIter.next();
String elementName = getName(inputElement);
buf.append(elementName);
if(inputIter.hasNext()) {
buf.append(", "); //$NON-NLS-1$
}
}
return buf.toString();
}
}