/**
* Copyright (c) 2013-2016 Angelo ZERR.
* 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
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.ide.linter.internal.ui.validation;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IValidator;
import tern.ITernFile;
import tern.eclipse.ide.core.IIDETernProject;
import tern.eclipse.ide.core.TernCorePlugin;
import tern.eclipse.ide.core.resources.TernDocumentFile;
import tern.eclipse.ide.linter.core.validation.TernReporterCollector;
import tern.eclipse.ide.linter.core.validation.TernValidationHelper;
import tern.eclipse.ide.linter.internal.ui.Trace;
import tern.eclipse.ide.ui.utils.EditorUtils;
import tern.server.ITernPlugin;
import tern.server.protocol.lint.ITernLintCollector;
/**
* WTP Tern Validator "as-you-type" to validate JavaScript (HTML, JSP, JS etc
* files) when user type content inside JSDT JavaScript editor, HTML, JSP
* editors.
*
*/
public class TernSourceValidator implements IValidator, ISourceValidator {
private IDocument document;
@Override
public void validate(IValidationContext helper, IReporter reporter)
throws ValidationException {
if (helper == null || document == null) {
return;
}
if ((reporter != null) && (reporter.isCancelled() == true)) {
throw new OperationCanceledException();
}
// we cannot use helper#getURI() to retrieve the IFile which is
// validating, because
// this helper is filled by using IStructuredModel (see
// ReconcileStepForValidator#getFile())
// and JSDT JavaScript Editor doesn't manage IStructuredModel
IFile file = EditorUtils.getFile(document);
if (file == null || !TernCorePlugin.hasTernNature(file.getProject())) {
return;
}
try {
IIDETernProject ternProject = TernCorePlugin.getTernProject(file
.getProject());
ITernPlugin[] lintPlugins = ternProject.getLinters();
if (lintPlugins.length > 0) {
ITernFile ternFile = new TernDocumentFile(file, document);
ITernLintCollector collector = new UITernReporterCollector(ternProject, reporter, this);
TernValidationHelper.validate(ternFile, ternProject, false,
true, true, collector);
}
} catch (CoreException e) {
Trace.trace(Trace.SEVERE, "Error while tern validation.", e);
}
}
@Override
public void cleanup(IReporter reporter) {
// don't need to implement
}
@Override
public void connect(IDocument document) {
this.document = document;
}
@Override
public void disconnect(IDocument document) {
this.document = null;
}
@Override
public void validate(IRegion dirtyRegion, IValidationContext helper,
IReporter reporter) {
// Never called, because TernSourceValidator is declared as "total" (and
// not "partial") in the plugin.xml
// "org.eclipse.wst.sse.ui.sourcevalidation" extension point.
}
}