Ticket #23427: 23427.patch
| File 23427.patch, 11.8 KB (added by , 2 years ago) |
|---|
-
src/org/openstreetmap/josm/io/session/GpxTracksSessionImporter.java
6 6 import java.io.IOException; 7 7 import java.io.InputStream; 8 8 9 import javax.xml.xpath.XPath;10 import javax.xml.xpath.XPathConstants;11 import javax.xml.xpath.XPathExpression;12 import javax.xml.xpath.XPathExpressionException;13 import javax.xml.xpath.XPathFactory;14 15 9 import org.openstreetmap.josm.gui.io.importexport.GpxImporter; 16 10 import org.openstreetmap.josm.gui.io.importexport.NMEAImporter; 17 11 import org.openstreetmap.josm.gui.io.importexport.RtkLibImporter; … … 20 14 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 21 15 import org.openstreetmap.josm.io.IllegalDataException; 22 16 import org.openstreetmap.josm.tools.Logging; 23 import org.openstreetmap.josm.tools.Utils;24 17 import org.w3c.dom.Element; 25 18 import org.w3c.dom.Node; 26 19 import org.w3c.dom.NodeList; … … 38 31 if (!"0.1".equals(version)) { 39 32 throw new IllegalDataException(tr("Version ''{0}'' of meta data for gpx track layer is not supported. Expected: 0.1", version)); 40 33 } 41 try { 42 XPathFactory xPathFactory = XPathFactory.newInstance(); 43 XPath xpath = xPathFactory.newXPath(); 44 XPathExpression fileExp = xpath.compile("file/text()"); 45 String fileStr = (String) fileExp.evaluate(elem, XPathConstants.STRING); 46 if (Utils.isEmpty(fileStr)) { 47 throw new IllegalDataException(tr("File name expected for layer no. {0}", support.getLayerIndex())); 48 } 34 String fileStr = OsmDataSessionImporter.extractFileName(elem, support); 49 35 50 try (InputStream in = support.getInputStream(fileStr)) {51 GpxImporter.GpxImporterData importData;36 try (InputStream in = support.getInputStream(fileStr)) { 37 GpxImporter.GpxImporterData importData; 52 38 53 if (NMEAImporter.FILE_FILTER.acceptName(fileStr)) { 54 importData = NMEAImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName()); 55 } else if (RtkLibImporter.FILE_FILTER.acceptName(fileStr)) { 56 importData = RtkLibImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName()); 57 } else { 58 importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(), progressMonitor); 39 if (NMEAImporter.FILE_FILTER.acceptName(fileStr)) { 40 importData = NMEAImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName()); 41 } else if (RtkLibImporter.FILE_FILTER.acceptName(fileStr)) { 42 importData = RtkLibImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName()); 43 } else { 44 importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(), progressMonitor); 45 } 46 if (importData.getGpxLayer() != null && importData.getGpxLayer().data != null) { 47 importData.getGpxLayer().data.fromSession = true; 48 } 49 NodeList markerNodes = elem.getElementsByTagName("markerLayer"); 50 if (markerNodes.getLength() > 0 && markerNodes.item(0).getNodeType() == Node.ELEMENT_NODE) { 51 Element markerEl = (Element) markerNodes.item(0); 52 try { 53 int index = Integer.parseInt(markerEl.getAttribute("index")); 54 support.addSubLayer(index, importData.getMarkerLayer(), markerEl); 55 } catch (NumberFormatException ex) { 56 Logging.warn(ex); 59 57 } 60 if (importData.getGpxLayer() != null && importData.getGpxLayer().data != null) {61 importData.getGpxLayer().data.fromSession = true;62 }63 NodeList markerNodes = elem.getElementsByTagName("markerLayer");64 if (markerNodes.getLength() > 0 && markerNodes.item(0).getNodeType() == Node.ELEMENT_NODE) {65 Element markerEl = (Element) markerNodes.item(0);66 try {67 int index = Integer.parseInt(markerEl.getAttribute("index"));68 support.addSubLayer(index, importData.getMarkerLayer(), markerEl);69 } catch (NumberFormatException ex) {70 Logging.warn(ex);71 }72 }73 74 support.addPostLayersTask(importData.getPostLayerTask());75 return getLayer(importData);76 58 } 77 59 78 } catch (XPathExpressionException e) {79 throw new IllegalDataException(e);60 support.addPostLayersTask(importData.getPostLayerTask()); 61 return getLayer(importData); 80 62 } 81 63 } 82 64 -
src/org/openstreetmap/josm/io/session/MarkerSessionImporter.java
6 6 import java.io.IOException; 7 7 import java.io.InputStream; 8 8 9 import javax.xml.xpath.XPath;10 import javax.xml.xpath.XPathConstants;11 import javax.xml.xpath.XPathExpression;12 import javax.xml.xpath.XPathExpressionException;13 import javax.xml.xpath.XPathFactory;14 15 9 import org.openstreetmap.josm.gui.io.importexport.GpxImporter; 16 10 import org.openstreetmap.josm.gui.layer.Layer; 17 11 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; … … 18 12 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 19 13 import org.openstreetmap.josm.io.IllegalDataException; 20 14 import org.openstreetmap.josm.io.session.SessionReader.ImportSupport; 21 import org.openstreetmap.josm.tools.Utils;22 15 import org.w3c.dom.Element; 23 16 24 17 /** … … 33 26 if (!"0.1".equals(version)) { 34 27 throw new IllegalDataException(tr("Version ''{0}'' of meta data for marker layer is not supported. Expected: 0.1", version)); 35 28 } 36 try { 37 XPathFactory xPathFactory = XPathFactory.newInstance(); 38 XPath xpath = xPathFactory.newXPath(); 39 XPathExpression fileExp = xpath.compile("file/text()"); 40 String fileStr = (String) fileExp.evaluate(elem, XPathConstants.STRING); 41 if (Utils.isEmpty(fileStr)) { 42 throw new IllegalDataException(tr("File name expected for layer no. {0}", support.getLayerIndex())); 43 } 29 String fileStr = OsmDataSessionImporter.extractFileName(elem, support); 44 30 45 try (InputStream in = support.getInputStream(fileStr)) {46 GpxImporter.GpxImporterData importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(),47 progressMonitor);31 try (InputStream in = support.getInputStream(fileStr)) { 32 GpxImporter.GpxImporterData importData = GpxImporter.loadLayers(in, support.getFile(fileStr), support.getLayerName(), 33 progressMonitor); 48 34 49 support.addPostLayersTask(importData.getPostLayerTask());35 support.addPostLayersTask(importData.getPostLayerTask()); 50 36 51 importData.getGpxLayer().destroy(); 52 return importData.getMarkerLayer(); 53 } 54 } catch (XPathExpressionException e) { 55 throw new IllegalDataException(e); 37 importData.getGpxLayer().destroy(); 38 return importData.getMarkerLayer(); 56 39 } 57 40 } 58 41 } -
src/org/openstreetmap/josm/io/session/NoteSessionImporter.java
6 6 import java.io.IOException; 7 7 import java.io.InputStream; 8 8 9 import javax.xml.xpath.XPath;10 import javax.xml.xpath.XPathConstants;11 import javax.xml.xpath.XPathExpression;12 import javax.xml.xpath.XPathExpressionException;13 import javax.xml.xpath.XPathFactory;14 15 9 import org.openstreetmap.josm.gui.io.importexport.NoteImporter; 16 10 import org.openstreetmap.josm.gui.layer.Layer; 17 11 import org.openstreetmap.josm.gui.layer.NoteLayer; … … 18 12 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 19 13 import org.openstreetmap.josm.io.IllegalDataException; 20 14 import org.openstreetmap.josm.io.session.SessionReader.ImportSupport; 21 import org.openstreetmap.josm.tools.Utils;22 15 import org.w3c.dom.Element; 23 16 import org.xml.sax.SAXException; 24 17 … … 34 27 if (!"0.1".equals(version)) { 35 28 throw new IllegalDataException(tr("Version ''{0}'' of meta data for note layer is not supported. Expected: 0.1", version)); 36 29 } 37 try {38 XPathFactory xPathFactory = XPathFactory.newInstance();39 XPath xpath = xPathFactory.newXPath();40 XPathExpression fileExp = xpath.compile("file/text()");41 String fileStr = (String) fileExp.evaluate(elem, XPathConstants.STRING);42 if (Utils.isEmpty(fileStr)) {43 throw new IllegalDataException(tr("File name expected for layer no. {0}", support.getLayerIndex()));44 }45 30 46 NoteImporter importer = new NoteImporter(); 47 try (InputStream in = support.getInputStream(fileStr)) { 48 return importer.loadLayer(in, support.getFile(fileStr), support.getLayerName(), progressMonitor); 49 } 50 } catch (XPathExpressionException | SAXException e) { 31 String fileStr = OsmDataSessionImporter.extractFileName(elem, support); 32 33 NoteImporter importer = new NoteImporter(); 34 try (InputStream in = support.getInputStream(fileStr)) { 35 return importer.loadLayer(in, support.getFile(fileStr), support.getLayerName(), progressMonitor); 36 } catch (SAXException e) { 51 37 throw new IllegalDataException(e); 52 38 } 53 39 } -
src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java
22 22 import org.openstreetmap.josm.io.IllegalDataException; 23 23 import org.openstreetmap.josm.io.session.SessionReader.ImportSupport; 24 24 import org.openstreetmap.josm.tools.Utils; 25 import org.w3c.dom.Attr; 25 26 import org.w3c.dom.Element; 27 import org.w3c.dom.Node; 28 import org.w3c.dom.NodeList; 26 29 27 30 /** 28 31 * Session importer for {@link OsmDataLayer}. … … 30 33 */ 31 34 public class OsmDataSessionImporter implements SessionLayerImporter { 32 35 36 private static Attr x2; 37 33 38 @Override 34 39 public Layer load(Element elem, ImportSupport support, ProgressMonitor progressMonitor) throws IOException, IllegalDataException { 35 40 checkMetaVersion(elem); … … 67 72 */ 68 73 public static String extractFileName(Element elem, ImportSupport support) throws IllegalDataException { 69 74 try { 75 // see #23427: try first to avoid possibly very slow XPath call 76 NodeList x = elem.getElementsByTagName("file"); 77 if (x.getLength() > 0 && x.item(0).getNodeType() == Node.ELEMENT_NODE) { 78 String fileStr = x.item(0).getTextContent(); 79 if (!Utils.isEmpty(fileStr)) 80 return fileStr; 81 } 70 82 XPathFactory xPathFactory = XPathFactory.newInstance(); 71 83 XPath xpath = xPathFactory.newXPath(); 72 84 XPathExpression fileExp = xpath.compile("file/text()");
