UriUtil.trimLastSlash

refine Url nullability (newFromIdea is not yet done)
This commit is contained in:
Vladimir Krivosheev
2013-11-18 15:35:31 +01:00
parent 3ab82b6fa6
commit 9b8aac57bd
8 changed files with 23 additions and 24 deletions
@@ -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;
@@ -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
@@ -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;
@@ -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());
@@ -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;
}
@@ -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<MantisRepository> {
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<MantisRepositor
@Override
public void apply() {
if (!myRepository.getUrl().equals(StringUtil.trimEnd(myURLText.getText(), "/")) ||
if (!myRepository.getUrl().equals(UriUtil.trimLastSlash(myURLText.getText())) ||
!myRepository.getUsername().equals(myUserNameText.getText()) ||
!myRepository.getPassword().equals(myPasswordText.getText())) {
resetComboBoxes();
@@ -15,7 +15,6 @@
*/
package com.intellij.ide.browsers;
import com.google.common.base.CharMatcher;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -35,15 +34,13 @@ import java.util.regex.Pattern;
public final class Urls {
private static final Logger LOG = Logger.getInstance(Urls.class);
public static final CharMatcher SLASH_MATCHER = CharMatcher.is('/');
// about ";" see WEB-100359
private static final Pattern URI_PATTERN = Pattern.compile("^([^:/?#]+)://([^/?#]*)([^?#;]*)(.*)");
@NotNull
public static Url newFromEncoded(@NotNull String url) {
Url result = parse(url, true);
LOG.assertTrue(result != null);
LOG.assertTrue(result != null, url);
return result;
}
@@ -19,6 +19,7 @@
*/
package com.intellij.javaee;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFileSystemItem;
@@ -40,4 +41,10 @@ public class UriUtil {
String location = ExternalResourceManager.getInstance().getResourceLocation(uri, base.getProject());
return VfsUtilCore.findRelativeFile(location, base.getVirtualFile());
}
// cannot use UriUtil.SLASH_MATCHER.trimFrom - we don't depend on guava
@NotNull
public static String trimSlashFrom(@NotNull String path) {
return StringUtil.trimStart(StringUtil.trimEnd(path, "/"), "/");
}
}