Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## 0.22.0
### Added
- Display non-Java files in Java Projects explorer. [#145](https://github.com/microsoft/vscode-java-dependency/issues/145)
- Apply file decorators to project level. [#481](https://github.com/microsoft/vscode-java-dependency/issues/481)

## 0.21.2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,10 @@ public class PackageCommand {

static {
commands = new HashMap<>();
commands.put(NodeKind.PROJECT, PackageCommand::getContainers);
commands.put(NodeKind.CONTAINER, PackageCommand::getPackageFragmentRoots);
commands.put(NodeKind.PACKAGEROOT, PackageCommand::getPackages);
commands.put(NodeKind.PACKAGE, PackageCommand::getRootTypes);
commands.put(NodeKind.PROJECT, PackageCommand::getProjectChildren);
commands.put(NodeKind.CONTAINER, PackageCommand::getContainerChildren);
commands.put(NodeKind.PACKAGEROOT, PackageCommand::getPackageRootChildren);
commands.put(NodeKind.PACKAGE, PackageCommand::getPackageChildren);
commands.put(NodeKind.FOLDER, PackageCommand::getFolderChildren);
}

Expand Down Expand Up @@ -225,10 +225,17 @@ public static List<PackageNode> resolvePath(List<Object> arguments, IProgressMon
* @throws JavaModelException when fails to get path or resource
*/
private static List<PackageNode> getParentAncestorNodes(IResource element) throws JavaModelException {
List<PackageNode> nodeList = new ArrayList<>();
while (element != null) {
List<PackageNode> nodeList = new LinkedList<>();
while (element != null && !(element instanceof IWorkspaceRoot)) {
IJavaElement javaElement = JavaCore.create(element);
if (javaElement instanceof IPackageFragmentRoot) {
if (javaElement == null) {
PackageNode entry = PackageNode.createNodeForResource(element);
if (entry != null) {
nodeList.add(0, entry);
}
} else if (javaElement instanceof IJavaProject) {
nodeList.add(0, PackageNode.createNodeForProject(javaElement));
} else if (javaElement instanceof IPackageFragmentRoot) {
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) javaElement;
nodeList.add(0, new PackageRootNode(pkgRoot,
element.getProjectRelativePath().toPortableString(), NodeKind.PACKAGEROOT));
Expand All @@ -239,12 +246,6 @@ private static List<PackageNode> getParentAncestorNodes(IResource element) throw
if (packageFragment.containsJavaResources() || packageFragment.getNonJavaResources().length > 0) {
nodeList.add(0, PackageNode.createNodeForPackageFragment(packageFragment));
}

} else if (javaElement == null) {
PackageNode entry = PackageNode.createNodeForResource(element);
if (entry != null) {
nodeList.add(0, entry);
}
}
element = element.getParent();
}
Expand All @@ -255,20 +256,28 @@ private static List<PackageNode> getParentAncestorNodes(IResource element) throw
/**
* Get the class path container list.
*/
private static List<PackageNode> getContainers(PackageParams query, IProgressMonitor pm) {
private static List<PackageNode> getProjectChildren(PackageParams query, IProgressMonitor pm) {
IJavaProject javaProject = getJavaProject(query.getProjectUri());
if (javaProject != null) {
refreshLocal(javaProject.getProject(), pm);
List<Object> children = new LinkedList<>();
boolean hasReferencedLibraries = false;
try {
IClasspathEntry[] references = javaProject.getRawClasspath();
for (IClasspathEntry entry : references) {
if (entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY && entry.getEntryKind() != IClasspathEntry.CPE_VARIABLE) {
int entryKind = entry.getEntryKind();
if (entryKind == IClasspathEntry.CPE_SOURCE) {
IPackageFragmentRoot[] packageFragmentRoots = javaProject.findPackageFragmentRoots(entry);
children.addAll(Arrays.asList(packageFragmentRoots));
} else if (entryKind == IClasspathEntry.CPE_CONTAINER) {
children.add(entry);
} else {
} else if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) {
hasReferencedLibraries = true;
} else {
// TODO: handle IClasspathEntry.CPE_PROJECT
}
}
Collections.addAll(children, javaProject.getNonJavaResources());
} catch (CoreException e) {
JdtlsExtActivator.logException("Problem load project library ", e);
}
Expand All @@ -278,7 +287,7 @@ private static List<PackageNode> getContainers(PackageParams query, IProgressMon
resourceSet.accept(visitor);
List<PackageNode> result = visitor.getNodes();

// Invisble project will always have the referenced libraries entry
// Invisible project will always have the referenced libraries entry
if (!ProjectUtils.isVisibleProject(javaProject.getProject())) {
result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER);
} else if (hasReferencedLibraries) {
Expand All @@ -289,7 +298,7 @@ private static List<PackageNode> getContainers(PackageParams query, IProgressMon
return Collections.emptyList();
}

private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) {
private static List<PackageNode> getContainerChildren(PackageParams query, IProgressMonitor pm) {
IJavaProject javaProject = getJavaProject(query.getProjectUri());
if (javaProject == null) {
return Collections.emptyList();
Expand Down Expand Up @@ -343,15 +352,15 @@ private static IPackageFragmentRoot[] findPackageFragmentRoots(IJavaProject java
return null;
}

private static List<PackageNode> getPackages(PackageParams query, IProgressMonitor pm) {
private static List<PackageNode> getPackageRootChildren(PackageParams query, IProgressMonitor pm) {
try {
IPackageFragmentRoot packageRoot = getPackageFragmentRootFromQuery(query);
if (packageRoot == null) {
throw new CoreException(
new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath())));
}
List<Object> result = getPackageFragmentRootContent(packageRoot, query.isHierarchicalView(), pm);
ResourceSet resourceSet = new ResourceSet(result);
ResourceSet resourceSet = new ResourceSet(result, query.isHierarchicalView());
ResourceVisitor visitor = new JavaResourceVisitor(packageRoot.getJavaProject());
resourceSet.accept(visitor);
return visitor.getNodes();
Expand All @@ -375,28 +384,28 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam
return javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath()));
} catch (JavaModelException e) {
JdtlsExtActivator.log(e);
return null;
}
}
}

return null;
}

private static List<PackageNode> getRootTypes(PackageParams query, IProgressMonitor pm) {
private static List<PackageNode> getPackageChildren(PackageParams query, IProgressMonitor pm) {
IPackageFragment packageFragment = (IPackageFragment) JavaCore.create(query.getHandlerIdentifier());
List<Object> children = getChildrenForPackage(packageFragment);
List<Object> children = getChildrenForPackage(packageFragment, pm);
ResourceSet resourceSet = new ResourceSet(children);
ResourceVisitor visitor = new JavaResourceVisitor(packageFragment.getJavaProject());
resourceSet.accept(visitor);
return visitor.getNodes();
}

public static List<Object> getChildrenForPackage(IPackageFragment packageFragment) {
public static List<Object> getChildrenForPackage(IPackageFragment packageFragment, IProgressMonitor pm) {
if (packageFragment == null) {
return Collections.emptyList();
}

refreshLocal(packageFragment.getResource(), pm);
List<Object> children = new LinkedList<>();
try {
for (IJavaElement element : packageFragment.getChildren()) {
Expand All @@ -412,10 +421,7 @@ public static List<Object> getChildrenForPackage(IPackageFragment packageFragmen
}
}

Object[] nonJavaResources = packageFragment.getNonJavaResources();
for (Object resource : nonJavaResources) {
children.add(resource);
}
Collections.addAll(children, packageFragment.getNonJavaResources());
} catch (JavaModelException e) {
JdtlsExtActivator.log(e);
}
Expand Down Expand Up @@ -458,6 +464,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
// general resource folder.
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(Path.fromPortableString(query.getPath()));
if (folder.exists()) {
refreshLocal(folder, pm);
children.addAll(Arrays.asList(folder.members()));
javaProject = JavaCore.create(folder.getProject());
}
Expand Down Expand Up @@ -488,6 +495,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
*/
public static List<Object> getPackageFragmentRootContent(IPackageFragmentRoot root, boolean isHierarchicalView, IProgressMonitor pm) throws CoreException {
ArrayList<Object> result = new ArrayList<>();
refreshLocal(root.getResource(), pm);
if (isHierarchicalView) {
Map<String, IJavaElement> map = new HashMap<>();
for (IJavaElement child : root.getChildren()) {
Expand Down Expand Up @@ -583,4 +591,15 @@ public static IJavaProject getJavaProject(String projectUri) {
}
return null;
}

private static void refreshLocal(IResource resource, IProgressMonitor monitor) {
if (resource == null || !resource.exists()) {
return;
}
try {
resource.refreshLocal(IResource.DEPTH_ONE, monitor);
} catch (CoreException e) {
JdtlsExtActivator.log(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,13 @@
import java.util.ListIterator;
import java.util.Objects;

import org.eclipse.core.internal.utils.FileUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
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.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IClasspathEntry;
Expand All @@ -26,6 +30,7 @@
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ls.core.internal.ProjectUtils;

import com.microsoft.jdtls.ext.core.JdtlsExtActivator;
Expand All @@ -35,9 +40,15 @@
public class ResourceSet {

private List<Object> resources;
private boolean isHierarchicalView;

public ResourceSet(List<Object> resources) {
this(resources, false);
}

public ResourceSet(List<Object> resources, boolean isHierarchicalView) {
this.resources = resources;
this.isHierarchicalView = isHierarchicalView;
}

public void accept(ResourceVisitor visitor) {
Expand All @@ -58,11 +69,11 @@ public void accept(ResourceVisitor visitor) {
}

// skip invisible project's linked folder and add its children to the iterator.
if (!ProjectUtils.isVisibleProject(javaProject.getProject()) &&
if (ProjectUtils.isUnmanagedFolder(javaProject.getProject()) &&
Objects.equals(ProjectUtils.WORKSPACE_LINK, pkgRoot.getElementName())) {
try {
List<Object> nextObjs = PackageCommand.getPackageFragmentRootContent(
pkgRoot, false, new NullProgressMonitor());
pkgRoot, isHierarchicalView, new NullProgressMonitor());
for (Object nextObj : nextObjs) {
iterator.add(nextObj);
iterator.previous();
Expand All @@ -76,9 +87,9 @@ public void accept(ResourceVisitor visitor) {
}
} else if (resource instanceof IPackageFragment) {
IPackageFragment fragment = (IPackageFragment) resource;
// skil default package and add its children to the iterator.
// skip default package and add its children to the iterator.
if (fragment.isDefaultPackage()) {
List<Object> nextObjs = PackageCommand.getChildrenForPackage(fragment);
List<Object> nextObjs = PackageCommand.getChildrenForPackage(fragment, new NullProgressMonitor());
for (Object nextObj : nextObjs) {
iterator.add(nextObj);
iterator.previous();
Expand All @@ -91,12 +102,51 @@ public void accept(ResourceVisitor visitor) {
} else if (resource instanceof IClassFile) {
visitor.visit((IClassFile) resource);
} else if (resource instanceof IFile) {
visitor.visit((IFile) resource);
if (shouldVisit((IFile) resource)) {
visitor.visit((IFile) resource);
}
} else if (resource instanceof IFolder) {
visitor.visit((IFolder) resource);
if (shouldVisit((IFolder) resource)) {
visitor.visit((IFolder) resource);
}
} else if (resource instanceof IJarEntryResource) {
visitor.visit((IJarEntryResource) resource);
}
}
}

/**
* Check if the IFolder or IFile should be visited. The following conditions will skip visit:
* <ul>
* <li>the resource is null.</li>
* <li>the resource does not belong to any project.</li>
* <li>the resource is not in the project's real location.</li>
* <li>the resource is a java element.</li>
* </ul>
*/
private boolean shouldVisit(IResource resource) {
if (resource == null) {
return false;
}

IProject project = resource.getProject();
if (project == null) {
return false;
}

IPath projectRealFolder = ProjectUtils.getProjectRealFolder(project.getProject());
IPath resourcePath = FileUtil.toPath(resource.getLocationURI());
// check if the resource stores in the project's real location.
if (!projectRealFolder.isPrefixOf(resourcePath)) {
return false;
}

// skip linked folder.
if (Objects.equals(projectRealFolder, resourcePath) &&
Objects.equals(ProjectUtils.WORKSPACE_LINK, resource.getName())) {
return false;
}

return JavaCore.create(resource) == null;
}
}
3 changes: 3 additions & 0 deletions src/explorerCommands/rename.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ function getValueSelection(uri: string): [number, number] | undefined {
}

function CheckQualifiedInputName(value: string, nodeKind: NodeKind): string {
if (nodeKind === NodeKind.Folder || nodeKind === NodeKind.File) {
return "";
}
const javaValidateMessage = checkJavaQualifiedName(value);

if (javaValidateMessage) {
Expand Down
Loading