private ValidationJob newValidationJob(final XtextEditor editor) { final IXtextDocument document = editor.getDocument(); final IAnnotationModel annotationModel = editor.getInternalSourceViewer().getAnnotationModel(); final IssueResolutionProvider issueResolutionProvider = getService(editor, IssueResolutionProvider.class); final MarkerTypeProvider markerTypeProvider = getService(editor, MarkerTypeProvider.class); final MarkerCreator markerCreator = getService(editor, MarkerCreator.class); final IValidationIssueProcessor issueProcessor = new CompositeValidationIssueProcessor( new AnnotationIssueProcessor(document, annotationModel, issueResolutionProvider), new MarkerIssueProcessor(editor.getResource(), markerCreator, markerTypeProvider)); return editor.getDocument().modify(resource -> { final IResourceServiceProvider serviceProvider = resource.getResourceServiceProvider(); final IResourceValidator resourceValidator = serviceProvider.getResourceValidator(); return new ValidationJob(resourceValidator, editor.getDocument(), issueProcessor, ALL); }); }
@Override public void configure(Binder binder) { binder.bind(IResourceValidator.class).to(SCTResourceValidatorImpl.class); binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("sct"); binder.bind(IEncodingProvider.class).to(IEncodingProvider.Runtime.class); binder.bind(IQualifiedNameProvider.class).to(StextNameProvider.class); binder.bind(org.eclipse.jface.viewers.ILabelProvider.class) .annotatedWith(org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider.class) .to(DefaultDescriptionLabelProvider.class); binder.bind(IDefaultResourceDescriptionStrategy.class).to(SCTResourceDescriptionStrategy.class); binder.bind(MarkerCreator.class).to(SCTMarkerCreator.class); binder.bind(MarkerTypeProvider.class).to(SCTMarkerTypeProvider.class); binder.bind(IDiagnosticConverter.class).to(SCTDiagnosticConverterImpl.class); binder.bind(IURIEditorOpener.class).annotatedWith(LanguageSpecific.class).to(SCTFileEditorOpener.class); binder.bind(IMarkerContributor.class).to(TaskMarkerContributor.class); binder.bind(ITaskFinder.class).to(DomainSpecificTaskFinder.class); binder.bind(TaskMarkerCreator.class).to(SCTTaskMarkerCreator.class); binder.bind(TaskMarkerTypeProvider.class).to(SCTTaskMarkerTypeProvider.class); }
/** * Processes the messages. * * @param result the translation result * @throws CoreException in case of marker processing problems */ private void processMessages(TranslationResult<?> result) throws CoreException { final IResource res = getResource(); res.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO); DiagnosticConverterImpl conv = new DiagnosticConverterImpl(); final MarkerCreator markerCreator = new MarkerCreator(); for (int m = 0; m < result.getMessageCount(); m++) { Message message = result.getMessage(m); conv.convertValidatorDiagnostic(ValidationUtils.processMessage(message), new IAcceptor<Issue>() { @Override public void accept(Issue issue) { try { markerCreator.createMarker(issue, res, IMarker.PROBLEM); } catch (CoreException e) { getLogger().exception(e); } } }); } }
private void createMarkers(IFile file, List<Issue> list, MarkerCreator markerCreator, MarkerTypeProvider markerTypeProvider) throws CoreException { for (Issue issue : list) { markerCreator.createMarker(issue, file, markerTypeProvider.getMarkerType(issue)); } }
/** * Validate the given resource and create the corresponding markers. The CheckMode is a constant calculated from the constructor * parameters. * * @param resourceValidator * the resource validator (not null) * @param markerCreator * the marker creator * @param file * the EFS file (not null) * @param resource * the EMF resource (not null) * @param monitor * the monitor (not null) */ protected void validate(final IResourceValidator resourceValidator, final MarkerCreator markerCreator, final IFile file, final Resource resource, final IProgressMonitor monitor) { try { monitor.subTask("validating " + file.getName()); //$NON-NLS-1$ final List<Issue> list = resourceValidator.validate(resource, checkMode, getCancelIndicator(monitor)); if (list != null) { // resourceValidator.validate returns null if canceled (and not an empty list) file.deleteMarkers(MarkerTypes.FAST_VALIDATION, true, IResource.DEPTH_ZERO); file.deleteMarkers(MarkerTypes.NORMAL_VALIDATION, true, IResource.DEPTH_ZERO); file.deleteMarkers(MarkerTypes.EXPENSIVE_VALIDATION, true, IResource.DEPTH_ZERO); if (markerCreator != null) { for (final Issue issue : list) { markerCreator.createMarker(issue, file, MarkerTypes.forCheckType(issue.getType())); } } else { if (LOGGER.isDebugEnabled()) { LOGGER.error("Could not create markers. The marker creator is null."); //$NON-NLS-1$ } } } } catch (final CoreException e) { LOGGER.error(e.getMessage(), e); } finally { monitor.worked(1); } }
private MarkerCreator getMarkerCreator(Resource resource) { return getService(resource, MarkerCreator.class); }
/** {@inheritDoc} */ @Override protected IStatus run(final IProgressMonitor monitor) { // Let's start (number of task = number of resource * 2 (loading + validating)) monitor.beginTask("", 2 * this.uris.size()); //$NON-NLS-1$ for (final URI uri : this.uris) { // Last chance to cancel before next validation if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } final IResourceServiceProvider serviceProvider = serviceProviderRegistry.getResourceServiceProvider(uri); if (serviceProvider == null) { // This may happen for non-Xtext resources in ice entities if (LOGGER.isDebugEnabled()) { LOGGER.debug(MessageFormat.format("Could not validate {0}: no resource service provider found", uri.toString())); //$NON-NLS-1$ } continue; // Skip to next URI } final IResourceValidator resourceValidator = serviceProvider.getResourceValidator(); final IStorage2UriMapper uriMapper = serviceProvider.get(IStorage2UriMapper.class); final MarkerCreator markerCreator = serviceProvider.get(MarkerCreator.class); // Get the file; only local files will be re-validated, derived files are ignored final IFile iFile = getFileFromStorageMapper(uriMapper, uri); if (iFile == null) { continue; // no storage mapping found for this URI } if (resourceValidator == null) { LOGGER.error(MessageFormat.format("Could not validate {0}: no resource validator found", iFile.getName())); //$NON-NLS-1$ } else if (iFile != null) { monitor.subTask("loading " + iFile.getName()); //$NON-NLS-1$ // Don't try to evaluate resource set before it has been checked that the storage provider contains a mapping // for current uri final ResourceSet resourceSet = getResourceSet(uriMapper, uri); // Load the corresponding resource boolean loaded = false; Resource eResource = null; try { eResource = resourceSet.getResource(uri, false); if ((eResource == null) || (eResource != null && !eResource.isLoaded())) { // if the resource does not exist in the resource set, or is not loaded yet // load it. eResource = resourceSet.getResource(uri, true); loaded = true; } monitor.worked(1); // CHECKSTYLE:OFF } catch (final RuntimeException e) { // CHECKSTYLE:ON LOGGER.error(MessageFormat.format("{0} could not be validated.", iFile.getName()), e); //$NON-NLS-1$ } finally { if (eResource != null) { validate(resourceValidator, markerCreator, iFile, eResource, monitor); LOGGER.debug("Validated " + uri); //$NON-NLS-1$ if (loaded) { // NOPMD // unload any resource that was previously loaded as part of this loop. eResource.unload(); } } } } } monitor.done(); return Status.OK_STATUS; }
public Class<? extends MarkerCreator> bindMarkerCreator() { return SCTMarkerCreator.class; }
/** * Instantiates a new valid marker update job. * * @param name * the name * @param fileExtensions * the file extensions * @param resourceSet * the resource set * @param markerCreator * the marker creator * @param resourceDescriptions * the resource descriptions * @param resourceServiceProvider * the resource service provider * @param performExpensiveValidation * true if expensive validation should be performed, false otherwise */ public ValidMarkerUpdateJob(final String name, final String fileExtensions, final ResourceSet resourceSet, final MarkerCreator markerCreator, final IResourceDescriptions resourceDescriptions, final IResourceServiceProvider resourceServiceProvider, final boolean performExpensiveValidation, final IStorage2UriMapper storage2UriMapper) { super(name + " " + fileExtensions); //$NON-NLS-1$ this.fileExtensions = fileExtensions; this.resourceSet = resourceSet; this.markerCreator = markerCreator; this.resourceDescriptions = resourceDescriptions; this.resourceServiceProvider = resourceServiceProvider; this.performExpensiveValidation = performExpensiveValidation; this.checkMode = performExpensiveValidation ? CheckMode.ALL : CheckMode.NORMAL_AND_FAST; this.storage2UriMapper = storage2UriMapper; }