summaryrefslogtreecommitdiff
path: root/platform/projectModel-impl/src
diff options
context:
space:
mode:
Diffstat (limited to 'platform/projectModel-impl/src')
-rw-r--r--platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java7
-rw-r--r--platform/projectModel-impl/src/com/intellij/openapi/projectRoots/impl/ProjectRootContainerImpl.java21
-rw-r--r--platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java120
-rw-r--r--platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java14
-rw-r--r--platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java15
-rw-r--r--platform/projectModel-impl/src/messages/ProjectBundle.properties2
6 files changed, 91 insertions, 88 deletions
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java
index 890d77578a81..608a350d770c 100644
--- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java
+++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/DefaultStateSerializer.java
@@ -27,11 +27,11 @@ import com.intellij.util.xmlb.Accessor;
import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.annotation.Annotation;
-
@SuppressWarnings({"deprecation"})
class DefaultStateSerializer {
@@ -40,7 +40,7 @@ class DefaultStateSerializer {
private DefaultStateSerializer() {
}
- static Element serializeState(Object state, final Storage storage) throws WriteExternalException {
+ static Element serializeState(@NotNull Object state, final Storage storage) throws WriteExternalException {
if (state instanceof Element) {
return (Element)state;
}
@@ -53,7 +53,8 @@ class DefaultStateSerializer {
}
catch (WriteExternalException e) {
throw e;
- }catch (Throwable e) {
+ }
+ catch (Throwable e) {
LOG.info("Unable to serialize component state!", e);
return new Element("empty");
}
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/projectRoots/impl/ProjectRootContainerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/projectRoots/impl/ProjectRootContainerImpl.java
index 22800f9a4e1a..1036456dfc6b 100644
--- a/platform/projectModel-impl/src/com/intellij/openapi/projectRoots/impl/ProjectRootContainerImpl.java
+++ b/platform/projectModel-impl/src/com/intellij/openapi/projectRoots/impl/ProjectRootContainerImpl.java
@@ -23,10 +23,7 @@ import com.intellij.openapi.projectRoots.ex.ProjectRoot;
import com.intellij.openapi.projectRoots.ex.ProjectRootContainer;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.roots.PersistentOrderRootType;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.InvalidDataException;
-import com.intellij.openapi.util.JDOMExternalizable;
-import com.intellij.openapi.util.WriteExternalException;
+import com.intellij.openapi.util.*;
import com.intellij.openapi.vfs.*;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
@@ -223,7 +220,8 @@ public class ProjectRootContainerImpl implements JDOMExternalizable, ProjectRoot
}
private void read(Element element, PersistentOrderRootType type) throws InvalidDataException {
- Element child = element.getChild(type.getSdkRootName());
+ String sdkRootName = type.getSdkRootName();
+ Element child = sdkRootName != null ? element.getChild(sdkRootName) : null;
if (child == null) {
myRoots.put(type, new CompositeProjectRoot());
return;
@@ -236,11 +234,14 @@ public class ProjectRootContainerImpl implements JDOMExternalizable, ProjectRoot
}
private void write(Element roots, PersistentOrderRootType type) throws WriteExternalException {
- Element e = new Element(type.getSdkRootName());
- roots.addContent(e);
- final Element root = ProjectRootUtil.write(myRoots.get(type));
- if (root != null) {
- e.addContent(root);
+ String sdkRootName = type.getSdkRootName();
+ if (sdkRootName != null) {
+ Element e = new Element(sdkRootName);
+ roots.addContent(e);
+ final Element root = ProjectRootUtil.write(myRoots.get(type));
+ if (root != null) {
+ e.addContent(root);
+ }
}
}
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java
index 8e80670b1f76..c439a35d0a36 100644
--- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java
+++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java
@@ -134,6 +134,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
public ProjectRootManagerImpl(Project project) {
myProject = project;
myRootsCache = new OrderRootsCache(project);
+ myJdkTableMultiListener = new JdkTableMultiListener(project);
}
@Override
@@ -281,7 +282,6 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
@Override
public void disposeComponent() {
- myJdkTableMultiListener = null;
}
@Override
@@ -478,45 +478,52 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
void addListenerForTable(LibraryTable.Listener libraryListener,
final LibraryTable libraryTable) {
- LibraryTableMultilistener multilistener = myLibraryTableMultilisteners.get(libraryTable);
- if (multilistener == null) {
- multilistener = new LibraryTableMultilistener(libraryTable);
+ synchronized (myLibraryTableListenersLock) {
+ LibraryTableMultiListener multiListener = myLibraryTableMultiListeners.get(libraryTable);
+ if (multiListener == null) {
+ multiListener = new LibraryTableMultiListener(libraryTable);
+ libraryTable.addListener(multiListener);
+ myLibraryTableMultiListeners.put(libraryTable, multiListener);
+ }
+ multiListener.addListener(libraryListener);
}
- multilistener.addListener(libraryListener);
}
void removeListenerForTable(LibraryTable.Listener libraryListener,
final LibraryTable libraryTable) {
- LibraryTableMultilistener multilistener = myLibraryTableMultilisteners.get(libraryTable);
- if (multilistener == null) {
- multilistener = new LibraryTableMultilistener(libraryTable);
+ synchronized (myLibraryTableListenersLock) {
+ LibraryTableMultiListener multiListener = myLibraryTableMultiListeners.get(libraryTable);
+ if (multiListener != null) {
+ boolean last = multiListener.removeListener(libraryListener);
+ if (last) {
+ libraryTable.removeListener(multiListener);
+ myLibraryTableMultiListeners.remove(libraryTable);
+ }
+ }
}
- multilistener.removeListener(libraryListener);
}
- private final Map<LibraryTable, LibraryTableMultilistener> myLibraryTableMultilisteners
- = new HashMap<LibraryTable, LibraryTableMultilistener>();
+ private final Object myLibraryTableListenersLock = new Object();
+ private final Map<LibraryTable, LibraryTableMultiListener> myLibraryTableMultiListeners = new HashMap<LibraryTable, LibraryTableMultiListener>();
- private class LibraryTableMultilistener implements LibraryTable.Listener {
- final List<LibraryTable.Listener> myListeners = ContainerUtil.createLockFreeCopyOnWriteList();
+ private class LibraryTableMultiListener implements LibraryTable.Listener {
+ private final Set<LibraryTable.Listener> myListeners = new LinkedHashSet<LibraryTable.Listener>();
private final LibraryTable myLibraryTable;
+ private LibraryTable.Listener[] myListenersArray;
- private LibraryTableMultilistener(LibraryTable libraryTable) {
+ private LibraryTableMultiListener(LibraryTable libraryTable) {
myLibraryTable = libraryTable;
- myLibraryTable.addListener(this);
- myLibraryTableMultilisteners.put(myLibraryTable, this);
}
- private void addListener(LibraryTable.Listener listener) {
+ private synchronized void addListener(LibraryTable.Listener listener) {
myListeners.add(listener);
+ myListenersArray = null;
}
- private void removeListener(LibraryTable.Listener listener) {
+ private synchronized boolean removeListener(LibraryTable.Listener listener) {
myListeners.remove(listener);
- if (myListeners.isEmpty()) {
- myLibraryTable.removeListener(this);
- myLibraryTableMultilisteners.remove(myLibraryTable);
- }
+ myListenersArray = null;
+ return myListeners.isEmpty();
}
@Override
@@ -525,20 +532,27 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
mergeRootsChangesDuring(new Runnable() {
@Override
public void run() {
- for (LibraryTable.Listener listener : myListeners) {
+ for (LibraryTable.Listener listener : getListeners()) {
listener.afterLibraryAdded(newLibrary);
}
}
});
}
+ private synchronized LibraryTable.Listener[] getListeners() {
+ if (myListenersArray == null) {
+ myListenersArray = myListeners.toArray(new LibraryTable.Listener[myListeners.size()]);
+ }
+ return myListenersArray;
+ }
+
@Override
public void afterLibraryRenamed(final Library library) {
incModificationCount();
mergeRootsChangesDuring(new Runnable() {
@Override
public void run() {
- for (LibraryTable.Listener listener : myListeners) {
+ for (LibraryTable.Listener listener : getListeners()) {
listener.afterLibraryRenamed(library);
}
}
@@ -551,7 +565,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
mergeRootsChangesDuring(new Runnable() {
@Override
public void run() {
- for (LibraryTable.Listener listener : myListeners) {
+ for (LibraryTable.Listener listener : getListeners()) {
listener.beforeLibraryRemoved(library);
}
}
@@ -564,7 +578,7 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
mergeRootsChangesDuring(new Runnable() {
@Override
public void run() {
- for (LibraryTable.Listener listener : myListeners) {
+ for (LibraryTable.Listener listener : getListeners()) {
listener.afterLibraryRemoved(library);
}
}
@@ -572,24 +586,33 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
}
}
- private JdkTableMultiListener myJdkTableMultiListener = null;
+ private final JdkTableMultiListener myJdkTableMultiListener;
private class JdkTableMultiListener implements ProjectJdkTable.Listener {
- final EventDispatcher<ProjectJdkTable.Listener> myDispatcher = EventDispatcher.create(ProjectJdkTable.Listener.class);
+ private final Set<ProjectJdkTable.Listener> myListeners = new LinkedHashSet<ProjectJdkTable.Listener>();
private MessageBusConnection listenerConnection;
+ private ProjectJdkTable.Listener[] myListenersArray;
private JdkTableMultiListener(Project project) {
listenerConnection = project.getMessageBus().connect();
listenerConnection.subscribe(ProjectJdkTable.JDK_TABLE_TOPIC, this);
}
- private void addListener(ProjectJdkTable.Listener listener) {
- myDispatcher.addListener(listener);
+ private synchronized void addListener(ProjectJdkTable.Listener listener) {
+ myListeners.add(listener);
+ myListenersArray = null;
+ }
+
+ private synchronized void removeListener(ProjectJdkTable.Listener listener) {
+ myListeners.remove(listener);
+ myListenersArray = null;
}
- private void removeListener(ProjectJdkTable.Listener listener) {
- myDispatcher.removeListener(listener);
- uninstallListener(true);
+ private synchronized ProjectJdkTable.Listener[] getListeners() {
+ if (myListenersArray == null) {
+ myListenersArray = myListeners.toArray(new ProjectJdkTable.Listener[myListeners.size()]);
+ }
+ return myListenersArray;
}
@Override
@@ -597,7 +620,9 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
mergeRootsChangesDuring(new Runnable() {
@Override
public void run() {
- myDispatcher.getMulticaster().jdkAdded(jdk);
+ for (ProjectJdkTable.Listener listener : getListeners()) {
+ listener.jdkAdded(jdk);
+ }
}
});
}
@@ -607,7 +632,9 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
mergeRootsChangesDuring(new Runnable() {
@Override
public void run() {
- myDispatcher.getMulticaster().jdkRemoved(jdk);
+ for (ProjectJdkTable.Listener listener : getListeners()) {
+ listener.jdkRemoved(jdk);
+ }
}
});
}
@@ -617,7 +644,9 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
mergeRootsChangesDuring(new Runnable() {
@Override
public void run() {
- myDispatcher.getMulticaster().jdkNameChanged(jdk, previousName);
+ for (ProjectJdkTable.Listener listener : getListeners()) {
+ listener.jdkNameChanged(jdk, previousName);
+ }
}
});
String currentName = getProjectSdkName();
@@ -627,32 +656,15 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Proj
myProjectSdkType = jdk.getSdkType().getName();
}
}
-
- public void uninstallListener(boolean soft) {
- if (!soft || !myDispatcher.hasListeners()) {
- if (listenerConnection != null) {
- listenerConnection.disconnect();
- listenerConnection = null;
- }
- }
- }
}
private final Map<RootProvider, Set<OrderEntry>> myRegisteredRootProviders = new HashMap<RootProvider, Set<OrderEntry>>();
void addJdkTableListener(ProjectJdkTable.Listener jdkTableListener) {
- getJdkTableMultiListener().addListener(jdkTableListener);
- }
-
- private JdkTableMultiListener getJdkTableMultiListener() {
- if (myJdkTableMultiListener == null) {
- myJdkTableMultiListener = new JdkTableMultiListener(myProject);
- }
- return myJdkTableMultiListener;
+ myJdkTableMultiListener.addListener(jdkTableListener);
}
void removeJdkTableListener(ProjectJdkTable.Listener jdkTableListener) {
- if (myJdkTableMultiListener == null) return;
myJdkTableMultiListener.removeListener(jdkTableListener);
}
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java
index bc85dabc9aec..bd9531a2d888 100644
--- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java
+++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootIndex.java
@@ -71,14 +71,6 @@ public class RootIndex {
private final TObjectIntHashMap<JpsModuleSourceRootType<?>> myRootTypeId = new TObjectIntHashMap<JpsModuleSourceRootType<?>>();
@NotNull private final Project myProject;
private volatile Map<VirtualFile, OrderEntry[]> myOrderEntries;
- @SuppressWarnings("UnusedDeclaration")
- private final LowMemoryWatcher myLowMemoryWatcher = LowMemoryWatcher.register(new Runnable() {
- @Override
- public void run() {
- myNonExistentPackages.clear();
- }
- });
-
// made public for Upsource
public RootIndex(@NotNull Project project, @NotNull InfoCache cache) {
@@ -98,6 +90,12 @@ public class RootIndex {
myProjectExcludedRoots.add(root);
}
}
+ LowMemoryWatcher.register(new Runnable() {
+ @Override
+ public void run() {
+ myNonExistentPackages.clear();
+ }
+ }, project);
}
@NotNull
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java
index fa901849867f..7b5de892d4da 100644
--- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java
+++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/libraries/LibraryImpl.java
@@ -22,7 +22,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.OrderRootType;
-import com.intellij.openapi.roots.PersistentOrderRootType;
import com.intellij.openapi.roots.RootProvider;
import com.intellij.openapi.roots.impl.RootModelImpl;
import com.intellij.openapi.roots.impl.RootProviderBaseImpl;
@@ -320,23 +319,13 @@ public class LibraryImpl extends TraceableDisposable implements LibraryEx.Modifi
List<OrderRootType> allTypes = new ArrayList<OrderRootType>(rootTypes);
Collections.sort(allTypes, new Comparator<OrderRootType>() {
@Override
- public int compare(final OrderRootType o1, final OrderRootType o2) {
- return getSortKey(o1).compareTo(getSortKey(o2));
+ public int compare(@NotNull final OrderRootType o1, @NotNull final OrderRootType o2) {
+ return o1.name().compareToIgnoreCase(o2.name());
}
});
return allTypes;
}
- private static String getSortKey(OrderRootType orderRootType) {
- if (orderRootType instanceof PersistentOrderRootType) {
- return ((PersistentOrderRootType)orderRootType).getSdkRootName();
- }
- if (orderRootType instanceof OrderRootType.DocumentationRootType) {
- return ((OrderRootType.DocumentationRootType)orderRootType).getSdkRootName();
- }
- return "";
- }
-
@Override
public void writeExternal(Element rootElement) throws WriteExternalException {
checkDisposed();
diff --git a/platform/projectModel-impl/src/messages/ProjectBundle.properties b/platform/projectModel-impl/src/messages/ProjectBundle.properties
index 2d74782822db..a0fe65ad981a 100644
--- a/platform/projectModel-impl/src/messages/ProjectBundle.properties
+++ b/platform/projectModel-impl/src/messages/ProjectBundle.properties
@@ -128,6 +128,7 @@ button.text.attach.files=Attach &Files or Directories...
library.attach.files.action=Attach Files or Directories
library.attach.files.to.library.action=Attach Files or Directories to Library ''{0}''
library.attach.files.description=Select files or directories in which library classes, sources and documentation are located
+library.java.attach.files.description=Select files or directories in which library classes, sources, documentation or native libraries are located
library.sources.not.found=Sources not found
library.sources.not.attached=Sources not attached
@@ -318,6 +319,7 @@ external.annotations.root.chooser.description=External annotations would be save
external.annotation.prompt=External annotation prompt
external.annotations.suggestion.message=<html><body>If you do not want annotations in your code you may use external storage.<br> \
To configure external annotations please specify root directory where files with annotations would be placed</body></html>
+project.roots.native.library.node.text=Native Library Locations
sdk.configure.annotations.tab=Annotations
project.roots.path.tab.title=Paths
project.roots.external.annotations.tab.title=External Annotations