/* * 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.common.util.EList; 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.Column; import org.teiid.designer.metamodels.relational.ForeignKey; import org.teiid.designer.metamodels.relational.RelationalPlugin; import org.teiid.designer.metamodels.relational.UniqueKey; /** * ForeignKeyColumnsRule * * @since 8.0 */ public class ForeignKeyColumnsRule 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(ForeignKey.class, eObject); ForeignKey foreignKey = (ForeignKey) eObject; // get the unique key reference UniqueKey uniqueKey = foreignKey.getUniqueKey(); // unique key reference not set, nothing to validate // there is already a validatio error if(uniqueKey == null) { return; } // get the columns from the forign key and the unique key it references // compare the number of columns on each EList fkColumns = foreignKey.getColumns(); EList ukColumns = uniqueKey.getColumns(); int numFkColumns = fkColumns.size(); int numUkColumns = ukColumns.size(); // column references not set on fk or uk, nothing // to validate there are validation errors already if(numFkColumns == 0 || numUkColumns == 0) { return; } else if(numFkColumns != numUkColumns) { ValidationResult result = new ValidationResultImpl(eObject); // create validation problem and add it to the result final String msg = RelationalPlugin.Util.getString("ForeignKeyColumnsRule.The_number_of_columns_on_the_foreignkey__1")+foreignKey.getName() //$NON-NLS-1$ +RelationalPlugin.Util.getString("ForeignKeyColumnsRule._do_not_match_the_number_of_columns_on_the_referenced_uniquekey__2")+uniqueKey.getName(); //$NON-NLS-1$ ValidationProblem problem = new ValidationProblemImpl(0, IStatus.ERROR ,msg); result.addProblem(problem); context.addResult(result); return; } // if the column count is the same on fks and uks, // compare the datatypes on the columns Iterator fkColIter = fkColumns.iterator(); Iterator ukColIter = ukColumns.iterator(); while(fkColIter.hasNext() && ukColIter.hasNext()) { Column fkColumn = (Column) fkColIter.next(); Column ukColumn = (Column) ukColIter.next(); EObject fkType = fkColumn.getType(); EObject ukType = ukColumn.getType(); // one of the columns does not have a datatype set // so there is already a problem, no need to validate furthur if(fkType == null || ukType == null) { return; } else if(!fkType.equals(ukType)) { ValidationResult result = new ValidationResultImpl(eObject); // create validation problem and add it to the result final String msg = RelationalPlugin.Util.getString("ForeignKeyColumnsRule.The_datatype_of_the_column__3")+fkColumn.getName()+RelationalPlugin.Util.getString("ForeignKeyColumnsRule._on_the_foreignKey__4")+foreignKey.getName() //$NON-NLS-1$ //$NON-NLS-2$ +RelationalPlugin.Util.getString("ForeignKeyColumnsRule._doesn__t_match_the_that_of_the__5")+ukColumn.getName()+RelationalPlugin.Util.getString("ForeignKeyColumnsRule._on_the_referenced_uniquekey__6")+uniqueKey.getName(); //$NON-NLS-1$ //$NON-NLS-2$ ValidationProblem problem = new ValidationProblemImpl(0, IStatus.WARNING, msg); result.addProblem(problem); context.addResult(result); return; } } } }