/*******************************************************************************
* Copyright (c) 2012 BMW Car IT 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.jnario.feature.validation;
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Sets.newHashSet;
import static org.eclipse.xtext.EcoreUtil2.getContainerOfType;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.xtend.core.xtend.XtendClass;
import org.eclipse.xtend.core.xtend.XtendField;
import org.eclipse.xtend.core.xtend.XtendFunction;
import org.eclipse.xtend.core.xtend.XtendPackage;
import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.validation.Check;
import org.eclipse.xtext.validation.CheckType;
import org.eclipse.xtext.validation.ComposedChecks;
import org.eclipse.xtext.validation.NamesAreUniqueValidator;
import org.eclipse.xtext.validation.ValidationMessageAcceptor;
import org.eclipse.xtext.xbase.XVariableDeclaration;
import org.eclipse.xtext.xbase.validation.IssueCodes;
import org.jnario.ExampleTable;
import org.jnario.feature.feature.Background;
import org.jnario.feature.feature.Feature;
import org.jnario.feature.feature.Scenario;
import org.jnario.feature.feature.Step;
import org.jnario.feature.naming.FeatureClassNameProvider;
import org.jnario.feature.naming.StepNameProvider;
import org.jnario.validation.JnarioJavaValidator;
import com.google.inject.Inject;
/**
* @author Birgit Engelmann - Initial contribution and API
* @author Sebastian Benz
*/
@ComposedChecks(validators={JnarioJavaValidator.class, NamesAreUniqueValidator.class})
public class FeatureJavaValidator extends AbstractFeatureJavaValidator {
@Inject StepNameProvider nameProvider;
@Inject FeatureClassNameProvider classNameProvider;
@Check
protected void checkModifiers(XtendClass xtendClass) {
if (!(xtendClass instanceof Scenario)) {
super.checkModifiers(xtendClass);
}
}
@Check(CheckType.FAST)
public void checkFeaturesHaveAName(Feature feature){
if(isNullOrEmpty(feature.getName())){
error("Features should have a description", XtendPackage.Literals.XTEND_TYPE_DECLARATION__NAME);
}
}
// @Check(CheckType.FAST)
// public void checkDuplicateScenarioNames(Feature feature){
// Set<String> names = newHashSet();
// for (Scenario scenario : feature.getScenarios()) {
// if(!names.add(classNameProvider.toJavaClassName(scenario))){
// error("Duplicate scenario: '" + scenario.getName() + "'", XtendPackage.Literals.XTEND_TYPE_DECLARATION__NAME);
// }
// }
// }
//
public String removeKeywords(String string){
return nameProvider.removeKeywords(string).trim();
}
@Check(CheckType.FAST)
public void checkFeaturesHaveAName(Scenario scenario){
if (scenario instanceof Background) {
return;
}
String name = removeKeywords(scenario.getName());
if(isNullOrEmpty(name)){
error("Scenarios should have a description", XtendPackage.Literals.XTEND_TYPE_DECLARATION__NAME);
}
}
@Check(CheckType.FAST)
public void checkStepsHaveAName(Step step){
String name = nameProvider.nameOf(step);
name = nameProvider.removeKeywords(name);
if(isNullOrEmpty(name)){
error("Steps should have a description", XtendPackage.Literals.XTEND_FUNCTION__NAME);
}
}
@Override
public void checkVariableDeclaration(XVariableDeclaration declaration) {
if(getContainerOfType(declaration, ExampleTable.class) == null){
super.checkVariableDeclaration(declaration);
}
}
@Override
public void checkLocalUsageOfDeclared(XVariableDeclaration variableDeclaration) {
}
protected void warning(String message, EObject source, EStructuralFeature feature, String code, String... issueData) {
// avoids overriding the whole method
if("The use of wildcard imports is deprecated.".equals(message)){
return;
}
getMessageAcceptor().acceptWarning(message, source, feature, ValidationMessageAcceptor.INSIGNIFICANT_INDEX, code, issueData);
}
@Check
public void checkAbstract(XtendFunction function) {
if (function instanceof Step) {
return;
}
super.checkAbstract(function);
}
protected void error(String message, EObject source, EStructuralFeature feature, int index, String code, String... issueData) {
if(NodeModelUtils.getNode(source) == null){
source = EcoreUtil2.getContainerOfType(source, Step.class);
feature = XtendPackage.Literals.XTEND_FUNCTION__NAME;
}
getMessageAcceptor().acceptError(message, source, feature, index, code, issueData);
}
@Check
public void checkConflictingFields(Scenario scenario){
Iterable<XtendField> fields = filter(scenario.getMembers(), XtendField.class);
Set<String> names = new HashSet<String>();
for (XtendField xtendField : fields) {
if(names.contains(xtendField.getName())){
}else{
names.add(xtendField.getName());
}
}
}
@Override
@Check
public void checkDuplicateAndOverriddenFunctions(
XtendTypeDeclaration xtendType) {
}
@Override
protected void addIssue(String message, EObject source, String issueCode) {
if(IssueCodes.IMPORT_WILDCARD_DEPRECATED == issueCode){
return;
}
super.addIssue(message, source, issueCode);
}
}