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 ) ); } }