/******************************************************************************* * Copyright (c) 2012 itemis AG (http://www.itemis.eu) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.xpect.xtext.lib.setup; import java.util.List; import org.eclipse.emf.ecore.resource.Resource.Diagnostic; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.xtext.diagnostics.Severity; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.util.CancelIndicator; import org.eclipse.xtext.util.IAcceptor; import org.eclipse.xtext.validation.CheckMode; import org.eclipse.xtext.validation.IDiagnosticConverter; import org.eclipse.xtext.validation.IResourceValidator; import org.eclipse.xtext.validation.Issue; import org.junit.ComparisonFailure; import org.xpect.XpectReplace; import org.xpect.runner.ValidatingSetup; import org.xpect.setup.XpectSetupFactory; import org.xpect.state.Creates; import org.xpect.util.IssueVisualizer; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; /** * @author Moritz Eysholdt - Initial contribution and API */ @XpectSetupFactory @XpectReplace(ValidatingSetup.class) public class XtextValidatingSetup extends ValidatingSetup { protected static class ListAcceptor<T> implements IAcceptor<T> { private List<T> list; public ListAcceptor(List<T> list) { super(); this.list = list; } public void accept(T t) { list.add(t); } } private List<Issue> issues = null; private final XtextResource resource; public XtextValidatingSetup(@ThisResource XtextResource resource) { this.resource = resource; } protected List<Issue> collectIssues() { if (isResolveAllReferences()) EcoreUtil.resolveAll(resource); if (isValidate()) { return collectIssuesFromValidator(); } else { return collectIssuesFromResource(); } } private List<Issue> collectIssuesFromResource() { List<Issue> result = Lists.newArrayList(); IDiagnosticConverter converer = resource.getResourceServiceProvider().get(IDiagnosticConverter.class); for (Diagnostic diagnostic : resource.getErrors()) converer.convertResourceDiagnostic(diagnostic, Severity.ERROR, new ListAcceptor<Issue>(result)); for (Diagnostic diagnostic : resource.getErrors()) converer.convertResourceDiagnostic(diagnostic, Severity.WARNING, new ListAcceptor<Issue>(result)); return result; } private List<Issue> collectIssuesFromValidator() { IResourceValidator validator = resource.getResourceServiceProvider().getResourceValidator(); return validator.validate(resource, CheckMode.ALL, CancelIndicator.NullImpl); } @Creates public ValidatingSetup create() { return this; } public List<Issue> getIssues() { if (issues == null) { List<Issue> issues = Lists.newArrayList(); for (Issue issue : collectIssues()) if (includeIssue(issue)) issues.add(issue); this.issues = ImmutableList.copyOf(issues); } return issues; } protected XtextResource getResource() { return resource; } protected boolean includeIssue(Issue issue) { return true; } public boolean isResolveAllReferences() { return true; } public boolean isValidate() { return true; } public void validate() { List<Issue> issues = getIssues(); if (issues.isEmpty()) return; String document = ((XtextResource) resource).getParseResult().getRootNode().getText(); String visualized = new IssueVisualizer().visualize(document, issues); throw new ComparisonFailure(Joiner.on("\n").join(issues), document, visualized); } }