// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.help;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.openstreetmap.josm.tools.HttpClient;
import org.openstreetmap.josm.tools.WikiReader;
/**
* Reads help content from the JOSM Wiki and prepares it for rendering in the internal
* help browser.
*
* The help content has to be <strong>filtered</strong> because only the main content <tt><div></tt>
* of a Wiki help page is displayed in the internal help browser.
*
* It also has to be <strong>transformed</strong> because the internal help browser required slightly
* different HTML than what is provided by the Wiki.
*/
public class HelpContentReader extends WikiReader {
/**
* Constructs a new {@code HelpContentReader}.
*
* @param baseUrl the base url of the JOSM help wiki, i.e. https://josm.openstreetmap.org
*/
public HelpContentReader(String baseUrl) {
super(baseUrl);
}
/**
* Fetches the content of a help topic from the JOSM wiki.
*
* @param helpTopicUrl the absolute help topic URL
* @param dotest if {@code true}, checks if help content is empty
* @return the content, filtered and transformed for being displayed in the internal help browser
* @throws HelpContentReaderException if problem occurs
* @throws MissingHelpContentException if this helpTopicUrl doesn't point to an existing Wiki help page
*/
public String fetchHelpTopicContent(String helpTopicUrl, boolean dotest) throws HelpContentReaderException {
if (helpTopicUrl == null)
throw new MissingHelpContentException("helpTopicUrl is null");
HttpClient.Response con = null;
try {
URL u = new URL(helpTopicUrl);
con = HttpClient.create(u).connect();
try (BufferedReader in = con.getContentReader()) {
return prepareHelpContent(in, dotest, u);
}
} catch (MalformedURLException e) {
throw new HelpContentReaderException(e, 0);
} catch (IOException e) {
throw new HelpContentReaderException(e, con != null ? con.getResponseCode() : 0);
}
}
/**
* Reads help content from the input stream and prepares it to be rendered later
* in the internal help browser.
*
* Throws a {@link MissingHelpContentException} if the content read from the stream
* most likely represents a stub help page.
*
* @param in the input stream
* @param dotest if {@code true}, checks if help content is empty
* @param url help topic URL
* @return the content
* @throws HelpContentReaderException if an exception occurs
* @throws MissingHelpContentException if the content read isn't a help page
* @since 5936
*/
protected String prepareHelpContent(BufferedReader in, boolean dotest, URL url) throws HelpContentReaderException {
String s = "";
try {
s = readFromTrac(in, url);
} catch (IOException e) {
throw new HelpContentReaderException(e, 0);
}
if (dotest && s.isEmpty())
throw new MissingHelpContentException(s);
return s;
}
}