source: josm/trunk/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java @ 5241

Revision 3083, 5.7 KB checked in by bastiK, 2 years ago (diff)

added svn:eol-style=native to source files

  • Property svn:eol-style set to native
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.InputStream;
7import java.util.LinkedList;
8import java.util.List;
9
10import javax.xml.parsers.DocumentBuilderFactory;
11import javax.xml.xpath.XPath;
12import javax.xml.xpath.XPathConstants;
13import javax.xml.xpath.XPathException;
14import javax.xml.xpath.XPathFactory;
15
16import org.openstreetmap.josm.data.coor.LatLon;
17import org.openstreetmap.josm.data.osm.DataSet;
18import org.openstreetmap.josm.data.osm.UserInfo;
19import org.openstreetmap.josm.gui.progress.ProgressMonitor;
20import org.openstreetmap.josm.tools.DateUtils;
21import org.w3c.dom.Document;
22import org.w3c.dom.Node;
23import org.w3c.dom.NodeList;
24
25public class OsmServerUserInfoReader extends OsmServerReader {
26
27    static protected String getAttribute(Node node, String name) {
28        return node.getAttributes().getNamedItem(name).getNodeValue();
29    }
30
31    static public  UserInfo buildFromXML(Document document) throws OsmDataParsingException{
32        try {
33            XPathFactory factory = XPathFactory.newInstance();
34            XPath xpath = factory.newXPath();
35            UserInfo userInfo = new UserInfo();
36            Node xmlNode = (Node)xpath.compile("/osm/user[1]").evaluate(document, XPathConstants.NODE);
37            if ( xmlNode== null)
38                throw new OsmDataParsingException(tr("XML tag <user> is missing."));
39
40            // -- id
41            String v = getAttribute(xmlNode, "id");
42            if (v == null)
43                throw new OsmDataParsingException(tr("Missing attribute ''{0}'' on XML tag ''{1}''.", "id", "user"));
44            try {
45                userInfo.setId(Integer.parseInt(v));
46            } catch(NumberFormatException e) {
47                throw new OsmDataParsingException(tr("Illegal value for attribute ''{0}'' on XML tag ''{1}''. Got {2}.", "id", "user", v));
48            }
49            // -- display name
50            v = getAttribute(xmlNode, "display_name");
51            userInfo.setDisplayName(v);
52            // -- account_created
53            v = getAttribute(xmlNode, "account_created");
54            if (v!=null) {
55                userInfo.setAccountCreated(DateUtils.fromString(v));
56            }
57            // -- description
58            xmlNode = (Node)xpath.compile("/osm/user[1]/description[1]/text()").evaluate(document, XPathConstants.NODE);
59            if (xmlNode != null) {
60                userInfo.setDescription(xmlNode.getNodeValue());
61            }
62            // -- home
63            xmlNode = (Node)xpath.compile("/osm/user[1]/home").evaluate(document, XPathConstants.NODE);
64            if (xmlNode != null) {
65                v = getAttribute(xmlNode, "lat");
66                if (v == null)
67                    throw new OsmDataParsingException(tr("Missing attribute ''{0}'' on XML tag ''{1}''.", "lat", "home"));
68                double lat;
69                try {
70                    lat = Double.parseDouble(v);
71                } catch(NumberFormatException e) {
72                    throw new OsmDataParsingException(tr("Illegal value for attribute ''{0}'' on XML tag ''{1}''. Got {2}.", "lat", "home", v));
73                }
74
75                v = getAttribute(xmlNode, "lon");
76                if (v == null)
77                    throw new OsmDataParsingException(tr("Missing attribute ''{0}'' on XML tag ''{1}''.", "lon", "home"));
78                double lon;
79                try {
80                    lon = Double.parseDouble(v);
81                } catch(NumberFormatException e) {
82                    throw new OsmDataParsingException(tr("Illegal value for attribute ''{0}'' on XML tag ''{1}''. Got {2}.", "lon", "home", v));
83                }
84
85                v = getAttribute(xmlNode, "zoom");
86                if (v == null)
87                    throw new OsmDataParsingException(tr("Missing attribute ''{0}'' on XML tag ''{1}''.", "zoom", "home"));
88                int zoom;
89                try {
90                    zoom = Integer.parseInt(v);
91                } catch(NumberFormatException e) {
92                    throw new OsmDataParsingException(tr("Illegal value for attribute ''{0}'' on XML tag ''{1}''. Got {2}.", "zoom", "home", v));
93                }
94                userInfo.setHome(new LatLon(lat,lon));
95                userInfo.setHomeZoom(zoom);
96            }
97
98            // -- language list
99            NodeList xmlNodeList = (NodeList)xpath.compile("/osm/user[1]/languages[1]/lang").evaluate(document, XPathConstants.NODESET);
100            if (xmlNodeList != null) {
101                List<String> languages = new LinkedList<String>();
102                for (int i=0; i < xmlNodeList.getLength(); i++) {
103                    languages.add(xmlNodeList.item(i).getNodeValue());
104                }
105                userInfo.setLanguages(languages);
106            }
107            return userInfo;
108        } catch(XPathException e) {
109            throw new OsmDataParsingException(e);
110        }
111    }
112
113    public OsmServerUserInfoReader() {
114        setDoAuthenticate(true);
115    }
116
117    @Override
118    public DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException {
119        // not implemented
120        return null;
121    }
122
123    public UserInfo fetchUserInfo(ProgressMonitor monitor) throws OsmTransferException {
124        try {
125            monitor.beginTask("");
126            monitor.indeterminateSubTask(tr("Reading user info ..."));
127            InputStream in = getInputStream("user/details", monitor.createSubTaskMonitor(1, true));
128            return buildFromXML(
129                    DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in)
130            );
131        } catch(OsmTransferException e) {
132            throw e;
133        } catch(Exception e) {
134            throw new OsmTransferException(e);
135        } finally {
136            monitor.finishTask();
137        }
138    }
139}
Note: See TracBrowser for help on using the repository browser.