001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.io.session;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.io.File;
007import java.io.IOException;
008import java.util.ArrayList;
009import java.util.Date;
010import java.util.List;
011
012import org.openstreetmap.josm.data.coor.LatLon;
013import org.openstreetmap.josm.gui.layer.GpxLayer;
014import org.openstreetmap.josm.gui.layer.Layer;
015import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
016import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry;
017import org.openstreetmap.josm.gui.progress.ProgressMonitor;
018import org.openstreetmap.josm.io.IllegalDataException;
019import org.w3c.dom.Element;
020import org.w3c.dom.Node;
021import org.w3c.dom.NodeList;
022
023public class GeoImageSessionImporter implements SessionLayerImporter {
024
025    @Override
026    public Layer load(Element elem, SessionReader.ImportSupport support, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
027        String version = elem.getAttribute("version");
028        if (!"0.1".equals(version)) {
029            throw new IllegalDataException(tr("Version ''{0}'' of meta data for geoimage layer is not supported. Expected: 0.1", version));
030        }
031
032        List<ImageEntry> entries = new ArrayList<ImageEntry>();
033        NodeList imgNodes = elem.getChildNodes();
034        boolean useThumbs = false;
035        for (int i=0; i<imgNodes.getLength(); ++i) {
036            Node imgNode = imgNodes.item(i);
037            if (imgNode.getNodeType() == Node.ELEMENT_NODE) {
038                Element imgElem = (Element) imgNode;
039                if (imgElem.getTagName().equals("geoimage")) {
040                    ImageEntry entry = new ImageEntry();
041                    NodeList attrNodes = imgElem.getChildNodes();
042                    for (int j=0; j<attrNodes.getLength(); ++j) {
043                        Node attrNode = attrNodes.item(j);
044                        if (attrNode.getNodeType() == Node.ELEMENT_NODE) {
045                            Element attrElem = (Element) attrNode;
046                            try {
047                                if (attrElem.getTagName().equals("file")) {
048                                    entry.setFile(new File(attrElem.getTextContent()));
049                                } else if (attrElem.getTagName().equals("position")) {
050                                    double lat = Double.parseDouble(attrElem.getAttribute("lat"));
051                                    double lon = Double.parseDouble(attrElem.getAttribute("lon"));
052                                    entry.setPos(new LatLon(lat, lon));
053                                } else if (attrElem.getTagName().equals("speed")) {
054                                    entry.setSpeed(Double.parseDouble(attrElem.getTextContent()));
055                                } else if (attrElem.getTagName().equals("elevation")) {
056                                    entry.setElevation(Double.parseDouble(attrElem.getTextContent()));
057                                } else if (attrElem.getTagName().equals("gps-time")) {
058                                    entry.setGpsTime(new Date(Long.parseLong(attrElem.getTextContent())));
059                                } else if (attrElem.getTagName().equals("exif-orientation")) {
060                                    entry.setExifOrientation(Integer.parseInt(attrElem.getTextContent()));
061                                } else if (attrElem.getTagName().equals("exif-time")) {
062                                    entry.setExifTime(new Date(Long.parseLong(attrElem.getTextContent())));
063                                } else if (attrElem.getTagName().equals("exif-gps-time")) {
064                                    entry.setExifGpsTime(new Date(Long.parseLong(attrElem.getTextContent())));
065                                } else if (attrElem.getTagName().equals("exif-coordinates")) {
066                                    double lat = Double.parseDouble(attrElem.getAttribute("lat"));
067                                    double lon = Double.parseDouble(attrElem.getAttribute("lon"));
068                                    entry.setExifCoor(new LatLon(lat, lon));
069                                } else if (attrElem.getTagName().equals("exif-image-direction")) {
070                                    entry.setExifImgDir(Double.parseDouble(attrElem.getTextContent()));
071                                } else if (attrElem.getTagName().equals("is-new-gps-data") && Boolean.parseBoolean(attrElem.getTextContent())) {
072                                    entry.flagNewGpsData();
073                                }
074                                // TODO: handle thumbnail loading
075                            } catch (NumberFormatException e) {
076                                // nothing
077                            }
078                        }
079                    }
080                    entries.add(entry);
081                } else if (imgElem.getTagName().equals("show-thumbnails")) {
082                    useThumbs = Boolean.parseBoolean(imgElem.getTextContent());
083                }
084            }
085        }
086
087        GpxLayer gpxLayer = null;
088        List<SessionReader.LayerDependency> deps = support.getLayerDependencies();
089        if (!deps.isEmpty()) {
090            Layer layer = deps.iterator().next().getLayer();
091            if (layer instanceof GpxLayer) {
092                gpxLayer = (GpxLayer) layer;
093            }
094        }
095
096        return new GeoImageLayer(entries, gpxLayer, useThumbs);
097    }
098
099}