diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/VirtualFileImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/VirtualFileImpl.java index ceb4bc48eae1..fc32ae9a16d5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/VirtualFileImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/http/VirtualFileImpl.java @@ -18,7 +18,6 @@ package com.intellij.openapi.vfs.impl.http; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.VirtualFileSystem; @@ -65,7 +64,7 @@ class VirtualFileImpl extends HttpVirtualFile { } }); - path = StringUtil.trimEnd(UriUtil.trimParameters(path), "/"); + path = UriUtil.trimLastSlash(UriUtil.trimParameters(path)); int lastSlash = path.lastIndexOf('/'); if (lastSlash == -1) { myParentPath = null; diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java index 30ca7fe152b6..ec39e360282b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/newvfs/persistent/PersistentFSImpl.java @@ -23,21 +23,18 @@ import com.intellij.openapi.util.LowMemoryWatcher; import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.*; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.*; import com.intellij.openapi.vfs.newvfs.*; import com.intellij.openapi.vfs.newvfs.events.*; import com.intellij.openapi.vfs.newvfs.impl.FakeVirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl; import com.intellij.openapi.vfs.newvfs.impl.VirtualFileSystemEntry; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Function; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.SmartList; +import com.intellij.util.*; import com.intellij.util.containers.ConcurrentIntObjectMap; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.StripedLockIntObjectConcurrentHashMap; import com.intellij.util.io.ReplicatorInputStream; +import com.intellij.util.io.URLUtil; import com.intellij.util.messages.MessageBus; import gnu.trove.*; import org.jetbrains.annotations.NonNls; @@ -942,8 +939,7 @@ public class PersistentFSImpl extends PersistentFS implements ApplicationCompone @NotNull private static String normalizeRootUrl(@NotNull String basePath, @NotNull NewVirtualFileSystem fs) { // need to protect against relative path of the form "/x/../y" - String url = fs.getProtocol() + "://" + VfsImplUtil.normalize(fs, FileUtil.toCanonicalPath(basePath)); - return StringUtil.trimEnd(url, "/"); + return UriUtil.trimLastSlash(fs.getProtocol() + URLUtil.SCHEME_SEPARATOR + VfsImplUtil.normalize(fs, FileUtil.toCanonicalPath(basePath))); } @Override diff --git a/platform/platform-impl/src/com/intellij/util/UriUtil.java b/platform/platform-impl/src/com/intellij/util/UriUtil.java index 3a77c87352a8..7ee163431cf8 100644 --- a/platform/platform-impl/src/com/intellij/util/UriUtil.java +++ b/platform/platform-impl/src/com/intellij/util/UriUtil.java @@ -34,15 +34,17 @@ import static com.intellij.openapi.util.text.StringUtil.stripQuotesAroundValue; public final class UriUtil { public static final CharMatcher PARAM_CHAR_MATCHER = CharMatcher.anyOf("?#;"); + public static final CharMatcher SLASH_MATCHER = CharMatcher.is('/'); private static final Pattern DATA_URI_PATTERN = Pattern.compile("data:([^,;]+/[^,;]+)(;charset=[^,;]+)?(;base64)?,(.+)"); private UriUtil() { } - /** - * must be synchronized with trimUrlParameters in utils.js - */ + public static String trimLastSlash(@NotNull String url) { + return SLASH_MATCHER.trimTrailingFrom(url); + } + public static String trimParameters(@NotNull String url) { int end = PARAM_CHAR_MATCHER.indexIn(url); return end != -1 ? url.substring(0, end) : url; diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.java index 4c5b10c890fb..05ba63f17782 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/configurable/VcsDirectoryConfigurationPanel.java @@ -34,6 +34,7 @@ import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; import com.intellij.ui.table.TableView; +import com.intellij.util.UriUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.*; import com.intellij.xml.util.XmlStringUtil; @@ -106,7 +107,7 @@ public class VcsDirectoryConfigurationPanel extends JPanel implements Configurab String directory = mapping.getDirectory(); VirtualFile baseDir = myProject.getBaseDir(); if (baseDir != null) { - final File directoryFile = new File(StringUtil.trimEnd(StringUtil.trimEnd(directory, "/"), "\\") + "/"); + final File directoryFile = new File(StringUtil.trimEnd(UriUtil.trimLastSlash(directory), "\\") + "/"); File ioBase = new File(baseDir.getPath()); if (directoryFile.isAbsolute() && !FileUtil.isAncestor(ioBase, directoryFile, false)) { append(new File(directory).getPath()); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/RootUrlInfo.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/RootUrlInfo.java index d16e4c9e13de..73ec70bfd518 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/RootUrlInfo.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/RootUrlInfo.java @@ -15,8 +15,8 @@ */ package org.jetbrains.idea.svn; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.UriUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.tmatesoft.svn.core.SVNURL; @@ -43,7 +43,7 @@ public class RootUrlInfo implements RootUrlPair { myNode = node; myFormat = format; myRoot = root; - myRepositoryUrl = StringUtil.trimEnd(node.getRepositoryRootUrl().toString(), "/"); + myRepositoryUrl = UriUtil.trimLastSlash(node.getRepositoryRootUrl().toString()); myType = type; } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepositoryEditor.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepositoryEditor.java index b69f64873ec7..7af64faeabfb 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepositoryEditor.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/mantis/MantisRepositoryEditor.java @@ -1,12 +1,11 @@ package com.intellij.tasks.mantis; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.tasks.config.BaseRepositoryEditor; import com.intellij.ui.components.JBLabel; import com.intellij.util.Consumer; +import com.intellij.util.UriUtil; import com.intellij.util.ui.FormBuilder; import org.jetbrains.annotations.Nullable; @@ -19,8 +18,6 @@ import java.awt.event.ItemListener; * Date: 9/21/12 */ public class MantisRepositoryEditor extends BaseRepositoryEditor { - private static final Logger LOG = Logger.getInstance("#com.intellij.tasks.mantis.MantisRepositoryEditor"); - private ComboBox myProjectCombobox; private ComboBox myFilterCombobox; private JBLabel myProjectLabel; @@ -35,7 +32,7 @@ public class MantisRepositoryEditor extends BaseRepositoryEditor