private static List getPackageFragmentRoots()

in jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java [283:344]


    private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) {
        ArrayList<PackageNode> children = new ArrayList<>();
        IJavaProject javaProject = getJavaProject(query.getProjectUri());

        if (javaProject != null) {
            try {
                IClasspathEntry[] references = javaProject.getRawClasspath();
                IClasspathEntry containerEntry = null;
                for (IClasspathEntry reference : references) {
                    if (reference.getPath().equals(Path.fromPortableString(query.getPath()))) {
                        containerEntry = reference;
                        break;
                    }
                }
                if (containerEntry != null) {
                    IPackageFragmentRoot[] packageFragmentRoots = javaProject.findPackageFragmentRoots(containerEntry);
                    for (IPackageFragmentRoot fragmentRoot : packageFragmentRoots) {
                        PackageRootNode node = PackageNode.createNodeForPackageFragmentRoot(fragmentRoot);
                        if (StringUtils.isNotBlank(node.getName())) {
                            node.setHandlerIdentifier(fragmentRoot.getHandleIdentifier());
                            if (fragmentRoot instanceof JrtPackageFragmentRoot) {
                                node.setModuleName(fragmentRoot.getModuleDescription().getElementName());
                            }

                            IClasspathEntry resolvedClasspathEntry = fragmentRoot.getResolvedClasspathEntry();
                            if (resolvedClasspathEntry != null) {
                                for (IClasspathAttribute attribute : resolvedClasspathEntry.getExtraAttributes()) {
                                    node.setMetaDataValue(attribute.getName(), attribute.getValue());
                                }
                            }

                            children.add(node);
                        } else {
                            // for invisible project, the package root name may become empty after removing the '_',
                            // in this case, we skip this root node from showing in the explorer and keep finding its children.
                            PackageParams subQuery = new PackageParams(NodeKind.PACKAGEROOT, query.getProjectUri(),
                                    query.getPath(), fragmentRoot.getHandleIdentifier());
                            List<PackageNode> packageNodes = getPackages(subQuery, pm);
                            children.addAll(packageNodes);
                        }
                    }
                    return children;
                } else if (query.getPath().equals(PackageNode.REFERENCED_LIBRARIES_PATH)) {
                    // Process referenced libraries
                    List<PackageNode> referLibs = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY)
                            .map(classpath -> PackageNode.createNodeForClasspathEntry(classpath, javaProject, NodeKind.PACKAGEROOT))
                            .filter(entry -> entry != null)
                            .collect(Collectors.toList());
                    List<PackageNode> referVariables = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE)
                            .map(classpath -> PackageNode.createNodeForClasspathVariable(classpath)).filter(entry -> entry != null)
                            .collect(Collectors.toList());
                    children.addAll(referLibs);
                    children.addAll(referVariables);
                    return children;
                }
            } catch (CoreException e) {
                JdtlsExtActivator.logException("Problem load project JAR entries ", e);
            }
        }

        return Collections.emptyList();
    }