Author: pkluegl Date: Mon Sep 9 13:05:39 2013 New Revision: 1521088 URL: http://svn.apache.org/r1521088 Log: UIMA-3255 - activated autocompletion of uimaFIT components again, this time with spring instead of reflections - fixed autocompletion of scripts
Modified: uima/sandbox/ruta/trunk/ruta-ep-engine/pom.xml uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/RutaIdeCorePlugin.java uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/codeassist/RutaCompletionEngine.java uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java Modified: uima/sandbox/ruta/trunk/ruta-ep-engine/pom.xml URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-engine/pom.xml?rev=1521088&r1=1521087&r2=1521088&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-ep-engine/pom.xml (original) +++ uima/sandbox/ruta/trunk/ruta-ep-engine/pom.xml Mon Sep 9 13:05:39 2013 @@ -217,7 +217,8 @@ licensed under the Common Public License org.apache.commons.lang3.*, org.apache.commons.io.*, org.apache.uima.fit.*, - org.apache.commons.math3.* + org.apache.commons.math3.*, + org.springframework.* </_exportcontents> <Import-Package> Modified: uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g?rev=1521088&r1=1521087&r2=1521088&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g (original) +++ uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/antlr3/org/apache/uima/ruta/ide/core/parser/RutaParser.g Mon Sep 9 13:05:39 2013 @@ -2053,11 +2053,15 @@ dottedComponentDeclaration returns [Comp : id = Identifier { ct = new CommonToken(id); + ref = StatementFactory.createComponentDeclaration(ct); } ( - dot = (DOT | MINUS) {ct.setText(ct.getText() + dot.getText());} + {(input.get(id.getTokenIndex()+1).getChannel() != Token.HIDDEN_CHANNEL)}? + dot = (DOT | MINUS) {ct.setText(ct.getText() + dot.getText());ref = StatementFactory.createComponentDeclaration(ct);} + {(input.get(dot.getTokenIndex()+1).getChannel() != Token.HIDDEN_CHANNEL)}? id = Identifier {ct.setStopIndex(getBounds(id)[1]); - ct.setText(ct.getText() + id.getText());} + ct.setText(ct.getText() + id.getText()); + ref = StatementFactory.createComponentDeclaration(ct);} )* { if (!ct.getText().equals("<missing Identifier>")) ref = StatementFactory.createComponentDeclaration(ct);} Modified: uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/RutaIdeCorePlugin.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/RutaIdeCorePlugin.java?rev=1521088&r1=1521087&r2=1521088&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/RutaIdeCorePlugin.java (original) +++ uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/RutaIdeCorePlugin.java Mon Sep 9 13:05:39 2013 @@ -20,15 +20,20 @@ package org.apache.uima.ruta.ide; import java.io.IOException; +import java.net.URL; +import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.dltk.core.environment.IDeployment; import org.eclipse.dltk.core.environment.IExecutionEnvironment; import org.eclipse.dltk.core.environment.IFileHandle; import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; +import org.osgi.service.packageadmin.PackageAdmin; /** * The activator class controls the plug-in life cycle @@ -41,6 +46,8 @@ public class RutaIdeCorePlugin extends A // The shared instance private static RutaIdeCorePlugin plugin; + private BundleContext bundleContext; + /** * The constructor */ @@ -54,6 +61,7 @@ public class RutaIdeCorePlugin extends A */ public void start(BundleContext context) throws Exception { super.start(context); + bundleContext = context; plugin = this; } @@ -90,5 +98,34 @@ public class RutaIdeCorePlugin extends A path.append("ConsoleProxy.ruta"); return deployment.getFile(path); } + + public Bundle getBundle(String bundleName) { + Bundle[] bundles = getBundles(bundleName, null); + if (bundles != null && bundles.length > 0) + return bundles[0]; + return null; + } + + public Bundle[] getBundles(String bundleName, String version) { + Bundle[] bundles = Platform.getBundles(bundleName, version); + if (bundles != null) + return bundles; + // Accessing bundle which is not resolved + PackageAdmin admin = (PackageAdmin) bundleContext.getService(bundleContext + .getServiceReference(PackageAdmin.class.getName())); + bundles = admin.getBundles(bundleName, version); + if (bundles != null && bundles.length > 0) + return bundles; + return null; + } + + public String pluginIdToJarPath(String pluginId) throws IOException { + Bundle bundle = getBundle(pluginId); + URL url = bundle.getEntry("/"); + if (url == null) { + throw new IOException(); + } + return FileLocator.toFileURL(url).getFile(); + } } Modified: uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/codeassist/RutaCompletionEngine.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/codeassist/RutaCompletionEngine.java?rev=1521088&r1=1521087&r2=1521088&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/codeassist/RutaCompletionEngine.java (original) +++ uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/core/codeassist/RutaCompletionEngine.java Mon Sep 9 13:05:39 2013 @@ -30,8 +30,10 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.TreeSet; import org.apache.uima.UIMAFramework; +import org.apache.uima.analysis_component.AnalysisComponent; import org.apache.uima.resource.ResourceManager; import org.apache.uima.resource.metadata.TypeDescription; import org.apache.uima.resource.metadata.TypeSystemDescription; @@ -39,6 +41,7 @@ import org.apache.uima.ruta.ide.RutaIdeC import org.apache.uima.ruta.ide.core.IRutaKeywords; import org.apache.uima.ruta.ide.core.RutaExtensionManager; import org.apache.uima.ruta.ide.core.RutaKeywordsManager; +import org.apache.uima.ruta.ide.core.RutaNature; import org.apache.uima.ruta.ide.core.builder.RutaProjectUtils; import org.apache.uima.ruta.ide.core.extensions.ICompletionExtension; import org.apache.uima.ruta.ide.core.parser.RutaParseUtils; @@ -54,7 +57,9 @@ import org.apache.uima.util.XMLInputSour import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectNature; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.dltk.ast.ASTNode; @@ -72,6 +77,15 @@ import org.eclipse.dltk.core.ModelExcept import org.eclipse.dltk.internal.core.SourceField; import org.eclipse.dltk.internal.core.SourceMethod; import org.eclipse.dltk.internal.core.SourceModule; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.internal.core.JavaProject; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.type.filter.AssignableTypeFilter; public class RutaCompletionEngine extends ScriptCompletionEngine { @@ -127,10 +141,8 @@ public class RutaCompletionEngine extend if (classloader == null) { IScriptProject scriptProject = sourceModule.getModelElement().getScriptProject(); try { - Collection<String> dependencies = new ArrayList<String>(); // TODO UIMA-3077 - // Collection<String> dependencies = RutaLaunchConfigurationDelegate - // .getClassPath(scriptProject); + Collection<String> dependencies = getDependencies(scriptProject.getProject()); URL[] urls = new URL[dependencies.size()]; int counter = 0; for (String dep : dependencies) { @@ -142,6 +154,8 @@ public class RutaCompletionEngine extend // RutaIdeCorePlugin.error(e); } catch (MalformedURLException e) { RutaIdeCorePlugin.error(e); + } catch (CoreException e) { + RutaIdeCorePlugin.error(e); } } @@ -243,7 +257,21 @@ public class RutaCompletionEngine extend } } else if (type == ComponentDeclaration.UIMAFIT_ENGINE) { List<String> engines = new ArrayList<String>(); - // TODO: collect engines + + ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true); + ResourceLoader resourceLoader = new DefaultResourceLoader(classloader); + provider.setResourceLoader(resourceLoader); + provider.addIncludeFilter(new AssignableTypeFilter(AnalysisComponent.class)); + + String pack = complString.replaceAll("[.]", "/"); + if(pack.endsWith("/")) { + pack = pack.substring(0, pack.length()-1); + } + Set<BeanDefinition> components = provider.findCandidateComponents(pack); + for (BeanDefinition component : components) { + String beanClassName = component.getBeanClassName(); + engines.add(beanClassName); + } for (String string : engines) { if (match(complString, string)) { addProposal(complString, string, CompletionProposal.PACKAGE_REF); @@ -343,7 +371,7 @@ public class RutaCompletionEngine extend result.addAll(collectScripts(folder2, newPrefix)); } else if (iResource instanceof IFile) { IFile file = (IFile) iResource; - if (file.getFileExtension().equals("tm")) { + if (file.getFileExtension().equals("ruta")) { result.add(prefix + file.getName().substring(0, file.getName().length() - 5)); } } @@ -639,4 +667,68 @@ public class RutaCompletionEngine extend findKeywords(startPart.toCharArray(), keywords.toArray(new String[0]), true); } + public static List<String> getClassPath(IScriptProject project) throws CoreException { + List<String> extendedClasspath = new ArrayList<String>(); + Collection<String> dependencies = getDependencies(project.getProject()); + extendedClasspath.addAll(dependencies); + return extendedClasspath; + } + + private static Collection<String> getDependencies(IProject project) throws CoreException { + Collection<String> result = new TreeSet<String>(); + IProject[] referencedProjects = project.getReferencedProjects(); + for (IProject eachProject : referencedProjects) { + // for each java project + extendClasspathWithProject(result, eachProject, new HashSet<IProject>()); + IProjectNature nature = eachProject.getNature(RutaNature.NATURE_ID); + if (nature != null) { + result.addAll(getDependencies(eachProject)); + } + } + return result; + } + + private static void extendClasspathWithProject(Collection<String> result, IProject project, + Collection<IProject> visited) throws CoreException, JavaModelException { + IProjectNature nature = project.getNature(RutaProjectUtils.JAVANATURE); + if (nature != null) { + JavaProject javaProject = (JavaProject) JavaCore.create(project); + + // add output, e.g., target/classes + IPath readOutputLocation = javaProject.readOutputLocation(); + IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(readOutputLocation); + result.add(folder.getLocation().toPortableString()); + + IClasspathEntry[] rawClasspath = javaProject.getRawClasspath(); + for (IClasspathEntry each : rawClasspath) { + int entryKind = each.getEntryKind(); + IPath path = each.getPath(); + if (entryKind == IClasspathEntry.CPE_PROJECT) { + IProject p = RutaProjectUtils.getProject(path); + if (!visited.contains(p)) { + visited.add(p); + extendClasspathWithProject(result, p, visited); + } + } else if (entryKind != IClasspathEntry.CPE_SOURCE) { + String segment = path.segment(0); + if (!segment.equals("org.eclipse.jdt.launching.JRE_CONTAINER")) { + IClasspathEntry[] resolveClasspath = javaProject + .resolveClasspath(new IClasspathEntry[] { each }); + for (IClasspathEntry eachResolved : resolveClasspath) { + if (eachResolved.getEntryKind() == IClasspathEntry.CPE_PROJECT) { + IProject p = RutaProjectUtils.getProject(eachResolved.getPath()); + if (!visited.contains(p)) { + visited.add(p); + extendClasspathWithProject(result, p, visited); + } + } else { + result.add(eachResolved.getPath().toPortableString()); + } + } + } + } + } + } + } + } Modified: uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java URL: http://svn.apache.org/viewvc/uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java?rev=1521088&r1=1521087&r2=1521088&view=diff ============================================================================== --- uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java (original) +++ uima/sandbox/ruta/trunk/ruta-ep-ide/src/main/java/org/apache/uima/ruta/ide/parser/ast/StatementFactory.java Mon Sep 9 13:05:39 2013 @@ -322,7 +322,8 @@ public class StatementFactory extends Ab public static ComponentDeclaration createComponentDeclaration(CommonToken ct) { int nameBounds[] = getBounds(ct); - return new ComponentDeclaration(nameBounds[0], nameBounds[1], ct.getText()); + String text = ct.getText(); + return new ComponentDeclaration(nameBounds[0], nameBounds[0] + text.length(), text); } }