From 80e8a556c4be56d4a8bc2b0e3f1d267b4dc6f090 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 30 May 2013 09:45:20 +0200 Subject: [PATCH] WebBrowserUrlProvider getUrl nullable --- .../ide/browsers/OpenFileInBrowserAction.java | 9 ++++-- .../browsers/impl/WebBrowserServiceImpl.java | 17 +++++++---- .../ide/browsers/WebBrowserUrlProvider.java | 29 +++++++++++++++---- 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/xml/impl/src/com/intellij/ide/browsers/OpenFileInBrowserAction.java b/xml/impl/src/com/intellij/ide/browsers/OpenFileInBrowserAction.java index 634907f48726..130fd1fc17f9 100644 --- a/xml/impl/src/com/intellij/ide/browsers/OpenFileInBrowserAction.java +++ b/xml/impl/src/com/intellij/ide/browsers/OpenFileInBrowserAction.java @@ -23,6 +23,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiFile; import com.intellij.xml.XmlBundle; import com.intellij.xml.util.HtmlUtil; @@ -32,6 +33,7 @@ import java.awt.event.InputEvent; public class OpenFileInBrowserAction extends DumbAwareAction { private static final Logger LOG = Logger.getInstance("#com.intellij.ide.browsers.OpenFileInBrowserAction"); + @Override public void update(AnActionEvent e) { final DataContext dataContext = e.getDataContext(); final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext); @@ -40,7 +42,7 @@ public class OpenFileInBrowserAction extends DumbAwareAction { if (file != null && file.getVirtualFile() != null) { presentation.setVisible(true); - final WebBrowserUrlProvider browserUrlProvider = WebBrowserServiceImpl.getProvider(file); + Pair browserUrlProvider = WebBrowserServiceImpl.getProvider(file); final boolean isHtmlFile = HtmlUtil.isHtmlFile(file); presentation.setEnabled(browserUrlProvider != null || isHtmlFile); @@ -48,11 +50,11 @@ public class OpenFileInBrowserAction extends DumbAwareAction { String description = getTemplatePresentation().getDescription(); if (browserUrlProvider != null) { - final String customText = browserUrlProvider.getOpenInBrowserActionText(file); + final String customText = browserUrlProvider.first.getOpenInBrowserActionText(file); if (customText != null) { text = customText; } - final String customDescription = browserUrlProvider.getOpenInBrowserActionDescription(file); + final String customDescription = browserUrlProvider.first.getOpenInBrowserActionDescription(file); if (customDescription != null) { description = customDescription; } @@ -82,6 +84,7 @@ public class OpenFileInBrowserAction extends DumbAwareAction { } } + @Override public void actionPerformed(AnActionEvent e) { final DataContext dataContext = e.getDataContext(); final PsiFile psiFile = LangDataKeys.PSI_FILE.getData(dataContext); diff --git a/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java b/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java index 11b9db5fb282..0707997513a1 100644 --- a/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java +++ b/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java @@ -20,6 +20,8 @@ import com.intellij.ide.browsers.Urls; import com.intellij.ide.browsers.WebBrowserService; import com.intellij.ide.browsers.WebBrowserUrlProvider; import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.impl.http.HttpVirtualFile; import com.intellij.psi.PsiElement; @@ -55,10 +57,14 @@ public class WebBrowserServiceImpl extends WebBrowserService { } if (!(preferLocalUrl && HtmlUtil.isHtmlFile(psiFile))) { - WebBrowserUrlProvider provider = getProvider(psiElement); + Pair provider = getProvider(psiElement); if (provider != null) { + if (provider.second != null) { + return provider.second; + } + try { - return provider.getUrl(psiElement, psiFile, virtualFile); + return provider.first.getUrl(psiElement, psiFile, virtualFile); } catch (WebBrowserUrlProvider.BrowserException e) { if (!HtmlUtil.isHtmlFile(psiFile)) { @@ -82,16 +88,17 @@ public class WebBrowserServiceImpl extends WebBrowserService { } @Nullable - public static WebBrowserUrlProvider getProvider(@Nullable PsiElement element) { + public static Pair getProvider(@Nullable PsiElement element) { PsiFile psiFile = element == null ? null : element.getContainingFile(); if (psiFile == null) { return null; } + Ref result = Ref.create(); List allProviders = Arrays.asList(WebBrowserUrlProvider.EP_NAME.getExtensions()); for (WebBrowserUrlProvider urlProvider : DumbService.getInstance(element.getProject()).filterByDumbAwareness(allProviders)) { - if (urlProvider.canHandleElement(element, psiFile)) { - return urlProvider; + if (urlProvider.canHandleElement(element, psiFile, result)) { + return Pair.create(urlProvider, result.get()); } } return null; diff --git a/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java b/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java index 80db55d83382..688191fcef19 100644 --- a/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java +++ b/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java @@ -16,6 +16,7 @@ package com.intellij.ide.browsers; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -33,12 +34,30 @@ public abstract class WebBrowserUrlProvider { super(message); } } - /** - * Invariant: element has not null containing psi file with not null virtual file - */ - public abstract boolean canHandleElement(@NotNull PsiElement element, @NotNull PsiFile psiFile); - @NotNull + public boolean canHandleElement(@NotNull PsiElement element, @NotNull PsiFile psiFile, Ref result) { + VirtualFile file = psiFile.getVirtualFile(); + if (file == null) { + return false; + } + + Url url; + try { + url = getUrl(element, psiFile, file); + } + catch (BrowserException ignored) { + return false; + } + + if (url == null) { + return false; + } + + result.set(url); + return true; + } + + @Nullable public abstract Url getUrl(@NotNull PsiElement element, @NotNull PsiFile psiFile, @NotNull VirtualFile virtualFile) throws BrowserException; @Nullable