From e1a795a3a9a3c555a553fc02b4480410be957e0c Mon Sep 17 00:00:00 2001 From: Roman Chernyatchik Date: Thu, 22 Oct 2009 23:07:28 +0400 Subject: [PATCH] 1. utility class was renamed. 2. location provider util class was refactored for smarter file search algorithm --- .../testframework/sm/FileUrlProvider.java | 7 +- .../testframework/sm/LocationProviderUtil.java | 68 ------------ .../sm/TestsLocationProviderUtil.java | 120 +++++++++++++++++++++ .../testframework/sm/runner/SMTestProxy.java | 6 +- .../testframework/sm/LocationProviderUtilTest.java | 28 ++--- 5 files changed, 142 insertions(+), 87 deletions(-) delete mode 100644 platform/smRunner/src/com/intellij/execution/testframework/sm/LocationProviderUtil.java create mode 100644 platform/smRunner/src/com/intellij/execution/testframework/sm/TestsLocationProviderUtil.java diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java index 08ce764029..22cd2f4e7f 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/FileUrlProvider.java @@ -20,6 +20,7 @@ import com.intellij.execution.PsiLocation; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.testIntegration.TestLocationProvider; @@ -71,8 +72,10 @@ public class FileUrlProvider implements TestLocationProvider { lineNumber = 1; filePath = normalizedPath; } - //Now we should seach file with most sutable path - final List virtualFiles = LocationProviderUtil.findSuitableFilesFor(filePath); + // Now we should search file with most suitable path + // here path may be absolute or relative + final String systemIndependentPath = FileUtil.toSystemIndependentName(filePath); + final List virtualFiles = TestsLocationProviderUtil.findSuitableFilesFor(systemIndependentPath, project); if (virtualFiles.isEmpty()) { return Collections.emptyList(); } diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/LocationProviderUtil.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/LocationProviderUtil.java deleted file mode 100644 index a83b0a432c..0000000000 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/LocationProviderUtil.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.execution.testframework.sm; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.NonNls; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.LocalFileSystem; -import com.intellij.openapi.vfs.ex.temp.TempFileSystem; -import com.intellij.openapi.application.ApplicationManager; - -import java.util.List; -import java.util.Collections; - -/** - * @author Roman Chernyatchik - */ -public class LocationProviderUtil { - @NonNls private static final String PROTOCOL_SEPARATOR = "://"; - - private LocationProviderUtil() { - } - - @Nullable - public static String extractProtocol(@NotNull final String locationUrl) { - final int index = locationUrl.indexOf(PROTOCOL_SEPARATOR); - if (index >= 0) { - return locationUrl.substring(0, index); - } - return null; - } - - @Nullable - public static String extractPath(@NotNull final String locationUrl) { - final int index = locationUrl.indexOf(PROTOCOL_SEPARATOR); - if (index >= 0) { - return locationUrl.substring(index + PROTOCOL_SEPARATOR.length()); - } - return null; - } - - public static List findSuitableFilesFor(final String filePath) { - final VirtualFile fileByPath = LocalFileSystem.getInstance().findFileByPath(filePath); - if (fileByPath != null) { - return Collections.singletonList(fileByPath); - } - // if we are in UnitTest mode probably TempFileSystem is used instead of LocaFileSystem - if (ApplicationManager.getApplication().isUnitTestMode()) { - final VirtualFile tempFileByPath = TempFileSystem.getInstance().findFileByPath(filePath); - return Collections.singletonList(tempFileByPath); - } - return Collections.emptyList(); - } -} diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/TestsLocationProviderUtil.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/TestsLocationProviderUtil.java new file mode 100644 index 0000000000..9e3d71010b --- /dev/null +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/TestsLocationProviderUtil.java @@ -0,0 +1,120 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.testframework.sm; + +import com.intellij.navigation.ChooseByNameContributor; +import com.intellij.navigation.NavigationItem; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.ex.temp.TempFileSystem; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author Roman Chernyatchik + */ +public class TestsLocationProviderUtil { + @NonNls private static final String PROTOCOL_SEPARATOR = "://"; + + private TestsLocationProviderUtil() { + } + + @Nullable + public static String extractProtocol(@NotNull final String locationUrl) { + final int index = locationUrl.indexOf(PROTOCOL_SEPARATOR); + if (index >= 0) { + return locationUrl.substring(0, index); + } + return null; + } + + @Nullable + public static String extractPath(@NotNull final String locationUrl) { + final int index = locationUrl.indexOf(PROTOCOL_SEPARATOR); + if (index >= 0) { + return locationUrl.substring(index + PROTOCOL_SEPARATOR.length()); + } + return null; + } + + public static List findSuitableFilesFor(final String filePath, final Project project) { + final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex(); + + // at first let's try to find file as is, by it's real path + // and check that file belongs to current project + // this location provider designed for tests thus we will check only project content + // (we cannot check just sources or tests folders because RM doesn't use it + final VirtualFile file = getByFullPath(filePath); + final boolean inProjectContent = file != null && (index.isInContent(file)); + + if (inProjectContent) { + return Collections.singletonList(file); + } + + //TODO: split file by "/" in parts + final List folders = new ArrayList(); + //TODO: + final String fileName = "foo.feature"; + + //otherwise let's find all files with the same name and similar relative path + final List items = new ArrayList(); + final ChooseByNameContributor[] contributors = Extensions.getExtensions(ChooseByNameContributor.FILE_EP_NAME); + for (ChooseByNameContributor contributor : contributors) { + // let's find files with same name in project and libraries + final NavigationItem[] navigationItems = contributor.getItemsByName(fileName, fileName, project, true); + for (NavigationItem navigationItem : navigationItems) { + if (navigationItem instanceof PsiFile) { + items.add(navigationItem); + } + } + } + //TODO let's filter psi files ... + + //TODO let's iterate relative path components and determine which files are closer to our relative path + // let's extract the closest files to relative path. For this we will sort items by distance and + // we also assume that relative files and folders should have at least one common parent folder - just to remove false positives on some cases + for (String folder : folders) { + + } + + return Collections.emptyList(); + } + + @Nullable + private static VirtualFile getByFullPath(String filePath) { + final VirtualFile fileByPath = LocalFileSystem.getInstance().findFileByPath(filePath); + if (fileByPath != null) { + return fileByPath; + } + // if we are in UnitTest mode probably TempFileSystem is used instead of LocaFileSystem + if (ApplicationManager.getApplication().isUnitTestMode()) { + final VirtualFile tempFileByPath = TempFileSystem.getInstance().findFileByPath(filePath); + return tempFileByPath; + } + return null; + } +} diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java index bcd9d679ed..8ffba72416 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java @@ -17,7 +17,7 @@ package com.intellij.execution.testframework.sm.runner; import com.intellij.execution.Location; import com.intellij.execution.testframework.*; -import com.intellij.execution.testframework.sm.LocationProviderUtil; +import com.intellij.execution.testframework.sm.TestsLocationProviderUtil; import com.intellij.execution.testframework.sm.runner.states.*; import com.intellij.execution.testframework.sm.runner.ui.TestsPresentationUtil; import com.intellij.execution.testframework.ui.PrintableTestProxy; @@ -136,8 +136,8 @@ public class SMTestProxy extends CompositePrintable implements PrintableTestProx return null; } - final String protocolId = LocationProviderUtil.extractProtocol(myLocationUrl); - final String path = LocationProviderUtil.extractPath(myLocationUrl); + final String protocolId = TestsLocationProviderUtil.extractProtocol(myLocationUrl); + final String path = TestsLocationProviderUtil.extractPath(myLocationUrl); if (protocolId != null && path != null) { for (TestLocationProvider provider : Extensions.getExtensions(TestLocationProvider.EP_NAME)) { diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/LocationProviderUtilTest.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/LocationProviderUtilTest.java index 32ea21b72c..dd2a99cfd2 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/LocationProviderUtilTest.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/LocationProviderUtilTest.java @@ -23,39 +23,39 @@ import com.intellij.testFramework.UsefulTestCase; public class LocationProviderUtilTest extends UsefulTestCase { public void testExtractProtocol() { assertEquals(null, - LocationProviderUtil.extractProtocol("")); + TestsLocationProviderUtil.extractProtocol("")); assertEquals(null, - LocationProviderUtil.extractProtocol("file:/")); + TestsLocationProviderUtil.extractProtocol("file:/")); assertEquals("file", - LocationProviderUtil.extractProtocol("file://")); + TestsLocationProviderUtil.extractProtocol("file://")); assertEquals("file", - LocationProviderUtil.extractProtocol("file:///some/path/file.rb:24")); + TestsLocationProviderUtil.extractProtocol("file:///some/path/file.rb:24")); assertEquals("file", - LocationProviderUtil.extractProtocol("file://./some/path/file.rb:24")); + TestsLocationProviderUtil.extractProtocol("file://./some/path/file.rb:24")); assertEquals("ruby_qn", - LocationProviderUtil.extractProtocol("ruby_qn://")); + TestsLocationProviderUtil.extractProtocol("ruby_qn://")); assertEquals("ruby_qn", - LocationProviderUtil.extractProtocol("ruby_qn://A::B.method")); + TestsLocationProviderUtil.extractProtocol("ruby_qn://A::B.method")); } public void testExtractPath() { assertEquals(null, - LocationProviderUtil.extractPath("")); + TestsLocationProviderUtil.extractPath("")); assertEquals(null, - LocationProviderUtil.extractPath("file:/")); + TestsLocationProviderUtil.extractPath("file:/")); assertEquals("", - LocationProviderUtil.extractPath("file://")); + TestsLocationProviderUtil.extractPath("file://")); assertEquals("/some/path/file.rb:24", - LocationProviderUtil.extractPath("file:///some/path/file.rb:24")); + TestsLocationProviderUtil.extractPath("file:///some/path/file.rb:24")); assertEquals("./some/path/file.rb:24", - LocationProviderUtil.extractPath("file://./some/path/file.rb:24")); + TestsLocationProviderUtil.extractPath("file://./some/path/file.rb:24")); assertEquals("", - LocationProviderUtil.extractPath("ruby_qn://")); + TestsLocationProviderUtil.extractPath("ruby_qn://")); assertEquals("A::B.method", - LocationProviderUtil.extractPath("ruby_qn://A::B.method")); + TestsLocationProviderUtil.extractPath("ruby_qn://A::B.method")); } } -- 2.11.4.GIT