diff options
Diffstat (limited to 'platform/util/src/com/intellij/openapi/util')
6 files changed, 57 insertions, 25 deletions
diff --git a/platform/util/src/com/intellij/openapi/util/JDOMUtil.java b/platform/util/src/com/intellij/openapi/util/JDOMUtil.java index 2cd5ed09bfdc..c82ee6df346b 100644 --- a/platform/util/src/com/intellij/openapi/util/JDOMUtil.java +++ b/platform/util/src/com/intellij/openapi/util/JDOMUtil.java @@ -204,34 +204,34 @@ public class JDOMUtil { @NotNull private static String intern(@NotNull final StringInterner interner, @NotNull final String s) { - synchronized (interner) { - return interner.intern(s); - } + return interner.intern(s); } @NotNull - public static String legalizeText(@NotNull final String str) { - StringReader reader = new StringReader(str); - StringBuilder result = new StringBuilder(); - - while(true) { - try { - int each = reader.read(); - if (each == -1) break; + public static String legalizeText(@NotNull String str) { + return legalizeChars(str).toString(); + } - if (Verifier.isXMLCharacter(each)) { - result.append((char)each); - } else { - result.append("0x").append(StringUtil.toUpperCase(Long.toHexString(each))); - } - } - catch (IOException ignored) { - } + @NotNull + public static CharSequence legalizeChars(@NotNull CharSequence str) { + StringBuilder result = new StringBuilder(str.length()); + for (int i = 0, len = str.length(); i < len; i ++) { + appendLegalized(result, str.charAt(i)); } - - return result.toString().replaceAll("<", "<").replaceAll(">", ">"); + return result; } + public static void appendLegalized(@NotNull StringBuilder sb, char each) { + if (each == '<' || each == '>') { + sb.append(each == '<' ? "<" : ">"); + } + else if (!Verifier.isXMLCharacter(each)) { + sb.append("0x").append(StringUtil.toUpperCase(Long.toHexString(each))); + } + else { + sb.append(each); + } + } private static class EmptyTextFilter implements Filter { @Override diff --git a/platform/util/src/com/intellij/openapi/util/LowMemoryWatcher.java b/platform/util/src/com/intellij/openapi/util/LowMemoryWatcher.java index 33bd953d422f..f6c7b924590a 100644 --- a/platform/util/src/com/intellij/openapi/util/LowMemoryWatcher.java +++ b/platform/util/src/com/intellij/openapi/util/LowMemoryWatcher.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.util; +import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.ConcurrencyUtil; import com.intellij.util.containers.WeakList; @@ -93,10 +94,29 @@ public class LowMemoryWatcher { }, null, null); } + /** + * Registers a runnable to run on low memory events + * @return a LowMemoryWatcher instance holding the runnable. This instance should be kept in memory while the + * low memory notification functionality is needed. As soon as it's garbage-collected, the runnable won't receive any further notifications. + */ public static LowMemoryWatcher register(Runnable runnable) { return new LowMemoryWatcher(runnable); } + /** + * Registers a runnable to run on low memory events. The notifications will be issued until parentDisposable is disposed. + */ + public static void register(Runnable runnable, Disposable parentDisposable) { + final Ref<LowMemoryWatcher> watcher = Ref.create(new LowMemoryWatcher(runnable)); + Disposer.register(parentDisposable, new Disposable() { + @Override + public void dispose() { + watcher.get().stop(); + watcher.set(null); + } + }); + } + private LowMemoryWatcher(Runnable runnable) { myRunnable = runnable; ourInstances.add(this); diff --git a/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java b/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java index 96eefe8ddf78..d604d5f41ed1 100644 --- a/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java +++ b/platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java @@ -38,6 +38,7 @@ public abstract class NotNullLazyValue<T> { return myValue; } + @NotNull public static <T> NotNullLazyValue<T> createConstantValue(@NotNull final T value) { return new NotNullLazyValue<T>() { @NotNull diff --git a/platform/util/src/com/intellij/openapi/util/Ref.java b/platform/util/src/com/intellij/openapi/util/Ref.java index d35b39de264b..0119c5626bf7 100644 --- a/platform/util/src/com/intellij/openapi/util/Ref.java +++ b/platform/util/src/com/intellij/openapi/util/Ref.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.util; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -49,6 +50,7 @@ public class Ref<T> { return false; } + @NotNull public static <T> Ref<T> create() { return new Ref<T>(); } diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index adec13d20412..7d3d6f557249 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -848,9 +848,10 @@ public class FileUtil extends FileUtilRt { } public static boolean isFilePathAcceptable(@NotNull File root, @Nullable FileFilter fileFilter) { + if (fileFilter == null) return true; File file = root; do { - if (fileFilter != null && !fileFilter.accept(file)) return false; + if (!fileFilter.accept(file)) return false; file = file.getParentFile(); } while (file != null); diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index e364a8568fda..af2b3dd4293e 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -96,7 +96,7 @@ public class StringUtil extends StringUtilRt { @Nullable @Override public String fun(@Nullable String s) { - return s == null ? null : s.trim(); + return trim(s); } }; @@ -246,6 +246,7 @@ public class StringUtil extends StringUtilRt { return html.replaceAll("<(.|\n)*?>", ""); } + @Contract("null -> null; !null -> !null") public static String toLowerCase(@Nullable final String str) { //noinspection ConstantConditions return str == null ? null : str.toLowerCase(); @@ -852,6 +853,11 @@ public class StringUtil extends StringUtilRt { return startsWithConcatenation(string, firstPrefix, secondPrefix, thirdPrefix); } + @Contract("null -> null; !null -> !null") + public static String trim(@Nullable String s) { + return s == null ? null : s.trim(); + } + @NotNull public static String trimEnd(@NotNull String s, @NonNls @NotNull String suffix) { if (s.endsWith(suffix)) { @@ -1467,7 +1473,7 @@ public class StringUtil extends StringUtilRt { /** * @deprecated use #capitalize(String) */ - @Nullable + @Contract("null -> null; !null -> !null") public static String firstLetterToUpperCase(@Nullable final String displayString) { if (displayString == null || displayString.isEmpty()) return displayString; char firstChar = displayString.charAt(0); @@ -1827,11 +1833,13 @@ public class StringUtil extends StringUtilRt { @NonNls private static final String[] REPLACES_REFS = {"<", ">", "&", "'", """}; @NonNls private static final String[] REPLACES_DISP = {"<", ">", "&", "'", "\""}; + @Contract("null -> null; !null -> !null") public static String unescapeXml(@Nullable final String text) { if (text == null) return null; return replace(text, REPLACES_REFS, REPLACES_DISP); } + @Contract("null -> null; !null -> !null") public static String escapeXml(@Nullable final String text) { if (text == null) return null; return replace(text, REPLACES_DISP, REPLACES_REFS); |