From 16d9d5767b08f8f0b24c816d565fbe5df0eb99f7 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 19 Dec 2014 17:52:01 +0100 Subject: [PATCH] cleanup --- .../javadoc/JavaDocExternalFilter.java | 2 +- .../ExternalJavadocPresentationTest.java | 8 +- .../documentation/AbstractExternalFilter.java | 247 +++++++++--------- 3 files changed, 122 insertions(+), 135 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java index cac3b57eb90d..16dfdc787097 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java @@ -102,7 +102,7 @@ public class JavaDocExternalFilter extends AbstractExternalFilter { } @Override - protected RefConvertor[] getRefConvertors() { + protected RefConvertor[] getRefConverters() { return myReferenceConvertors; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/ExternalJavadocPresentationTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/ExternalJavadocPresentationTest.java index 3a14a4ef539c..9d51c0ccb508 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/ExternalJavadocPresentationTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/javadoc/ExternalJavadocPresentationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -71,12 +71,12 @@ public class ExternalJavadocPresentationTest extends LightCodeInsightTestCase { } @Override - public void doBuildFromStream(String surl, Reader input, StringBuffer data, boolean search4Encoding) throws IOException { - super.doBuildFromStream(surl, input, data, search4Encoding); + public void doBuildFromStream(String url, Reader input, StringBuilder data, boolean search4Encoding) throws IOException { + super.doBuildFromStream(url, input, data, search4Encoding); } } JavadocExternalTestFilter filter = new JavadocExternalTestFilter(getProject()); - final StringBuffer extractedData = new StringBuffer(); + StringBuilder extractedData = new StringBuilder(); filter.doBuildFromStream(url, new StringReader(LoadTextUtil.loadText(pageTextFile).toString()), extractedData, false); assertEquals(LoadTextUtil.loadText(expectedTextFile).toString(), extractedData.toString()); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java index 3cc859da0d25..a64917f88e4e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java @@ -20,8 +20,6 @@ import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; -import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Trinity; @@ -31,8 +29,8 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.*; import com.intellij.psi.PsiElement; import com.intellij.util.SystemProperties; -import com.intellij.util.io.UrlConnectionUtil; -import com.intellij.util.net.HttpConfigurable; +import com.intellij.util.ThrowableConsumer; +import com.intellij.util.io.HttpRequests; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,54 +38,53 @@ import org.jetbrains.annotations.Nullable; import java.io.*; import java.net.URL; import java.net.URLConnection; +import java.util.Locale; import java.util.concurrent.Future; import java.util.jar.JarFile; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; -/** - * @author db - * @since May 2, 2003 - */ public abstract class AbstractExternalFilter { + private static final Logger LOG = Logger.getInstance(AbstractExternalFilter.class); private static final boolean EXTRACT_IMAGES_FROM_JARS = SystemProperties.getBooleanProperty("extract.doc.images", true); - @NotNull public static final String QUICK_DOC_DIR_NAME = "quickdoc"; + @NotNull + @NonNls + public static final String QUICK_DOC_DIR_NAME = "quickdoc"; - private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.javadoc.JavaDocExternalFilter"); - - private static final Pattern ourClassDataStartPattern = Pattern.compile("START OF CLASS DATA", Pattern.CASE_INSENSITIVE); - private static final Pattern ourClassDataEndPattern = Pattern.compile("SUMMARY ========", Pattern.CASE_INSENSITIVE); + private static final Pattern ourClassDataStartPattern = Pattern.compile("START OF CLASS DATA", Pattern.CASE_INSENSITIVE); + private static final Pattern ourClassDataEndPattern = Pattern.compile("SUMMARY ========", Pattern.CASE_INSENSITIVE); private static final Pattern ourNonClassDataEndPattern = Pattern.compile("]*?)\"", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); - private static @NonNls final Pattern ourPathInsideJarPattern = Pattern.compile( + private static @NonNls final Pattern ourPathInsideJarPattern = Pattern.compile( String.format("%s(.+\\.jar)!/(.+?)[^/]+", JarFileSystem.PROTOCOL_PREFIX), Pattern.CASE_INSENSITIVE | Pattern.DOTALL ); - private static @NonNls final String JAR_PROTOCOL = "jar:"; - @NonNls private static final String HR = "
"; - @NonNls private static final String P = "

"; - @NonNls private static final String DL = "

"; - @NonNls protected static final String H2 = ""; - @NonNls protected static final String HTML_CLOSE = ""; - @NonNls protected static final String HTML = ""; - @NonNls private static final String BR = "
"; - @NonNls private static final String DT = "
"; - private static final Pattern CHARSET_META_PATTERN = + private static @NonNls final String JAR_PROTOCOL = "jar:"; + @NonNls private static final String HR = "
"; + @NonNls private static final String P = "

"; + @NonNls private static final String DL = "

"; + @NonNls protected static final String H2 = ""; + @NonNls protected static final String HTML_CLOSE = ""; + @NonNls protected static final String HTML = ""; + @NonNls private static final String BR = "
"; + @NonNls private static final String DT = "
"; + private static final Pattern CHARSET_META_PATTERN = Pattern.compile("]+\\s*charset=\"?([\\w\\-]*)\\s*\">", Pattern.CASE_INSENSITIVE); - private static final String FIELD_SUMMARY = ""; - private static final String CLASS_SUMMARY = "
"; - private final HttpConfigurable myHttpConfigurable = HttpConfigurable.getInstance(); + private static final String FIELD_SUMMARY = ""; + private static final String CLASS_SUMMARY = "
"; protected static abstract class RefConvertor { - @NotNull private final Pattern mySelector; + @NotNull + private final Pattern mySelector; public RefConvertor(@NotNull Pattern selector) { mySelector = selector; @@ -124,7 +121,7 @@ public abstract class AbstractExternalFilter { } } - protected final RefConvertor myIMGConvertor = new RefConvertor(ourIMGselector) { + protected final RefConvertor myIMGConvertor = new RefConvertor(ourImgSelector) { @Override protected String convertReference(String root, String href) { if (StringUtil.startsWithChar(href, '#')) { @@ -192,7 +189,7 @@ public abstract class AbstractExternalFilter { root = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, "/" + path); } } - return ourHTMLFilesuffix.matcher(root).replaceAll("/") + href; + return ourHtmlFileSuffix.matcher(root).replaceAll("/") + href; } }; @@ -210,39 +207,40 @@ public abstract class AbstractExternalFilter { public String correctRefs(String root, String read) { String result = read; - for (RefConvertor myReferenceConvertor : getRefConvertors()) { + for (RefConvertor myReferenceConvertor : getRefConverters()) { result = myReferenceConvertor.refFilter(root, result); } return result; } - protected abstract RefConvertor[] getRefConvertors(); + protected abstract RefConvertor[] getRefConverters(); - @Nullable - private static Reader getReaderByUrl(final String surl, final HttpConfigurable httpConfigurable, final ProgressIndicator pi) - throws IOException - { - if (surl.startsWith(JAR_PROTOCOL)) { - VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(BrowserUtil.getDocURL(surl)); + private static void getReaderByUrl(@NotNull String url, final @NotNull ThrowableConsumer consumer) + throws IOException { + if (url.startsWith(JAR_PROTOCOL)) { + VirtualFile file = VirtualFileManager.getInstance().findFileByUrl(BrowserUtil.getDocURL(url)); + if (file != null) { + consumer.consume(new StringReader(VfsUtilCore.loadText(file))); + } + return; + } - if (file == null) { + final URL parsedUrl = BrowserUtil.getURL(url); + if (parsedUrl == null) { + return; + } + + HttpRequests.request(parsedUrl.toString()).connect(new HttpRequests.RequestProcessor() { + @Override + public Void process(@NotNull HttpRequests.Request request) throws IOException { + String contentEncoding = guessEncoding(parsedUrl); + InputStream inputStream = request.getInputStream(); + //noinspection IOResourceOpenedButNotSafelyClosed + consumer.consume(contentEncoding != null ? new MyReader(inputStream, contentEncoding) : new MyReader(inputStream)); return null; } - - return new StringReader(VfsUtilCore.loadText(file)); - } - - URL url = BrowserUtil.getURL(surl); - if (url == null) { - return null; - } - final URLConnection urlConnection = httpConfigurable.openConnection(url.toString()); - final String contentEncoding = guessEncoding(url); - final InputStream inputStream = - pi != null ? UrlConnectionUtil.getConnectionInputStreamWithException(urlConnection, pi) : urlConnection.getInputStream(); - //noinspection IOResourceOpenedButNotSafelyClosed - return contentEncoding != null ? new MyReader(inputStream, contentEncoding) : new MyReader(inputStream); + }); } private static String guessEncoding(URL url) { @@ -264,31 +262,34 @@ public abstract class AbstractExternalFilter { catch (IOException ignored) { } finally { - if (reader != null) + if (reader != null) { try { reader.close(); } catch (IOException ignored) { } + } } return result; } @Nullable @SuppressWarnings({"HardCodedStringLiteral"}) - public String getExternalDocInfo(final String surl) throws Exception { + public String getExternalDocInfo(final String url) throws Exception { Application app = ApplicationManager.getApplication(); if (!app.isUnitTestMode() && app.isDispatchThread() || app.isWriteAccessAllowed()) { LOG.error("May block indefinitely: shouldn't be called from EDT or under write lock"); return null; } - if (surl == null) return null; + if (url == null) { + return null; + } if (MyJavadocFetcher.isFree()) { - final MyJavadocFetcher fetcher = new MyJavadocFetcher(surl, new MyDocBuilder() { + final MyJavadocFetcher fetcher = new MyJavadocFetcher(url, new MyDocBuilder() { @Override - public void buildFromStream(String surl, Reader input, StringBuffer result) throws IOException { - doBuildFromStream(surl, input, result); + public void buildFromStream(String url, Reader input, StringBuilder result) throws IOException { + doBuildFromStream(url, input, result); } }); final Future fetcherFuture = app.executeOnPooledThread(fetcher); @@ -304,7 +305,7 @@ public abstract class AbstractExternalFilter { throw exception; } - final String docText = correctRefs(ourAnchorsuffix.matcher(surl).replaceAll(""), fetcher.getData()); + final String docText = correctRefs(ourAnchorSuffix.matcher(url).replaceAll(""), fetcher.getData()); if (LOG.isDebugEnabled()) { LOG.debug("Filtered JavaDoc: " + docText + "\n"); } @@ -318,13 +319,12 @@ public abstract class AbstractExternalFilter { return getExternalDocInfo(docURL); } - protected void doBuildFromStream(String surl, Reader input, StringBuffer data) throws IOException { - doBuildFromStream(surl, input, data, true); + protected void doBuildFromStream(String url, Reader input, StringBuilder data) throws IOException { + doBuildFromStream(url, input, data, true); } - protected void doBuildFromStream(String surl, Reader input, StringBuffer data, boolean search4Encoding) throws IOException { - BufferedReader buf = new BufferedReader(input); - Trinity settings = getParseSettings(surl); + protected void doBuildFromStream(final String url, Reader input, final StringBuilder data, boolean search4Encoding) throws IOException { + Trinity settings = getParseSettings(url); @NonNls Pattern startSection = settings.first; @NonNls Pattern endSection = settings.second; boolean useDt = settings.third; @@ -349,6 +349,8 @@ public abstract class AbstractExternalFilter { String read; String contentEncoding = null; + @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") + BufferedReader buf = new BufferedReader(input); do { read = buf.readLine(); if (read != null && search4Encoding && read.contains("charset")) { @@ -360,21 +362,23 @@ public abstract class AbstractExternalFilter { } while (read != null && !startSection.matcher(StringUtil.toUpperCase(read)).find()); - if (input instanceof MyReader && contentEncoding != null) { - if (!contentEncoding.equalsIgnoreCase(CharsetToolkit.UTF8) && - !contentEncoding.equals(((MyReader)input).getEncoding())) - { //restart page parsing with correct encoding - Reader stream; - try { - stream = getReaderByUrl(surl, myHttpConfigurable, new ProgressIndicatorBase()); - } - catch (ProcessCanceledException e) { - return; - } - data.delete(0, data.length()); - doBuildFromStream(surl, new MyReader(((MyReader)stream).getInputStream(), contentEncoding), data, false); + if (input instanceof MyReader && contentEncoding != null && !contentEncoding.equalsIgnoreCase(CharsetToolkit.UTF8) && + !contentEncoding.equals(((MyReader)input).getEncoding())) { + //restart page parsing with correct encoding + try { + final String finalContentEncoding = contentEncoding; + getReaderByUrl(url, new ThrowableConsumer() { + @Override + public void consume(Reader reader) throws IOException { + data.delete(0, data.length()); + doBuildFromStream(url, new MyReader(((MyReader)reader).getInputStream(), finalContentEncoding), data, false); + } + }); + } + catch (ProcessCanceledException e) { return; } + return; } if (read == null) { @@ -386,7 +390,7 @@ public abstract class AbstractExternalFilter { boolean skip = false; do { - if (StringUtil.toUpperCase(read).contains(H2) && !read.toUpperCase().contains("H2")) { // read=class name in

