/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.search; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.runtime.CoreException; import org.robotframework.ide.eclipse.main.plugin.model.RobotModel; import org.robotframework.ide.eclipse.main.plugin.model.RobotProject; import org.robotframework.ide.eclipse.main.plugin.project.ASuiteFileDescriber; import org.robotframework.ide.eclipse.main.plugin.project.RobotProjectNature; import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification; import org.robotframework.ide.eclipse.main.plugin.search.SearchSettings.SearchTarget; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; /** * @author Michal Anglart * */ class SearchQueryTargets { private final Set<IFile> filesToSearch = new LinkedHashSet<>(); private final Multimap<IProject, LibrarySpecification> librariesToSearch = LinkedHashMultimap.create(); private final RobotModel model; public SearchQueryTargets(final RobotModel model) { this.model = model; } Set<IFile> getResourcesToSearch() { return filesToSearch; } Multimap<IProject, LibrarySpecification> getLibrariesToSearch() { return librariesToSearch; } void collect(final List<IResource> resourcesRoots, final Set<SearchTarget> targets) { for (final IResource resourceRoot : resourcesRoots) { if (isClosedOrNonRobotProject(resourceRoot)) { continue; } final IProject project = resourceRoot.getProject(); if (resourceRoot.getType() == IResource.PROJECT && !librariesToSearch.containsKey(project)) { final RobotProject robotProject = model.createRobotProject(project); librariesToSearch.putAll(project, robotProject.getLibrariesSpecifications()); } try { resourceRoot.accept(new IResourceVisitor() { @Override public boolean visit(final IResource resource) throws CoreException { if (resource.getType() == IResource.FILE && !isInsideEclipseHiddenDirectory(resource)) { final IFile file = (IFile) resource; if (targets.contains(SearchTarget.SUITE) && ASuiteFileDescriber.isSuiteFile(file)) { filesToSearch.add(file); } else if (targets.contains(SearchTarget.RESOURCE) && (ASuiteFileDescriber.isInitializationFile(file) || ASuiteFileDescriber.isResourceFile(file))) { filesToSearch.add(file); } } return true; } }); } catch (final CoreException e) { // then we'll try to get those resources we would be able to } } } private boolean isInsideEclipseHiddenDirectory(final IResource resource) { for (final String segment : resource.getFullPath().segments()) { if (!segment.isEmpty() && segment.charAt(0) == '.') { return true; } } return false; } private boolean isClosedOrNonRobotProject(final IResource resourceRoot) { return resourceRoot instanceof IProject && (!((IProject) resourceRoot).isOpen() || !RobotProjectNature.hasRobotNature((IProject) resourceRoot)); } }