/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.project.build.validation;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.rf.ide.core.testdata.model.RobotFile;
import org.rf.ide.core.testdata.model.RobotFileOutput;
import org.rf.ide.core.testdata.model.RobotFileOutput.BuildMessage;
import org.rf.ide.core.testdata.model.RobotFileOutput.BuildMessage.LogLevel;
import org.rf.ide.core.testdata.model.RobotFileOutput.Status;
import org.rf.ide.core.validation.ProblemPosition;
import org.robotframework.ide.eclipse.main.plugin.model.RobotCasesSection;
import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordsSection;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSettingsSection;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.model.RobotVariablesSection;
import org.robotframework.ide.eclipse.main.plugin.project.build.ProblemsReportingStrategy;
import org.robotframework.ide.eclipse.main.plugin.project.build.RobotArtifactsValidator.ModelUnitValidator;
import org.robotframework.ide.eclipse.main.plugin.project.build.RobotProblem;
import org.robotframework.ide.eclipse.main.plugin.project.build.causes.SuiteFileProblem;
public abstract class RobotFileValidator implements ModelUnitValidator {
private final ValidationContext context;
protected final IFile file;
protected final ProblemsReportingStrategy reporter;
public RobotFileValidator(final ValidationContext context, final IFile file,
final ProblemsReportingStrategy reporter) {
this.context = context;
this.file = file;
this.reporter = reporter;
}
@Override
public final void validate(final IProgressMonitor monitor) throws CoreException {
final RobotSuiteFile suiteFile = context.getModel().createSuiteFile(file);
validate(suiteFile, monitor);
}
public final void validate(final RobotSuiteFile suiteFile, final IProgressMonitor monitor) throws CoreException {
final FileValidationContext fileValidationContext = context.createUnitContext(file);
context.getLogger().log("VALIDATING: " + file.getFullPath().toString());
monitor.setTaskName(file.getFullPath().toPortableString());
validate(suiteFile, fileValidationContext);
}
/**
* This method does common validation for different file types (resources, inits, suites).
* It should be overridden and called by subclasses
*
* @param fileModel
* @param monitor
* @param validationContext
* @throws CoreException
*/
protected void validate(final RobotSuiteFile fileModel, final FileValidationContext validationContext)
throws CoreException {
new UnknownTablesValidator(fileModel, reporter).validate(null);
new TestCaseTableValidator(validationContext, fileModel.findSection(RobotCasesSection.class), reporter)
.validate(null);
new GeneralSettingsTableValidator(validationContext, fileModel.findSection(RobotSettingsSection.class),
reporter).validate(null);
new KeywordTableValidator(validationContext, fileModel.findSection(RobotKeywordsSection.class), reporter)
.validate(null);
new VariablesTableValidator(validationContext, fileModel.findSection(RobotVariablesSection.class), reporter)
.validate(null);
checkRobotFileOutputStatus(fileModel);
}
private void checkRobotFileOutputStatus(final RobotSuiteFile fileModel) {
final RobotFile linkedElement = fileModel.getLinkedElement();
if (linkedElement != null) {
final RobotFileOutput robotFileOutput = linkedElement.getParent();
if (robotFileOutput != null) {
if (robotFileOutput.getStatus() == Status.FAILED) {
reporter.handleProblem(RobotProblem.causedBy(SuiteFileProblem.FILE_PARSING_FAILED)
.formatMessageWith(file.getName()), file, -1);
}
for (final BuildMessage buildMessage : robotFileOutput.getBuildingMessages()) {
if (buildMessage.getType() == LogLevel.ERROR) {
final RobotProblem problem = RobotProblem.causedBy(SuiteFileProblem.BUILD_ERROR_MESSAGE)
.formatMessageWith(buildMessage.getMessage());
final ProblemPosition position = ProblemPosition.fromRegion(buildMessage.getFileRegion());
reporter.handleProblem(problem, file, position);
} else if (buildMessage.getType() == LogLevel.WARN) {
final RobotProblem problem = RobotProblem.causedBy(SuiteFileProblem.BUILD_WARNING_MESSAGE)
.formatMessageWith(buildMessage.getMessage());
final ProblemPosition position = ProblemPosition.fromRegion(buildMessage.getFileRegion());
reporter.handleProblem(problem, file, position);
}
}
}
}
}
}