+ if (StringUtil.toUpperCase(read).contains(H2) && !read.toUpperCase(Locale.ENGLISH).contains("H2")) { // read=class name in

data.append(H2); skip = true; } @@ -403,8 +407,7 @@ public abstract class AbstractExternalFilter { data.append(DL); - StringBuffer classDetails = new StringBuffer(); - + StringBuilder classDetails = new StringBuilder(); while (((read = buf.readLine()) != null) && !StringUtil.toUpperCase(read).equals(HR) && !StringUtil.toUpperCase(read).equals(P)) { if (reachTheEnd(data, read, classDetails)) return; appendLine(classDetails, read); @@ -438,9 +441,9 @@ public abstract class AbstractExternalFilter { /** * Decides what settings should be used for parsing content represented by the given url. * - * @param url url which points to the target content - * @return following data: (start interested data boundary pattern; end interested data boundary pattern; - * replace table data by <dt>) + * @param url url which points to the target content + * @return following data: (start interested data boundary pattern; end interested data boundary pattern; + * replace table data by <dt>) */ @NotNull protected Trinity getParseSettings(@NotNull String url) { @@ -448,7 +451,7 @@ public abstract class AbstractExternalFilter { Pattern endSection = ourClassDataEndPattern; boolean useDt = true; - Matcher anchorMatcher = ourAnchorsuffix.matcher(url); + Matcher anchorMatcher = ourAnchorSuffix.matcher(url); if (anchorMatcher.find()) { useDt = false; startSection = Pattern.compile(Pattern.quote("() { + @Override + public void consume(Reader reader) throws IOException { + myBuilder.buildFromStream(url, reader, data); + } + }); } - catch (ProcessCanceledException e) { - return; + catch (ProcessCanceledException ignored) { } catch (IOException e) { - myExceptions[0] = e; - } - - if (stream == null) { - return; - } - - try { - myBuilder.buildFromStream(surl, stream, data); - } - catch (final IOException e) { - myExceptions[0] = e; - } - finally { - try { - stream.close(); - } - catch (IOException e) { - myExceptions[0] = e; - } + myException = e; } } finally { + //noinspection AssignmentToStaticFieldFromInstanceMethod ourFree = true; } } public Exception getException() { - return myExceptions[0]; + return myException; } public void cleanup() { - myExceptions[0] = null; + myException = null; } }