diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index bac7e47a1e48..b86759580bca 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -78,18 +78,19 @@ import java.awt.event.ActionEvent; import java.io.IOException; import java.util.*; import java.util.List; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { - public static final Icon ICON = IconLoader.getIcon("/modules/annotation.png"); + @NotNull public static final Icon ICON = IconLoader.getIcon("/modules/annotation.png"); private static final Logger LOG = Logger.getInstance("#" + ExternalAnnotationsManagerImpl.class.getName()); - private final Map> myExternalAnnotations = new ConcurrentWeakValueHashMap>(); - private final AtomicReference myHasAnyAnnotationsRoots = new AtomicReference(ThreeState.UNSURE); - private static final List NULL = new ArrayList(); + @NotNull private final ConcurrentMap> myExternalAnnotations = new ConcurrentWeakValueHashMap>(); + @NotNull private final AtomicReference myHasAnyAnnotationsRoots = new AtomicReference(ThreeState.UNSURE); + @NotNull private static final List NULL = new ArrayList(); private final PsiManager myPsiManager; - public ExternalAnnotationsManagerImpl(final Project project, final PsiManager psiManager) { + public ExternalAnnotationsManagerImpl(@NotNull final Project project, final PsiManager psiManager) { myPsiManager = psiManager; final MessageBusConnection connection = project.getMessageBus().connect(project); connection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() { @@ -132,7 +133,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @NotNull - private Map collectExternalAnnotations(final PsiModifierListOwner listOwner) { + private Map collectExternalAnnotations(@NotNull final PsiModifierListOwner listOwner) { if (hasAnyAnnotationsRoots() == ThreeState.NO) return Collections.emptyMap(); final Map result = new HashMap(); final List files = findExternalAnnotationsFile(listOwner); @@ -179,6 +180,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return result; } + @Nullable private static String getExternalName(PsiModifierListOwner listOwner, boolean showParamName) { return PsiFormatUtil.getExternalName(listOwner, showParamName, Integer.MAX_VALUE); } @@ -222,9 +224,14 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } } - private void setupRootAndAnnotateExternally(final OrderEntry entry, final Project project, final PsiModifierListOwner listOwner, - final String annotationFQName, - final PsiFile fromFile, final String packageName, final VirtualFile virtualFile, final PsiNameValuePair[] value) { + private void setupRootAndAnnotateExternally(@NotNull final OrderEntry entry, + @NotNull Project project, + @NotNull final PsiModifierListOwner listOwner, + @NotNull final String annotationFQName, + @NotNull final PsiFile fromFile, + @NotNull final String packageName, + @NotNull final VirtualFile virtualFile, + final PsiNameValuePair[] value) { final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); descriptor.setTitle(ProjectBundle.message("external.annotations.root.chooser.title", entry.getPresentableName())); descriptor.setDescription(ProjectBundle.message("external.annotations.root.chooser.description")); @@ -245,7 +252,10 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { if (annotationsXml != null) { final List createdFiles = new ArrayList(); createdFiles.add(annotationsXml); - myExternalAnnotations.put(getFQN(packageName, virtualFile), createdFiles); + String fqn = getFQN(packageName, virtualFile); + if (fqn != null) { + myExternalAnnotations.put(fqn, createdFiles); + } } annotateExternally(listOwner, annotationFQName, annotationsXml, fromFile, value); } @@ -253,20 +263,25 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { }.execute(); } - private void chooseRootAndAnnotateExternally(final PsiModifierListOwner listOwner, final String annotationFQName, @NotNull final PsiFile fromFile, - final Project project, final String packageName, final VirtualFile virtualFile, - final VirtualFile[] virtualFiles, final PsiNameValuePair[] value) { + private void chooseRootAndAnnotateExternally(@NotNull final PsiModifierListOwner listOwner, + @NotNull final String annotationFQName, + @NotNull final PsiFile fromFile, + @NotNull final Project project, + @NotNull final String packageName, + final VirtualFile virtualFile, + @NotNull VirtualFile[] virtualFiles, + final PsiNameValuePair[] value) { if (virtualFiles.length > 1) { JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep("Annotation Roots", virtualFiles) { @Override - public PopupStep onChosen(final VirtualFile file, final boolean finalChoice) { + public PopupStep onChosen(@NotNull final VirtualFile file, final boolean finalChoice) { annotateExternally(file, listOwner, project, packageName, virtualFile, annotationFQName, fromFile, value); return FINAL_CHOICE; } @NotNull @Override - public String getTextFor(final VirtualFile value) { + public String getTextFor(@NotNull final VirtualFile value) { return value.getPresentableUrl(); } @@ -292,8 +307,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return VfsUtil.toVirtualFileArray(result); } - private void annotateExternally(final VirtualFile file, final PsiModifierListOwner listOwner, final Project project, - final String packageName, + private void annotateExternally(@NotNull final VirtualFile file, @NotNull final PsiModifierListOwner listOwner, final Project project, + @NotNull final String packageName, final VirtualFile virtualFile, final String annotationFQName, @NotNull final PsiFile fromFile, @@ -371,6 +386,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return false; } + @NotNull public AnnotationPlace chooseAnnotationsPlace(@NotNull final PsiElement element) { if (!element.isPhysical()) return AnnotationPlace.IN_CODE; //element just created if (!element.getManager().isInProject(element)) return AnnotationPlace.EXTERNAL; @@ -432,7 +448,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return AnnotationPlace.IN_CODE; } - private void appendChosenAnnotationsRoot(final OrderEntry entry, final VirtualFile vFile) { + private void appendChosenAnnotationsRoot(@NotNull final OrderEntry entry, @NotNull final VirtualFile vFile) { if (entry instanceof LibraryOrderEntry) { Library library = ((LibraryOrderEntry)entry).getLibrary(); LOG.assertTrue(library != null); @@ -459,7 +475,8 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { private static void annotateExternally(final PsiModifierListOwner listOwner, final String annotationFQName, @Nullable final XmlFile xmlFile, - @NotNull PsiFile codeUsageFile, PsiNameValuePair[] values) { + @NotNull PsiFile codeUsageFile, + PsiNameValuePair[] values) { if (xmlFile == null) return; try { final XmlDocument document = xmlFile.getDocument(); @@ -498,13 +515,14 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @NonNls - private static String createAnnotationTag(String annotationFQName, PsiNameValuePair[] values) { + private static String createAnnotationTag(String annotationFQName, @Nullable PsiNameValuePair[] values) { @NonNls String text; if (values != null) { text = " \n"; text += StringUtil.join(values, new Function() { + @NotNull @Override - public String fun(PsiNameValuePair pair) { + public String fun(@NotNull PsiNameValuePair pair) { if (pair.getName() != null) { return ""; } @@ -520,7 +538,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @Nullable - private XmlFile createAnnotationsXml(VirtualFile root, @NonNls @NotNull String packageName) { + private XmlFile createAnnotationsXml(@NotNull VirtualFile root, @NonNls @NotNull String packageName) { final String[] dirs = packageName.split("[\\.]"); for (String dir : dirs) { if (dir.isEmpty()) break; @@ -564,6 +582,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { final String packageName = javaFile.getPackageName(); final VirtualFile virtualFile = containingFile.getVirtualFile(); String fqn = getFQN(packageName, virtualFile); + if (fqn == null) return null; final List files = myExternalAnnotations.get(fqn); if (files == NULL) return null; if (files != null) { @@ -611,7 +630,7 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { } @Nullable - private static String getNormalizedExternalName(PsiModifierListOwner owner) { + private static String getNormalizedExternalName(@NotNull PsiModifierListOwner owner) { String externalName = getExternalName(owner, true); if (externalName != null) { if (owner instanceof PsiParameter && owner.getParent() instanceof PsiParameterList) { @@ -657,10 +676,12 @@ public class ExternalAnnotationsManagerImpl extends ExternalAnnotationsManager { return ADD_IN_CODE; } + @NotNull protected String getCancelActionName() { return CommonBundle.getCancelButtonText(); } + @NotNull @SuppressWarnings({"NonStaticInitializer"}) protected Action[] createActions() { final Action okAction = getOKAction();