diff options
Diffstat (limited to 'platform/util/src/com')
21 files changed, 156 insertions, 64 deletions
diff --git a/platform/util/src/com/intellij/diagnostic/ThreadDumper.java b/platform/util/src/com/intellij/diagnostic/ThreadDumper.java index ede7cddbd5c5..a67cc6cbdc31 100644 --- a/platform/util/src/com/intellij/diagnostic/ThreadDumper.java +++ b/platform/util/src/com/intellij/diagnostic/ThreadDumper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 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. @@ -24,6 +24,8 @@ import java.io.Writer; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; +import java.util.Arrays; +import java.util.Comparator; /** * @author yole @@ -44,7 +46,7 @@ public class ThreadDumper { boolean dumpSuccessful = false; try { - ThreadInfo[] threads = threadMXBean.dumpAllThreads(false, false); + ThreadInfo[] threads = sort(threadMXBean.dumpAllThreads(false, false)); for(ThreadInfo info: threads) { if (info != null) { if (info.getThreadName().equals("AWT-EventQueue-1")) { @@ -61,7 +63,7 @@ public class ThreadDumper { if (!dumpSuccessful) { final long[] threadIds = threadMXBean.getAllThreadIds(); - final ThreadInfo[] threadInfo = threadMXBean.getThreadInfo(threadIds, Integer.MAX_VALUE); + final ThreadInfo[] threadInfo = sort(threadMXBean.getThreadInfo(threadIds, Integer.MAX_VALUE)); for (ThreadInfo info : threadInfo) { if (info != null) { if (info.getThreadName().equals("AWT-EventQueue-1")) { @@ -75,6 +77,25 @@ public class ThreadDumper { return edtStack; } + private static ThreadInfo[] sort(ThreadInfo[] threads) { + Arrays.sort(threads, new Comparator<ThreadInfo>() { + @Override + public int compare(ThreadInfo o1, ThreadInfo o2) { + final String t1 = o1.getThreadName(); + final String t2 = o2.getThreadName(); + if (t1.startsWith("AWT-EventQueue")) return -1; + if (t2.startsWith("AWT-EventQueue")) return 1; + final boolean r1 = o1.getThreadState() == Thread.State.RUNNABLE; + final boolean r2 = o2.getThreadState() == Thread.State.RUNNABLE; + if (r1 && !r2) return -1; + if (r2 && !r1) return 1; + return 0; + } + }); + + return threads; + } + private static void dumpThreadInfo(final ThreadInfo info, final Writer f) { dumpCallStack(info, f, info.getStackTrace()); } diff --git a/platform/util/src/com/intellij/icons/AllIcons.java b/platform/util/src/com/intellij/icons/AllIcons.java index 318895db57f1..a80ffccdd58e 100644 --- a/platform/util/src/com/intellij/icons/AllIcons.java +++ b/platform/util/src/com/intellij/icons/AllIcons.java @@ -74,9 +74,9 @@ public class AllIcons { public static final Icon Forward = IconLoader.getIcon("/actions/forward.png"); // 16x16 public static final Icon GC = IconLoader.getIcon("/actions/gc.png"); // 16x16 public static final Icon Get = IconLoader.getIcon("/actions/get.png"); // 16x16 + public static final Icon GroupByClass = IconLoader.getIcon("/actions/GroupByClass.png"); // 16x16 public static final Icon GroupByFile = IconLoader.getIcon("/actions/GroupByFile.png"); // 16x16 public static final Icon GroupByMethod = IconLoader.getIcon("/actions/groupByMethod.png"); // 16x16 - public static final Icon GroupByClass = IconLoader.getIcon("/actions/GroupByClass.png"); // 16x16 public static final Icon GroupByModule = IconLoader.getIcon("/actions/GroupByModule.png"); // 16x16 public static final Icon GroupByModuleGroup = IconLoader.getIcon("/actions/GroupByModuleGroup.png"); // 16x16 public static final Icon GroupByPackage = IconLoader.getIcon("/actions/GroupByPackage.png"); // 16x16 @@ -833,6 +833,7 @@ public class AllIcons { public static final Icon Method = IconLoader.getIcon("/nodes/method.png"); // 16x16 public static final Icon Module = IconLoader.getIcon("/nodes/Module.png"); // 16x16 public static final Icon ModuleGroup = IconLoader.getIcon("/nodes/moduleGroup.png"); // 16x16 + public static final Icon NativeLibrariesFolder = IconLoader.getIcon("/nodes/nativeLibrariesFolder.png"); // 16x16 public static final Icon NewException = IconLoader.getIcon("/nodes/newException.png"); // 14x14 public static final Icon NewFolder = IconLoader.getIcon("/nodes/newFolder.png"); // 16x16 public static final Icon NewParameter = IconLoader.getIcon("/nodes/newParameter.png"); // 14x14 diff --git a/platform/util/src/com/intellij/openapi/application/PathManager.java b/platform/util/src/com/intellij/openapi/application/PathManager.java index 4001fd0138ef..9956959f0e22 100644 --- a/platform/util/src/com/intellij/openapi/application/PathManager.java +++ b/platform/util/src/com/intellij/openapi/application/PathManager.java @@ -418,7 +418,7 @@ public class PathManager { private static String getAbsolutePath(String path) { path = FileUtil.expandUserHome(path); - return new File(path).getAbsolutePath(); + return FileUtil.toCanonicalPath(new File(FileUtil.toCanonicalPath(path)).getAbsolutePath()); } private static String trimPathQuotes(String path){ diff --git a/platform/util/src/com/intellij/openapi/diagnostic/Logger.java b/platform/util/src/com/intellij/openapi/diagnostic/Logger.java index f3da0c22fde5..d90876fe6be9 100644 --- a/platform/util/src/com/intellij/openapi/diagnostic/Logger.java +++ b/platform/util/src/com/intellij/openapi/diagnostic/Logger.java @@ -69,6 +69,7 @@ public abstract class Logger { return ourFactory.getLoggerInstance(category); } + @NotNull public static Logger getInstance(Class cl) { return getInstance("#" + cl.getName()); } 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); diff --git a/platform/util/src/com/intellij/util/ArrayUtil.java b/platform/util/src/com/intellij/util/ArrayUtil.java index 5de68c11799b..d0419de9e820 100644 --- a/platform/util/src/com/intellij/util/ArrayUtil.java +++ b/platform/util/src/com/intellij/util/ArrayUtil.java @@ -190,7 +190,7 @@ public class ArrayUtil extends ArrayUtilRt { } @NotNull - public static int[] toIntArray(@NotNull List<Integer> list) { + public static int[] toIntArray(@NotNull Collection<Integer> list) { int[] ret = newIntArray(list.size()); int i = 0; for (Integer e : list) { diff --git a/platform/util/src/com/intellij/util/EnvironmentUtil.java b/platform/util/src/com/intellij/util/EnvironmentUtil.java index 1d7016460f1e..19961bfc0b89 100644 --- a/platform/util/src/com/intellij/util/EnvironmentUtil.java +++ b/platform/util/src/com/intellij/util/EnvironmentUtil.java @@ -255,6 +255,24 @@ public class EnvironmentUtil { return getEnvironmentMap(); } + public static void inlineParentOccurrences(@NotNull Map<String, String> envs) { + Map<String, String> parentParams = new HashMap<String, String>(System.getenv()); + for (Map.Entry<String, String> entry : envs.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (value != null) { + String parentVal = parentParams.get(key); + if (parentVal != null && containsEnvKeySubstitution(key, value)) { + envs.put(key, value.replace("$" + key + "$", parentVal)); + } + } + } + } + + private static boolean containsEnvKeySubstitution(final String envKey, final String val) { + return ArrayUtil.find(val.split(File.pathSeparator), "$" + envKey + "$") != -1; + } + @TestOnly static Map<String, String> testLoader() { try { diff --git a/platform/util/src/com/intellij/util/concurrency/BoundedTaskExecutor.java b/platform/util/src/com/intellij/util/concurrency/BoundedTaskExecutor.java index 2ef9cfbedc61..cdc892071e01 100644 --- a/platform/util/src/com/intellij/util/concurrency/BoundedTaskExecutor.java +++ b/platform/util/src/com/intellij/util/concurrency/BoundedTaskExecutor.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. @@ -46,8 +46,9 @@ public class BoundedTaskExecutor implements Executor { } }; - public BoundedTaskExecutor(Executor backendExecutor, int maxSimultaneousTasks) { + public BoundedTaskExecutor(@NotNull Executor backendExecutor, int maxSimultaneousTasks) { myBackendExecutor = backendExecutor; + assert maxSimultaneousTasks >= 1 : maxSimultaneousTasks; myMaxTasks = Math.max(maxSimultaneousTasks, 1); } @@ -56,7 +57,8 @@ public class BoundedTaskExecutor implements Executor { submit(task); } - public Future<?> submit(Runnable task) { + @NotNull + public Future<?> submit(@NotNull Runnable task) { final RunnableFuture<Void> future = queueTask(new FutureTask<Void>(task, null)); if (future == null) { throw new RuntimeException("Failed to queue task: " + task); @@ -64,7 +66,8 @@ public class BoundedTaskExecutor implements Executor { return future; } - public <T> Future<T> submit(Callable<T> task) { + @NotNull + public <T> Future<T> submit(@NotNull Callable<T> task) { final RunnableFuture<T> future = queueTask(new FutureTask<T>(task)); if (future == null) { throw new RuntimeException("Failed to queue task: " + task); @@ -73,7 +76,7 @@ public class BoundedTaskExecutor implements Executor { } @Nullable - private <T> RunnableFuture<T> queueTask(FutureTask<T> futureTask) { + private <T> RunnableFuture<T> queueTask(@NotNull FutureTask<T> futureTask) { if (myTaskQueue.offer(futureTask)) { processQueue(); return futureTask; diff --git a/platform/util/src/com/intellij/util/concurrency/SequentialTaskExecutor.java b/platform/util/src/com/intellij/util/concurrency/SequentialTaskExecutor.java index c05579c8f002..86fa72075e90 100644 --- a/platform/util/src/com/intellij/util/concurrency/SequentialTaskExecutor.java +++ b/platform/util/src/com/intellij/util/concurrency/SequentialTaskExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 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. @@ -16,11 +16,12 @@ package com.intellij.util.concurrency; +import org.jetbrains.annotations.NotNull; + import java.util.concurrent.Executor; public class SequentialTaskExecutor extends BoundedTaskExecutor { - - public SequentialTaskExecutor(Executor executor) { + public SequentialTaskExecutor(@NotNull Executor executor) { super(executor, 1); } } diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentInstanceMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentInstanceMap.java index e99db9d1d2c3..4c85f15a8c7c 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentInstanceMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentInstanceMap.java @@ -29,10 +29,10 @@ public class ConcurrentInstanceMap<T> extends ConcurrentFactoryMap<Class<? exten return key.newInstance(); } catch (InstantiationException e) { - throw new RuntimeException(e); + throw new RuntimeException("Couldn't instantiate " + key, e); } catch (IllegalAccessException e) { - throw new RuntimeException(e); + throw new RuntimeException("Couldn't instantiate " + key, e); } } }
\ No newline at end of file diff --git a/platform/util/src/com/intellij/util/containers/ContainerUtil.java b/platform/util/src/com/intellij/util/containers/ContainerUtil.java index dca7a0e6b30d..40bd75a2eff8 100644 --- a/platform/util/src/com/intellij/util/containers/ContainerUtil.java +++ b/platform/util/src/com/intellij/util/containers/ContainerUtil.java @@ -1073,7 +1073,8 @@ public class ContainerUtil extends ContainerUtilRt { } public static <T, U extends T> U findInstance(@NotNull Iterator<T> iterator, @NotNull Class<U> aClass) { - @SuppressWarnings("unchecked") U u = (U)find(iterator, new FilteringIterator.InstanceOf<U>(aClass)); + //noinspection unchecked + U u = (U)find(iterator, FilteringIterator.instanceOf(aClass)); return u; } @@ -1429,6 +1430,16 @@ public class ContainerUtil extends ContainerUtilRt { return sorted; } + @NotNull + public static <T extends Comparable<T>> List<T> sorted(@NotNull Collection<T> list) { + return sorted(list, new Comparator<T>() { + @Override + public int compare(T o1, T o2) { + return o1.compareTo(o2); + } + }); + } + public static <T> void sort(@NotNull T[] a, @NotNull Comparator<T> comparator) { int size = a.length; @@ -1927,6 +1938,15 @@ public class ContainerUtil extends ContainerUtilRt { return -1; } + public static <T> int indexOf(@NotNull List<T> list, @NotNull final T object) { + return indexOf(list, new Condition<T>() { + @Override + public boolean value(T t) { + return t.equals(object); + } + }); + } + @NotNull public static <A,B> Map<B,A> reverseMap(@NotNull Map<A,B> map) { final Map<B,A> result = newHashMap(); diff --git a/platform/util/src/com/intellij/util/containers/FilteringIterator.java b/platform/util/src/com/intellij/util/containers/FilteringIterator.java index c6b7173b4db2..3e146441d6ab 100644 --- a/platform/util/src/com/intellij/util/containers/FilteringIterator.java +++ b/platform/util/src/com/intellij/util/containers/FilteringIterator.java @@ -17,7 +17,6 @@ package com.intellij.util.containers; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Conditions; -import com.intellij.util.ReflectionUtil; import org.jetbrains.annotations.NotNull; import java.util.Iterator; @@ -30,7 +29,7 @@ import java.util.NoSuchElementException; */ public class FilteringIterator<Dom, E extends Dom> implements Iterator<E> { private final Iterator<Dom> myBaseIterator; - private final Condition<Dom> myFilter; + private final Condition<? super Dom> myFilter; private boolean myNextObtained = false; private boolean myCurrentIsValid = false; private Dom myCurrent; @@ -42,7 +41,7 @@ public class FilteringIterator<Dom, E extends Dom> implements Iterator<E> { } }; - public FilteringIterator(@NotNull Iterator<Dom> baseIterator, @NotNull Condition<Dom> filter) { + public FilteringIterator(@NotNull Iterator<Dom> baseIterator, @NotNull Condition<? super Dom> filter) { myBaseIterator = baseIterator; myFilter = filter; } @@ -103,7 +102,7 @@ public class FilteringIterator<Dom, E extends Dom> implements Iterator<E> { return create(iterator, NOT_NULL); } - public static <Dom, T extends Dom> Iterator<T> create(Iterator<Dom> iterator, Condition<Dom> condition) { + public static <Dom, T extends Dom> Iterator<T> create(Iterator<Dom> iterator, Condition<? super Dom> condition) { return new FilteringIterator<Dom, T>(iterator, condition); } @@ -119,7 +118,7 @@ public class FilteringIterator<Dom, E extends Dom> implements Iterator<E> { return create((Iterator<T>)iterator, instanceOf(aClass)); } - public static class InstanceOf<T> implements Condition { + public static class InstanceOf<T> implements Condition<Object> { private final Class<T> myInstancesClass; public InstanceOf(Class<T> instancesClass) { @@ -130,13 +129,5 @@ public class FilteringIterator<Dom, E extends Dom> implements Iterator<E> { public boolean value(Object object) { return myInstancesClass.isInstance(object); } - - public boolean isClassAcceptable(Class hintClass) { - return ReflectionUtil.isAssignable(myInstancesClass, hintClass); - } - - public T cast(Object object) { - return (T)object; - } } } diff --git a/platform/util/src/com/intellij/util/containers/InternalIterator.java b/platform/util/src/com/intellij/util/containers/InternalIterator.java index 9b7d1da8f156..49c84ece6a48 100644 --- a/platform/util/src/com/intellij/util/containers/InternalIterator.java +++ b/platform/util/src/com/intellij/util/containers/InternalIterator.java @@ -70,10 +70,10 @@ public interface InternalIterator<T>{ } class Filtering<T> implements InternalIterator<T> { - private final Condition<T> myFilter; + private final Condition<? super T> myFilter; private final InternalIterator<T> myIterator; - public Filtering(InternalIterator<T> iterator, Condition<T> filter) { + public Filtering(InternalIterator<T> iterator, Condition<? super T> filter) { myIterator = iterator; myFilter = filter; } diff --git a/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java b/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java index 663cd215cfbe..0f14dcb8511b 100644 --- a/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java +++ b/platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java @@ -20,7 +20,6 @@ package com.intellij.util.io.storage; import com.intellij.openapi.Disposable; -import com.intellij.openapi.util.Disposer; import com.intellij.util.EventDispatcher; import org.jetbrains.annotations.NotNull; @@ -56,10 +55,8 @@ public class HeavyProcessLatch { public void processFinished(); } - @NotNull - public Disposable addListener(@NotNull HeavyProcessListener listener) { - Disposable disposable = Disposer.newDisposable(); - myEventDispatcher.addListener(listener, disposable); - return disposable; + public void addListener(@NotNull Disposable parentDisposable, + @NotNull HeavyProcessListener listener) { + myEventDispatcher.addListener(listener, parentDisposable); } }
\ No newline at end of file diff --git a/platform/util/src/com/intellij/util/xmlb/MapBinding.java b/platform/util/src/com/intellij/util/xmlb/MapBinding.java index dbc3c0e082c3..354af5f93d7b 100644 --- a/platform/util/src/com/intellij/util/xmlb/MapBinding.java +++ b/platform/util/src/com/intellij/util/xmlb/MapBinding.java @@ -15,6 +15,7 @@ */ package com.intellij.util.xmlb; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.JDOMUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.xmlb.annotations.MapAnnotation; @@ -34,6 +35,8 @@ import java.util.Set; import static com.intellij.util.xmlb.Constants.*; class MapBinding implements Binding { + private static final Logger LOG = Logger.getInstance(MapBinding.class); + private static final Comparator<Object> KEY_COMPARATOR = new Comparator<Object>() { @SuppressWarnings("unchecked") @Override @@ -161,7 +164,10 @@ class MapBinding implements Binding { Object k = null; Object v = null; - assert entry.getName().equals(getEntryAttributeName()); + if (!entry.getName().equals(getEntryAttributeName())) { + LOG.warn("unexpected entry for serialized Map will be skipped: " + entry); + continue; + } Attribute keyAttr = entry.getAttribute(getKeyAttributeName()); if (keyAttr != null) { diff --git a/platform/util/src/com/intellij/util/xmlb/XmlSerializer.java b/platform/util/src/com/intellij/util/xmlb/XmlSerializer.java index 86b7d111430f..73f216bc3749 100644 --- a/platform/util/src/com/intellij/util/xmlb/XmlSerializer.java +++ b/platform/util/src/com/intellij/util/xmlb/XmlSerializer.java @@ -45,6 +45,7 @@ public class XmlSerializer { return serialize(object, TRUE_FILTER); } + @NotNull public static Element serialize(@NotNull Object object, @Nullable SerializationFilter filter) throws XmlSerializationException { return new XmlSerializerImpl(filter == null ? TRUE_FILTER : filter).serialize(object); } |