You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2012/01/11 23:29:01 UTC

svn commit: r1230290 - /geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.core/src/main/java/org/apache/geronimo/st/v30/core/GeronimoSourcePathComputerDelegate.java

Author: gawor
Date: Wed Jan 11 22:29:00 2012
New Revision: 1230290

URL: http://svn.apache.org/viewvc?rev=1230290&view=rev
Log:
GERONIMODEVTOOLS-782: Include package fragment roots for source lookup

Modified:
    geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.core/src/main/java/org/apache/geronimo/st/v30/core/GeronimoSourcePathComputerDelegate.java

Modified: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.core/src/main/java/org/apache/geronimo/st/v30/core/GeronimoSourcePathComputerDelegate.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.core/src/main/java/org/apache/geronimo/st/v30/core/GeronimoSourcePathComputerDelegate.java?rev=1230290&r1=1230289&r2=1230290&view=diff
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.core/src/main/java/org/apache/geronimo/st/v30/core/GeronimoSourcePathComputerDelegate.java (original)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.v30.core/src/main/java/org/apache/geronimo/st/v30/core/GeronimoSourcePathComputerDelegate.java Wed Jan 11 22:29:00 2012
@@ -18,7 +18,10 @@ package org.apache.geronimo.st.v30.core;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -38,9 +41,12 @@ import org.eclipse.debug.core.sourcelook
 import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate;
 import org.eclipse.debug.core.sourcelookup.containers.ExternalArchiveSourceContainer;
 import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
 import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
 import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jdt.launching.sourcelookup.containers.PackageFragmentRootSourceContainer;
 import org.eclipse.wst.server.core.IModule;
 import org.eclipse.wst.server.core.IRuntime;
 import org.eclipse.wst.server.core.IServer;
@@ -66,71 +72,108 @@ public class GeronimoSourcePathComputerD
         IModule[] modules = server.getModules();
 
         Set<IProject> projectList = new HashSet<IProject>();
-        // populate list of projects and their source folders
-        processModules(modules, projectList, server, monitor);
-
-        // create a ProjectRuntime classpath entry for each JavaProject
-        List<IRuntimeClasspathEntry> projectEntriesList = new ArrayList<IRuntimeClasspathEntry>(projectList.size());
-        for (IProject project : projectList) {
-            IJavaProject javaProject = getJavaProject(project);
-            if (javaProject != null) {
-                projectEntriesList.add(JavaRuntime.newProjectRuntimeClasspathEntry(javaProject));
-            }
-        }
-        IRuntimeClasspathEntry[] projectEntries = new IRuntimeClasspathEntry[projectEntriesList.size()];
-        projectEntriesList.toArray(projectEntries);
-
-        // combine unresolved entries and project entries
-        IRuntimeClasspathEntry[] unresolvedEntries = JavaRuntime.computeUnresolvedSourceLookupPath(configuration);        
-        IRuntimeClasspathEntry[] entries = new IRuntimeClasspathEntry[projectEntries.length + unresolvedEntries.length];
-        System.arraycopy(unresolvedEntries, 0, entries, 0, unresolvedEntries.length);
-        System.arraycopy(projectEntries, 0, entries, unresolvedEntries.length, projectEntries.length);
-
-        IRuntimeClasspathEntry[] resolved = JavaRuntime.resolveSourceLookupPath(entries, configuration);
-        ISourceContainer[] defaultContainers = JavaRuntime.getSourceContainers(resolved);
+        Set<IJavaProject> javaProjectList = new HashSet<IJavaProject>();
+        
+        // collect all referenced projects
+        processModules(modules, projectList, javaProjectList, server, monitor);
                
-        Set<ISourceContainer> allContainers = new HashSet<ISourceContainer>();
-        // add project source containers
-        addAll(allContainers, defaultContainers);
+        Trace.trace(Trace.INFO, "GeronimoSourcePathComputerDelegate: projects found: " + toString(javaProjectList), Activator.traceCore);
+        
+        Set<ISourceContainer> allContainers = new LinkedHashSet<ISourceContainer>();
+        
+        // add default source containers
+        addDefaultSourceContainers(javaProjectList, configuration, allContainers);
+        
+        // add fragment source containers
+        addFragmentSourceContainers(javaProjectList, allContainers);
         
         // add additional source containers
-        ILaunchManager mgr = DebugPlugin.getDefault().getLaunchManager();
-        for (String id : getAdditionalSrcPathComputers()) {
-            ISourcePathComputer computer = mgr.getSourcePathComputer(id);
-            ISourceContainer[] jsc = computer.computeSourceContainers(configuration, monitor);
-            addAll(allContainers, jsc);
-        }
+        addAdditionalSourceContainers(configuration, monitor, allContainers);
         
         // add source containers for Geronimo Runtime
