/*******************************************************************************
* 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.ui.services;
import static org.xpect.runner.TestExecutor.createFileConfiguration;
import java.util.List;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.util.CancelIndicator;
import org.eclipse.xtext.validation.CheckMode;
import org.eclipse.xtext.validation.IResourceValidator;
import org.eclipse.xtext.validation.Issue;
import org.xpect.Environment;
import org.xpect.XpectFile;
import org.xpect.registry.DefaultBinding;
import org.xpect.state.Configuration;
import org.xpect.ui.util.XpectFileAccess;
import org.xpect.util.EnvironmentUtil;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.google.inject.Injector;
/**
* @author Moritz Eysholdt - Initial contribution and API
*/
public class XtResourceValidator implements IResourceValidator {
@Inject
@DefaultBinding
private IResourceValidator delegate;
@Inject
private Injector injector;
public IResourceValidator getDelegate() {
return delegate;
}
public List<Issue> validate(Resource resource, CheckMode mode, CancelIndicator indicator) {
XpectFile xpectFile = XpectFileAccess.getXpectFile(resource);
Configuration fileConfig = createFileConfiguration(xpectFile);
List<Issue> issues = Lists.newArrayList();
List<Issue> delegateIssues = validateDelegate(resource, mode, indicator, fileConfig);
if (delegateIssues != null) {
issues.addAll(delegateIssues);
}
List<Issue> xpectIssues = validateXpect(resource, mode, indicator, fileConfig);
if (xpectIssues != null) {
issues.addAll(xpectIssues);
}
if (EnvironmentUtil.ENVIRONMENT == Environment.WORKBENCH) {
LiveTestRunner runner = injector.getInstance(LiveTestRunner.class);
List<Issue> testResultIssues = runner.validateTests(resource, mode, indicator, fileConfig);
issues.addAll(testResultIssues);
}
return issues;
}
public List<Issue> validateDelegate(Resource resource, CheckMode mode, CancelIndicator indicator, Configuration fileConfig) {
List<Issue> issues = delegate.validate(resource, mode, indicator);
List<Issue> result = Lists.newArrayListWithExpectedSize(issues.size());
for (Issue issue : issues)
if (issue != null)
result.add(issue);
return result;
}
public List<Issue> validateXpect(Resource resource, CheckMode mode, CancelIndicator indicator, Configuration fileConfig) {
XtextResource xpectResource = XpectFileAccess.getXpectResource(resource);
IResourceValidator validator = xpectResource.getResourceServiceProvider().getResourceValidator();
return validator.validate(xpectResource, mode, indicator);
}
}