blob: e3667036f91ee1d67af600ff362c1317aeb600d8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.ruta.ide.ui.text;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.uima.ruta.ide.core.RutaNature;
import org.apache.uima.ruta.ide.core.RutaProblems;
import org.apache.uima.ruta.ide.core.packages.PackagesManager;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.CorrectionEngine;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IScriptModelMarker;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.internal.ui.editor.ScriptEditor;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.ScriptRuntime;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.editor.IScriptAnnotation;
import org.eclipse.dltk.ui.text.MarkerResolutionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.ui.texteditor.MarkerAnnotation;
import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
public class RutaCorrectionProcessor implements IQuickAssistProcessor {
RutaCorrectionAssistant fAssistant;
public RutaCorrectionProcessor(RutaCorrectionAssistant tclCorrectionAssistant) {
this.fAssistant = tclCorrectionAssistant;
}
public boolean canAssist(IQuickAssistInvocationContext invocationContext) {
return true;
}
public boolean canFix(Annotation annotation) {
return hasCorrections(annotation);
}
public ICompletionProposal[] computeQuickAssistProposals(
IQuickAssistInvocationContext invocationContext) {
final Annotation[] annotations = fAssistant.getAnnotationsAtOffset();
final ScriptEditor editor = (ScriptEditor) this.fAssistant.getEditor();
final IAnnotationModel model = DLTKUIPlugin.getDocumentProvider().getAnnotationModel(
editor.getEditorInput());
final IModelElement element = editor.getInputModelElement();
final IScriptProject scriptProject = element.getScriptProject();
List proposals = null;
for (int i = 0; i < annotations.length; i++) {
final Annotation annotation = annotations[i];
ICompletionProposal proposal = null;
if (annotation instanceof MarkerAnnotation) {
MarkerAnnotation mAnnot = (MarkerAnnotation) annotation;
IMarker marker = mAnnot.getMarker();
if (isFixable(marker)) {
final String pkgName = CorrectionEngine.getProblemArguments(marker)[0];
proposal = new MarkerResolutionProposal(new RutaRequirePackageMarkerResolution(pkgName,
scriptProject), marker);
}
} else if (annotation instanceof IScriptAnnotation) {
if (isFixable((IScriptAnnotation) annotation)) {
// final String pkgName = ((IScriptAnnotation) annotation)
// .getArguments()[0];
// proposal = new AnnotationResolutionProposal(
// new RutaRequirePackageMarkerResolution(pkgName,
// scriptProject), model, annotation);
}
}
if (proposal != null) {
if (proposals == null) {
proposals = new ArrayList();
}
proposals.add(proposal);
}
}
if (proposals != null) {
return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
}
return null;
}
public String getErrorMessage() {
return null;
}
public static boolean isQuickFixableType(Annotation annotation) {
return (annotation instanceof IScriptAnnotation || annotation instanceof SimpleMarkerAnnotation)
&& !annotation.isMarkedDeleted();
}
public static boolean isFixable(IMarker marker) {
if (marker.getAttribute(IScriptModelMarker.ID, 0) == RutaProblems.UNKNOWN_REQUIRED_PACKAGE) {
final String[] args = CorrectionEngine.getProblemArguments(marker);
if (args != null && args.length != 0 && args[0] != null) {
IResource resource = marker.getResource();
IProject project = resource.getProject();
IScriptProject scriptProject = DLTKCore.create(project);
if (isFixable(args[0], scriptProject)) {
return true;
}
}
}
return false;
}
public static boolean isFixable(IScriptAnnotation annotation) {
// if (annotation.getId() == RutaProblems.UNKNOWN_REQUIRED_PACKAGE) {
// final String[] args = annotation.getArguments();
// if (args != null && args.length != 0 && args[0] != null) {
// final ISourceModule module = annotation.getSourceModule();
// if (module != null) {
// final IScriptProject project = module.getScriptProject();
// if (project != null) {
// if (isFixable(args[0], project)) {
// return true;
// }
// }
// }
// }
// }
return false;
}
public static boolean isFixable(String pkgName, IScriptProject scriptProject) {
IDLTKLanguageToolkit toolkit = null;
toolkit = DLTKLanguageManager.getLanguageToolkit(scriptProject);
if (toolkit != null && toolkit.getNatureId().equals(RutaNature.NATURE_ID)) {
IInterpreterInstall install = null;
try {
install = ScriptRuntime.getInterpreterInstall(scriptProject);
} catch (CoreException e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
if (install != null) {
PackagesManager manager = PackagesManager.getInstance();
IPath[] paths = manager.getPathsForPackage(install, pkgName);
if (paths != null && paths.length > 0) {
return true;
}
Map dependencies = manager.getDependencies(pkgName, install);
for (Iterator iterator = dependencies.keySet().iterator(); iterator.hasNext();) {
String pkg = (String) iterator.next();
IPath[] paths2 = manager.getPathsForPackage(install, pkg);
if (paths2 != null && paths2.length > 0) {
return true;
}
}
}
}
return false;
}
public static boolean hasCorrections(Annotation annotation) {
if (annotation instanceof MarkerAnnotation) {
MarkerAnnotation mAnnot = (MarkerAnnotation) annotation;
IMarker marker = mAnnot.getMarker();
return isFixable(marker);
} else if (annotation instanceof IScriptAnnotation) {
return isFixable((IScriptAnnotation) annotation);
}
return false;
}
}