// License: GPL. For details, see LICENSE file.
package relcontext.actions;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.tools.ImageProvider;
import org.openstreetmap.josm.tools.LanguageInfo;
import org.openstreetmap.josm.tools.OpenBrowser;
import relcontext.ChosenRelation;
import relcontext.ChosenRelationListener;
public class RelationHelpAction extends AbstractAction implements ChosenRelationListener {
private ChosenRelation rel;
public RelationHelpAction(ChosenRelation rel) {
super();
putValue(NAME, tr("Open relation wiki page"));
putValue(SHORT_DESCRIPTION, tr("Launch browser with wiki help for selected object"));
putValue(SMALL_ICON, ImageProvider.get("dialogs", "search"));
this.rel = rel;
rel.addChosenRelationListener(this);
setEnabled(rel.get() != null);
}
@Override
public void chosenRelationChanged(Relation oldRelation, Relation newRelation) {
setEnabled(newRelation != null);
}
/**
* Copypasted from {@link org.openstreetmap.josm.gui.dialogs.properties.PropertiesDialog.HelpAction}.
*/
@Override
public void actionPerformed(ActionEvent e) {
if (rel.get() == null)
return;
try {
String base = Main.pref.get("url.openstreetmap-wiki", "http://wiki.openstreetmap.org/wiki/");
String lang = LanguageInfo.getWikiLanguagePrefix();
final List<URI> uris = new ArrayList<>();
String type = URLEncoder.encode(rel.get().get("type"), "UTF-8");
if (type != null && !type.equals("")) {
uris.add(new URI(String.format("%s%sRelation:%s", base, lang, type)));
uris.add(new URI(String.format("%sRelation:%s", base, type)));
}
uris.add(new URI(String.format("%s%sRelations", base, lang)));
uris.add(new URI(String.format("%sRelations", base)));
Main.worker.execute(new Runnable() {
@Override
public void run() {
try {
// find a page that actually exists in the wiki
HttpURLConnection conn;
for (URI u : uris) {
conn = (HttpURLConnection) u.toURL().openConnection();
conn.setConnectTimeout(5000);
if (conn.getResponseCode() != 200) {
System.out.println("INFO: " + u + " does not exist");
conn.disconnect();
} else {
int osize = conn.getContentLength();
conn.disconnect();
conn = (HttpURLConnection) new URI(u.toString()
.replace("=", "%3D") /* do not URLencode whole string! */
.replaceFirst("/wiki/", "/w/index.php?redirect=no&title=")
).toURL().openConnection();
conn.setConnectTimeout(5000);
/* redirect pages have different content length, but retrieving a "nonredirect"
* page using index.php and the direct-link method gives slightly different
* content lengths, so we have to be fuzzy.. (this is UGLY, recode if u know better)
*/
if (Math.abs(conn.getContentLength() - osize) > 200) {
System.out.println("INFO: " + u + " is a mediawiki redirect");
conn.disconnect();
} else {
System.out.println("INFO: browsing to " + u);
conn.disconnect();
OpenBrowser.displayUrl(u.toString());
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e1) {
e1.printStackTrace();
}
}
}