NestedProjectFilter.java
package com.codeaffine.extras.ide.internal.resourcefilter;
import static java.util.Arrays.asList;
import static org.eclipse.core.resources.IResource.PROJECT;
import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.filtermatchers.AbstractFileInfoMatcher;
import org.eclipse.core.runtime.Path;
public class NestedProjectFilter extends AbstractFileInfoMatcher {
public static final String ID
= "com.codeaffine.extras.ide.internal.resourcefilter.NestedProjectFilter";
private static RecursionGuard recursionGuard = new RecursionGuard();
private IProject project;
@Override
public void initialize( IProject project, Object arguments ) {
this.project = project;
}
@Override
public boolean matches( IContainer parent, IFileInfo fileInfo ) {
if( !fileInfo.isDirectory() || recursionGuard.isInUse( project )) {
return false;
}
recursionGuard.enter( project );
try {
return findContainer( parent, fileInfo.getName() )
.stream()
.anyMatch( container -> container.getType() == PROJECT && !container.equals( project ) );
} finally {
recursionGuard.leave( project );
}
}
private Collection<IContainer> findContainer( IContainer parent, String folderName ) {
URI locationURI = parent.getFolder( new Path( folderName ) ).getLocationURI();
return locationURI == null ? Collections.emptyList() : findContainers( locationURI );
}
private Collection<IContainer> findContainers( URI locationURI ) {
return asList( project.getWorkspace().getRoot().findContainersForLocationURI( locationURI ) );
}
}