package org.jetbrains.plugins.gradle.service.settings; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.service.settings.ExternalSystemConfigLocator; import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtil; import org.gradle.tooling.GradleConnector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.util.GradleConstants; import java.io.File; import java.util.List; /** * We store not gradle config file but its parent dir path instead. That is implied by gradle design * ({@link GradleConnector#forProjectDirectory(File)}). * <p/> * That's why we need to provide special code which maps that directory to exact config file. * * @author Denis Zhdanov * @since 7/16/13 3:43 PM */ public class GradleConfigLocator implements ExternalSystemConfigLocator { @NotNull @Override public ProjectSystemId getTargetExternalSystemId() { return GradleConstants.SYSTEM_ID; } @Nullable @Override public VirtualFile adjust(@NotNull VirtualFile configPath) { if (!configPath.isDirectory()) { return configPath; } VirtualFile result = configPath.findChild(GradleConstants.DEFAULT_SCRIPT_NAME); if (result != null) { return result; } for (VirtualFile child : configPath.getChildren()) { String name = child.getName(); if (!name.endsWith(GradleConstants.EXTENSION)) { continue; } if (!GradleConstants.SETTINGS_FILE_NAME.equals(name) && !child.isDirectory()) { return child; } } return null; } @NotNull @Override public List<VirtualFile> findAll(@NotNull ExternalProjectSettings externalProjectSettings) { List<VirtualFile> list = ContainerUtil.newArrayList(); for (String path : externalProjectSettings.getModules()) { VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(path)); if (vFile != null) { for (VirtualFile child : vFile.getChildren()) { String name = child.getName(); if (!child.isDirectory() && name.endsWith(GradleConstants.EXTENSION)) { list.add(child); } } } } return list; } }