diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index 2cd375d23d2a..fc2547da6aa1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -82,7 +82,7 @@ import java.util.List; * @author anna * @since 26-Jun-2007 */ -public class ExternalAnnotationsManagerImpl extends BaseExternalAnnotationsManager { +public class ExternalAnnotationsManagerImpl extends ReadableExternalAnnotationsManager { private static final Logger LOG = Logger.getInstance("#" + ExternalAnnotationsManagerImpl.class.getName()); private final MessageBus myBus; diff --git a/java/java-indexing-impl/src/com/intellij/codeInsight/ReadableExternalAnnotationsManager.java b/java/java-indexing-impl/src/com/intellij/codeInsight/ReadableExternalAnnotationsManager.java new file mode 100644 index 000000000000..727f4a2e1e0c --- /dev/null +++ b/java/java-indexing-impl/src/com/intellij/codeInsight/ReadableExternalAnnotationsManager.java @@ -0,0 +1,81 @@ +/* + * Copyright 2000-2012 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.roots.*; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.psi.PsiManager; +import com.intellij.util.ThreeState; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class ReadableExternalAnnotationsManager extends BaseExternalAnnotationsManager { + @NotNull private volatile ThreeState myHasAnyAnnotationsRoots = ThreeState.UNSURE; + + public ReadableExternalAnnotationsManager(PsiManager psiManager) { + super(psiManager); + } + + @Override + protected boolean hasAnyAnnotationsRoots() { + if (myHasAnyAnnotationsRoots == ThreeState.UNSURE) { + final Module[] modules = ModuleManager.getInstance(myPsiManager.getProject()).getModules(); + for (Module module : modules) { + for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { + final String[] urls = AnnotationOrderRootType.getUrls(entry); + if (urls.length > 0) { + myHasAnyAnnotationsRoots = ThreeState.YES; + return true; + } + } + } + myHasAnyAnnotationsRoots = ThreeState.NO; + } + return myHasAnyAnnotationsRoots == ThreeState.YES; + } + + @NotNull + @Override + protected List getExternalAnnotationsRoots(@NotNull VirtualFile libraryFile) { + final List entries = ProjectRootManager.getInstance(myPsiManager.getProject()).getFileIndex().getOrderEntriesForFile( + libraryFile); + List result = new ArrayList(); + for (OrderEntry entry : entries) { + if (entry instanceof ModuleOrderEntry) { + continue; + } + final String[] externalUrls = AnnotationOrderRootType.getUrls(entry); + for (String url : externalUrls) { + VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(url); + if (root != null) { + result.add(root); + } + } + } + return result; + } + + @Override + protected void dropCache() { + myHasAnyAnnotationsRoots = ThreeState.UNSURE; + super.dropCache(); + } +} diff --git a/java/java-indexing-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java similarity index 87% rename from java/java-indexing-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java rename to java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java index 89638cdb67ae..b09ed08510af 100644 --- a/java/java-indexing-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java +++ b/java/java-psi-impl/src/com/intellij/codeInsight/BaseExternalAnnotationsManager.java @@ -16,21 +16,16 @@ package com.intellij.codeInsight; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.roots.*; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.StreamUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.*; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ConcurrencyUtil; import com.intellij.util.IncorrectOperationException; -import com.intellij.util.ThreeState; import com.intellij.util.containers.ConcurrentSoftHashMap; import com.intellij.util.containers.ConcurrentSoftValueHashMap; import com.intellij.util.containers.MultiMap; @@ -45,11 +40,11 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.ConcurrentMap; -public class BaseExternalAnnotationsManager extends ExternalAnnotationsManager { +public abstract class BaseExternalAnnotationsManager extends ExternalAnnotationsManager{ private static final Logger LOG = Logger.getInstance("#" + BaseExternalAnnotationsManager.class.getName()); @NotNull private static final List NULL = new ArrayList(); - @NotNull protected final ConcurrentMap> myExternalAnnotations = new ConcurrentSoftValueHashMap>(); - @NotNull private volatile ThreeState myHasAnyAnnotationsRoots = ThreeState.UNSURE; + @NotNull protected final ConcurrentMap> + myExternalAnnotations = new ConcurrentSoftValueHashMap>(); protected final PsiManager myPsiManager; public BaseExternalAnnotationsManager(final PsiManager psiManager) { @@ -95,22 +90,7 @@ public class BaseExternalAnnotationsManager extends ExternalAnnotationsManager { return StringUtil.trimEnd(buf.toString(), ", ") + externalName.substring(rightIdx); } - protected boolean hasAnyAnnotationsRoots() { - if (myHasAnyAnnotationsRoots == ThreeState.UNSURE) { - final Module[] modules = ModuleManager.getInstance(myPsiManager.getProject()).getModules(); - for (Module module : modules) { - for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { - final String[] urls = AnnotationOrderRootType.getUrls(entry); - if (urls.length > 0) { - myHasAnyAnnotationsRoots = ThreeState.YES; - return true; - } - } - } - myHasAnyAnnotationsRoots = ThreeState.NO; - } - return myHasAnyAnnotationsRoots == ThreeState.YES; - } + protected abstract boolean hasAnyAnnotationsRoots(); @Override @Nullable @@ -216,7 +196,7 @@ public class BaseExternalAnnotationsManager extends ExternalAnnotationsManager { if (onlyWritable && !file.isWritable()) continue; final MultiMap fileData = getDataFromFile(file); - + collectAnnotations(result, fileData.get(externalName), factory); collectAnnotations(result, fileData.get(oldExternalName), factory); } @@ -241,24 +221,7 @@ public class BaseExternalAnnotationsManager extends ExternalAnnotationsManager { } @NotNull - protected List getExternalAnnotationsRoots(@NotNull VirtualFile libraryFile) { - final List entries = ProjectRootManager.getInstance(myPsiManager.getProject()).getFileIndex().getOrderEntriesForFile( - libraryFile); - List result = new ArrayList(); - for (OrderEntry entry : entries) { - if (entry instanceof ModuleOrderEntry) { - continue; - } - final String[] externalUrls = AnnotationOrderRootType.getUrls(entry); - for (String url : externalUrls) { - VirtualFile root = VirtualFileManager.getInstance().findFileByUrl(url); - if (root != null) { - result.add(root); - } - } - } - return result; - } + protected abstract List getExternalAnnotationsRoots(@NotNull VirtualFile libraryFile); @Override @Nullable @@ -321,7 +284,6 @@ public class BaseExternalAnnotationsManager extends ExternalAnnotationsManager { protected void dropCache() { myExternalAnnotations.clear(); annotationsFileToDataAndModificationStamp.clear(); - myHasAnyAnnotationsRoots = ThreeState.UNSURE; cache.clear(); }