package org.xtest.ui.validation; import java.util.Map; import org.eclipse.emf.common.util.DiagnosticChain; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EValidator; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.validation.CancelableDiagnostician; import org.eclipse.xtext.validation.CheckMode; import org.xtest.results.XTestResult; import org.xtest.ui.mediator.ValidationFinishedEvent; import org.xtest.ui.mediator.XtestResultsCache; import org.xtest.ui.resource.XtestDependencyAcceptingResource; import org.xtest.xTest.Body; import com.google.common.eventbus.EventBus; import com.google.inject.Inject; /** * Custom Xtest diagnostician that alerts the {@link XtestResultsCache} before validation of an * Xtest file starts, and after it finishes * * @author Michael Barry */ public class XtestDiagnostician extends CancelableDiagnostician { @Inject private EventBus eventBus; /** * Construct a new {@link XtestDiagnostician} * * SHOULD ONLY BE INVOKED BY GUICE * * @param registry * The registry to pass to the super class's constructor */ @Inject public XtestDiagnostician(EValidator.Registry registry) { super(registry); } @Override public boolean validate(EClass eClass, EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) { boolean validate = false; Resource eResource = eObject.eResource(); URI uri = eResource.getURI(); if (eObject instanceof Body) { XTestResult xtestResult = null; try { validate = super.validate(eClass, eObject, diagnostics, context); xtestResult = (XTestResult) context.get(XTestResult.KEY); if (eResource instanceof XtestDependencyAcceptingResource) { XtestDependencyAcceptingResource resource = (XtestDependencyAcceptingResource) eResource; resource.setResult(xtestResult); } } finally { eventBus.post(new ValidationFinishedEvent(uri, xtestResult, CheckMode .getCheckMode(context))); } } else { validate = super.validate(eClass, eObject, diagnostics, context); } return validate; } }