diff options
Diffstat (limited to 'platform/projectModel-impl/src')
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 |