-        ISourceContainer[] runtimeContainers = processServer(server);
-        addAll(allContainers, runtimeContainers);
+        addServerSourceContainers(server, allContainers);
 
         // set known source project list
         GeronimoServerBehaviourDelegate delegate = getDelegate(server);
         delegate.setKnownSourceProjects(projectList);
         
-        Trace.tracePoint("Exit", Activator.traceCore, "GeronimoSourcePathComputerDelegate.computeSourceContainers", toStringList(allContainers));
+        ISourceContainer[] sourceContainers = new ISourceContainer[allContainers.size()];
+        allContainers.toArray(sourceContainers);
+        
+        Trace.tracePoint("Exit", Activator.traceCore, "GeronimoSourcePathComputerDelegate.computeSourceContainers", toString(sourceContainers));
         
-        return allContainers.toArray(new ISourceContainer[allContainers.size()]);
+        return sourceContainers;
     }
-    
-    private static void addAll(Set<ISourceContainer> allContainers, ISourceContainer[] containers) {
-        if (containers != null) {
-            for (ISourceContainer container : containers) {
-                allContainers.add(container);
+
+    private void addAdditionalSourceContainers(ILaunchConfiguration configuration, 
+                                               IProgressMonitor monitor,
+                                               Set<ISourceContainer> allContainers) throws CoreException {
+        ILaunchManager mgr = DebugPlugin.getDefault().getLaunchManager();
+        for (String id : getAdditionalSrcPathComputers()) {
+            ISourcePathComputer computer = mgr.getSourcePathComputer(id);
+            ISourceContainer[] jsc = computer.computeSourceContainers(configuration, monitor);
+            addAll(allContainers, jsc);
+        }
+    }
+
+    private void addDefaultSourceContainers(Set<IJavaProject> projectList, 
+                                            ILaunchConfiguration configuration, 
+                                            Collection<ISourceContainer> allContainers) throws CoreException {
+        Trace.tracePoint("Entry", Activator.traceCore, "GeronimoSourcePathComputerDelegate.addDefaultSourceContainers");
+        
+        List<IRuntimeClasspathEntry> projectEntriesList = new ArrayList<IRuntimeClasspathEntry>(projectList.size());
+        
+        // create a ProjectRuntime classpath entry for each JavaProject
+        for (IJavaProject project : projectList) {
+            projectEntriesList.add(JavaRuntime.newProjectRuntimeClasspathEntry(project));            
+        }
+        
+        // add in unresolved entries
+        IRuntimeClasspathEntry[] unresolvedEntries = JavaRuntime.computeUnresolvedSourceLookupPath(configuration);        
+        if (unresolvedEntries != null) {
+            for (IRuntimeClasspathEntry unresolvedEntry : unresolvedEntries) {
+                projectEntriesList.add(unresolvedEntry);
             }
         }
+        
+        IRuntimeClasspathEntry[] projectEntries = new IRuntimeClasspathEntry[projectEntriesList.size()];
+        projectEntriesList.toArray(projectEntries);
+
+        IRuntimeClasspathEntry[] resolved = JavaRuntime.resolveSourceLookupPath(projectEntries, configuration);
+        ISourceContainer[] defaultContainers = JavaRuntime.getSourceContainers(resolved);
+        
+        addAll(allContainers, defaultContainers);
+        
+        Trace.tracePoint("Exit", Activator.traceCore, "GeronimoSourcePathComputerDelegate.addDefaultSourceContainers", toString(defaultContainers));        
     }
     
-    private static List<String> toStringList(Set<ISourceContainer> allContainers) {
-        List<String> list = new ArrayList<String>(allContainers.size());
-        for (ISourceContainer container : allContainers) {
-            list.add(container.getName());
-        }
-        return list;
+    private void addFragmentSourceContainers(Collection<IJavaProject> projectList, 
+                                             Collection<ISourceContainer> allContainers) throws JavaModelException {
+        Trace.tracePoint("Entry", Activator.traceCore, "GeronimoSourcePathComputerDelegate.addFragmentSourceContainers");
+        
+        Set<IPath> processed = new HashSet<IPath>();
+        for (IJavaProject project : projectList) {
+            IPackageFragmentRoot[] roots = project.getPackageFragmentRoots();
+            if (roots != null) {
+                for (IPackageFragmentRoot root : roots) {
+                    if (root.isExternal()) {
+                        IPath path = root.getPath();
+                        if (processed.contains(path)) {
+                            continue;
+                        }
+                        processed.add(path);
+                    }
+                    if (allContainers.add(new PackageFragmentRootSourceContainer(root))) {
+                        Trace.trace(Trace.INFO, "GeronimoSourcePathComputerDelegate: Added fragment source container: " + root.getPath(), Activator.traceCore);
+                    }
+                }
+            }          
+        }  
+        
+        Trace.tracePoint("Exit", Activator.traceCore, "GeronimoSourcePathComputerDelegate.addFragmentSourceContainers");       
     }
     
-    private ISourceContainer[] processServer(IServer server) {
+    private void addServerSourceContainers(IServer server, Set<ISourceContainer> allContainers) {
         IRuntime runtime = server.getRuntime();
         IGeronimoRuntime gRuntime = (IGeronimoRuntime) runtime.getAdapter(IGeronimoRuntime.class);
         if (gRuntime != null) {
@@ -139,45 +182,55 @@ public class GeronimoSourcePathComputerD
                 File file = sourcePath.toFile();
                 if (file.isFile()) {
                     ExternalArchiveSourceContainer sourceContainer = new ExternalArchiveSourceContainer(file.getAbsolutePath(), true);
-                    return new ISourceContainer[] { sourceContainer };
+                    allContainers.add(sourceContainer);
                 } else if (file.isDirectory()) {
                     // TODO implement me using DirectorySourceContainer
                 }
             }
         }
-        return new ISourceContainer[] {};
     }
 
-    private void processModules(IModule[] modules, Set<IProject> projectList, IServer server, IProgressMonitor monitor) {
+    private void processModules(IModule[] modules, Set<IProject> projects, Set<IJavaProject> javaProjects, IServer server, IProgressMonitor monitor) {
         for (int i = 0; i < modules.length; i++) {
             IProject project = modules[i].getProject();
 
             IModule[] childModules = server.getChildModules(new IModule[] { modules[i] }, monitor);
             if (childModules != null && childModules.length > 0) {
-                processModules(childModules, projectList, server, monitor);
+                processModules(childModules, projects, javaProjects, server, monitor);
             }
 
             if (project != null) {
-                processProject(projectList, project);
+                processProject(projects, javaProjects, project);
             }
         }
     }
 
-    private void processProject(Set<IProject> projectList, IProject project) {
-        projectList.add(project);
-        try {
-            IProject[] referencedProjects = project.getReferencedProjects();
-            if (referencedProjects != null) {
-                for(int j = 0; j < referencedProjects.length; j++) {
-                    processProject(projectList, referencedProjects[j]);
-                }
+    private void processProject(Set<IProject> projects, Set<IJavaProject> javaProjects, IProject project) {
+        projects.add(project);
+
+        IProject[] referencedProjects = getReferencedProjects(project);
+        if (referencedProjects != null) {
+            for (int j = 0; j < referencedProjects.length; j++) {
+                processProject(projects, javaProjects, referencedProjects[j]);
             }
+        }
+
+        IJavaProject javaProject = getJavaProject(project);
+        if (javaProject != null) {
+            javaProjects.add(javaProject);
+        }
+    }
+    
+    private static IProject[] getReferencedProjects(IProject project) {
+        try {
+            return project.getReferencedProjects();
         } catch (CoreException e) {
             // ignore
+            return null;
         }
     }
     
-    public IJavaProject getJavaProject(IProject project) {
+    private static IJavaProject getJavaProject(IProject project) {
         try {
             if (project.hasNature(JavaCore.NATURE_ID)) {
                 return (IJavaProject) project.getNature(JavaCore.NATURE_ID);
@@ -188,6 +241,43 @@ public class GeronimoSourcePathComputerD
         return null;
     }
     
+    private static void addAll(Collection<ISourceContainer> allContainers, ISourceContainer[] containers) {
+        if (containers != null) {
+            for (ISourceContainer container : containers) {
+                allContainers.add(container);
+            }
+        }
+    }
+    
+    private static String toString(ISourceContainer[] containers) {
+        if (containers != null) {
+            StringBuilder builder = new StringBuilder();
+            for (int i = 0; i < containers.length; i++) {
+                builder.append(containers[i].getName());
+                if (i + 1 < containers.length) {
+                    builder.append(", ");
+                }                
+            }
+            return builder.toString();
+        }
+        return null;
+    }
+    
+    private static String toString(Collection<IJavaProject> projects) {
+        if (projects != null) {
+            StringBuilder builder = new StringBuilder();
+            Iterator<IJavaProject> iterator = projects.iterator();
+            while (iterator.hasNext()) {
+                builder.append(iterator.next().getProject().getName());
+                if (iterator.hasNext()) {
+                    builder.append(", ");
+                }
+            }
+            return builder.toString();
+        }
+        return null;
+    }
+    
     private  GeronimoServerBehaviourDelegate getDelegate(IServer server) {  
         GeronimoServerBehaviourDelegate delegate = 
             (GeronimoServerBehaviourDelegate) server.loadAdapter(GeronimoServerBehaviourDelegate.class, null);