summaryrefslogtreecommitdiff
path: root/platform/util/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'platform/util/src/com')
-rw-r--r--platform/util/src/com/intellij/diagnostic/ThreadDumper.java27
-rw-r--r--platform/util/src/com/intellij/icons/AllIcons.java3
-rw-r--r--platform/util/src/com/intellij/openapi/application/PathManager.java2
-rw-r--r--platform/util/src/com/intellij/openapi/diagnostic/Logger.java1
-rw-r--r--platform/util/src/com/intellij/openapi/util/JDOMUtil.java42
-rw-r--r--platform/util/src/com/intellij/openapi/util/LowMemoryWatcher.java20
-rw-r--r--platform/util/src/com/intellij/openapi/util/NotNullLazyValue.java1
-rw-r--r--platform/util/src/com/intellij/openapi/util/Ref.java2
-rw-r--r--platform/util/src/com/intellij/openapi/util/io/FileUtil.java3
-rw-r--r--platform/util/src/com/intellij/openapi/util/text/StringUtil.java14
-rw-r--r--platform/util/src/com/intellij/util/ArrayUtil.java2
-rw-r--r--platform/util/src/com/intellij/util/EnvironmentUtil.java18
-rw-r--r--platform/util/src/com/intellij/util/concurrency/BoundedTaskExecutor.java13
-rw-r--r--platform/util/src/com/intellij/util/concurrency/SequentialTaskExecutor.java7
-rw-r--r--platform/util/src/com/intellij/util/containers/ConcurrentInstanceMap.java4
-rw-r--r--platform/util/src/com/intellij/util/containers/ContainerUtil.java22
-rw-r--r--platform/util/src/com/intellij/util/containers/FilteringIterator.java17
-rw-r--r--platform/util/src/com/intellij/util/containers/InternalIterator.java4
-rw-r--r--platform/util/src/com/intellij/util/io/storage/HeavyProcessLatch.java9
-rw-r--r--platform/util/src/com/intellij/util/xmlb/MapBinding.java8
-rw-r--r--platform/util/src/com/intellij/util/xmlb/XmlSerializer.java1
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("<", "&lt;").replaceAll(">", "&gt;");
+ return result;
}
+ public static void appendLegalized(@NotNull StringBuilder sb, char each) {
+ if (each == '<' || each == '>') {
+ sb.append(each == '<' ? "&lt;" : "&gt;");
+ }
+ 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 = {"&lt;", "&gt;", "&amp;", "&#39;", "&quot;"};
@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);
}