// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.io;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.util.HashMap;
import java.util.Map;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathException;
import javax.xml.xpath.XPathFactory;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
import org.openstreetmap.josm.tools.XmlParsingException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Download and parse preferences of the logged in user (OSM API v0.6 "/user/preferences").
* @see /user/preferences
* @since 12502
*/
public class OsmServerUserPreferencesReader extends OsmServerReader {
/**
* Parses the given XML data and returns the associated user preferences.
* @param document The XML contents
* @return The user preferences
* @throws XmlParsingException if parsing goes wrong
*/
public static Map buildFromXML(Document document) throws XmlParsingException {
try {
XPath xpath = XPathFactory.newInstance().newXPath();
Map result = new HashMap<>();
// -- preferences
NodeList xmlNodeList = (NodeList) xpath.compile("/osm/preferences/preference").evaluate(document, XPathConstants.NODESET);
if (xmlNodeList != null) {
for (int i = 0; i < xmlNodeList.getLength(); i++) {
Node xmlNode = xmlNodeList.item(i);
String k = getAttribute(xmlNode, "k");
if (k == null)
throw new XmlParsingException(tr("Missing attribute ''{0}'' on XML tag ''{1}''.", "k", "preference"));
String v = getAttribute(xmlNode, "v");
if (v == null)
throw new XmlParsingException(tr("Missing attribute ''{0}'' on XML tag ''{1}''.", "v", "preference"));
result.put(k, v);
}
}
return result;
} catch (XPathException e) {
throw new XmlParsingException(e);
}
}
/**
* Constructs a new {@code OsmServerUserInfoReader}.
*/
public OsmServerUserPreferencesReader() {
setDoAuthenticate(true);
}
@Override
public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
// not implemented
return null;
}
/**
* Fetches user preferences, without explicit reason.
* @param monitor The progress monitor
* @return The user preferences
* @throws OsmTransferException if something goes wrong
*/
public Map fetchUserPreferences(ProgressMonitor monitor) throws OsmTransferException {
return fetchUserPreferences(monitor, null);
}
/**
* Fetches user info, with an explicit reason.
* @param monitor The progress monitor
* @param reason The reason to show on console. Can be {@code null} if no reason is given
* @return The user info
* @throws OsmTransferException if something goes wrong
*/
public Map fetchUserPreferences(ProgressMonitor monitor, String reason) throws OsmTransferException {
return fetchData("user/preferences", tr("Reading user preferences ..."),
OsmServerUserPreferencesReader::buildFromXML, monitor, reason);
}
}