/* * 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.core.validation; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.resource.EmfResource; import org.teiid.designer.core.util.ModelObjectCollector; /** * Validator looksup the <code>ValidationManager</code> to access the set of * validation rules defines and executes each of them. * * @since 8.0 */ public class Validator { private static final String VALIDATING = ModelerCore.Util.getString("Validator.validating"); //$NON-NLS-1$ private static final String OF = ModelerCore.Util.getString("Validator.of"); //$NON-NLS-1$ private static final String MODEL_OBJECTS = ModelerCore.Util.getString("Validator.modelObjects"); //$NON-NLS-1$ private static final String SPACE = " "; //$NON-NLS-1$ /** * Looks up <code>ValidationManager</code> and gets the set of validation rules * defined for the given EObject, iterates through all the rules and executes each * of them with in the given validation context. * @param eObject The <code>EObject</code> for which validation rules are to be executed * @param context The validation context for the EObject. */ public static void validate(IProgressMonitor monitor, final EmfResource emfResource, final ValidationContext context) { CoreArgCheck.isNotNull(emfResource); CoreArgCheck.isNotNull(context); // create a monitor if needed monitor = monitor != null ? monitor : new NullProgressMonitor(); // clear any existing results on the context context.clearResults(); // Collect all the EObject instances in the EMF resource using the // ModelObjectCollector class to avoid a ConcurrentModificationException // that may occur when using the TreeIterator (emfResource.getAllContents()) final ModelObjectCollector moc = new ModelObjectCollector(emfResource); final List eObjects = moc.getEObjects(); int nObjects = eObjects.size(); int objIncrement = getIncrement(nObjects); //nObjects/100; // Iterate througth the contents of the EmfResource validating each EObject Iterator iter = eObjects.iterator(); SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 100); int iObject = 0; int incCount = 0; String taskMsg = null; while(iter.hasNext() && !monitor.isCanceled()) { // get the last result ValidationResult lastResult = context.getLastResult(); // do not validate the resource any furthur if(lastResult != null && lastResult.isFatalResource()) { return; } if( incCount == objIncrement ) { incCount = 1; taskMsg = VALIDATING + SPACE + iObject + SPACE + OF + SPACE + nObjects + SPACE + MODEL_OBJECTS; subMonitor.subTask(taskMsg); } else { incCount++; } validateObject(monitor, iter.next(), context); iObject++; } // validate the resource itself after validating the contents validateObject(monitor, emfResource, context); } private static int getIncrement(final int nObjects) { if( nObjects <= 200 ) return 10; if( nObjects <= 1000 ) return 50; if( nObjects <= 5000 ) return 100; if( nObjects <= 10000 ) return 200; return 500; } /** * Looks up <code>ValidationManager</code> and gets the set of validation rules * defined for the given EObject, iterates through all the rules and executes each * of them with in the given validation context. * @param eObject The <code>EObject</code> for which validation rules are to be executed * @param context The validation context for the EObject. */ public static void validateObject(IProgressMonitor monitor, final Object object, final ValidationContext context) { CoreArgCheck.isNotNull(object); CoreArgCheck.isNotNull(context); // create a monitor if needed monitor = monitor != null ? monitor : new NullProgressMonitor(); // path to the object in the workspcase // if(object instanceof EObject) { // String objectPath = ModelerCore.getModelEditor().getModelRelativatePath((EObject)object).toString(); // // need to truncate objectPath as the monitor uses it to update the status bar and anything extremely // // large was taking an enormous amount of time // if (objectPath.length() > ModelBuildUtil.MONITOR_TASK_NAME_MAX_LENGTH) { // objectPath = objectPath.substring(0, ModelBuildUtil.MONITOR_TASK_NAME_MAX_LENGTH) + ModelBuildUtil.TASK_NAME_TRUNCTATION_SUFFIX; //$NON-NLS-1$ // } // // monitor.subTask(ModelBuildUtil.MONITOR_OBJECT_VALIDATION_MSG + objectPath); // } ValidationRuleManager ruleManager = ModelerCore.getValidationRuleManager(); ValidationRuleSet ruleSet = ruleManager.getRuleSet(object, context); if(ruleSet != null && ruleSet.hasRules()) { ruleSet.validate(monitor, object,context); } } }