Ignore:
Timestamp:
2012-03-10T16:18:51+01:00 (13 years ago)
Author:
donvip
Message:

opendata: enhanced international support, fix Neptune import

Location:
applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata
Files:
24 added
5 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/OdPlugin.java

    r28018 r28031  
    4545        private static OdPlugin instance;
    4646       
     47        public final XmlImporter xmlImporter;
     48       
    4749        public OdPlugin(PluginInformation info) { // NO_UCD
    4850                super(info);
     
    5759                                new KmlKmzImporter(), new ShpImporter(), new MifTabImporter(), // Geographic file formats
    5860                                new ZipImporter(), // Archive containing any of the others
    59                                 new XmlImporter() // Generic importer for XML files (currently used for Neptune files)
     61                                xmlImporter = new XmlImporter() // Generic importer for XML files (currently used for Neptune files)
    6062                })) {
    6163                        ExtensionFileFilter.importers.add(0, importer);
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/fr/FrenchDataSetHandler.java

    r28022 r28031  
    1818import static org.openstreetmap.josm.plugins.opendata.core.io.LambertCC9ZonesProjectionPatterns.lambertCC9Zones;
    1919
    20 import java.io.File;
    21 import java.io.IOException;
    2220import java.net.MalformedURLException;
    2321import java.net.URL;
     
    2624import java.util.regex.Matcher;
    2725import java.util.regex.Pattern;
    28 
    29 import javax.xml.XMLConstants;
    30 import javax.xml.transform.Source;
    31 import javax.xml.transform.stream.StreamSource;
    32 import javax.xml.validation.Schema;
    33 import javax.xml.validation.SchemaFactory;
    34 import javax.xml.validation.Validator;
    3526
    3627import org.geotools.referencing.CRS;
     
    4738import org.openstreetmap.josm.data.projection.UTM.Hemisphere;
    4839import org.openstreetmap.josm.plugins.opendata.core.datasets.SimpleDataSetHandler;
    49 import org.xml.sax.SAXException;
    5040
    5141public abstract class FrenchDataSetHandler extends SimpleDataSetHandler implements FrenchConstants {
     
    283273                }
    284274        }
    285        
    286         protected URL getNeptuneSchema() {
    287                 return FrenchDataSetHandler.class.getResource(NEPTUNE_XSD);
    288         }
    289 
    290         public final boolean acceptsXmlNeptuneFile(File file) {
    291                
    292                 Source xmlFile = new StreamSource(file);
    293                
    294                 try {
    295                         SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    296                         Schema schema = schemaFactory.newSchema(getNeptuneSchema());
    297                         Validator validator = schema.newValidator();
    298                         validator.validate(xmlFile);
    299                         System.out.println(xmlFile.getSystemId() + " is valid");
    300                         return true;
    301                 } catch (SAXException e) {
    302                         System.out.println(xmlFile.getSystemId() + " is NOT valid");
    303                         System.out.println("Reason: " + e.getLocalizedMessage());
    304                 } catch (IOException e) {
    305                         System.out.println(xmlFile.getSystemId() + " is NOT valid");
    306                         System.out.println("Reason: " + e.getLocalizedMessage());
    307                 }
    308                
    309                 return false;
    310         }
    311275}
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/NeptuneReader.java

    r28022 r28031  
    1616package org.openstreetmap.josm.plugins.opendata.core.io;
    1717
     18import java.io.File;
     19import java.io.IOException;
    1820import java.io.InputStream;
     21import java.net.URL;
     22import java.util.ArrayList;
    1923import java.util.HashMap;
    2024import java.util.List;
    2125import java.util.Map;
    2226
     27import javax.xml.XMLConstants;
    2328import javax.xml.bind.JAXBContext;
    2429import javax.xml.bind.JAXBElement;
    2530import javax.xml.bind.JAXBException;
    2631import javax.xml.bind.Unmarshaller;
     32import javax.xml.transform.Source;
     33import javax.xml.transform.stream.StreamSource;
     34import javax.xml.validation.Schema;
     35import javax.xml.validation.SchemaFactory;
     36import javax.xml.validation.Validator;
    2737
    2838import neptune.ChouetteAreaType;
     
    5060import org.openstreetmap.josm.io.AbstractReader;
    5161import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
     62import org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchConstants;
     63import org.xml.sax.SAXException;
    5264
    5365/**
     
    5567 * See http://www.chouette.mobi/IMG/pdf/NF__F_-Neptune-maj.pdf
    5668 */
    57 public class NeptuneReader extends AbstractReader {
     69public class NeptuneReader extends AbstractReader implements FrenchConstants {
    5870
    5971        public static final String OSM_PUBLIC_TRANSPORT = "public_transport";
     
    7688        public static final String OSM_FERRY = "ferry";
    7789
     90        private static final List<URL> schemas = new ArrayList<URL>();
     91        static {
     92                schemas.add(NeptuneReader.class.getResource(NEPTUNE_XSD));
     93        }
     94       
    7895        private ChouettePTNetworkType root;
    7996       
    8097        private final Map<String, OsmPrimitive> tridentObjects = new HashMap<String, OsmPrimitive>();
     98       
     99        public static final boolean acceptsXmlNeptuneFile(File file) {
     100                return acceptsXmlNeptuneFile(file, null);
     101        }
     102
     103        public static final boolean acceptsXmlNeptuneFile(File file, URL schemaURL) {
     104               
     105                if (schemaURL == null) {
     106                        schemaURL = schemas.get(0);
     107                }
     108               
     109                Source xmlFile = new StreamSource(file);
     110               
     111                try {
     112                        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
     113                        Schema schema = schemaFactory.newSchema(schemaURL);
     114                        Validator validator = schema.newValidator();
     115                        validator.validate(xmlFile);
     116                        System.out.println(xmlFile.getSystemId() + " is valid");
     117                        return true;
     118                } catch (SAXException e) {
     119                        System.out.println(xmlFile.getSystemId() + " is NOT valid");
     120                        System.out.println("Reason: " + e.getLocalizedMessage());
     121                } catch (IOException e) {
     122                        System.out.println(xmlFile.getSystemId() + " is NOT valid");
     123                        System.out.println("Reason: " + e.getLocalizedMessage());
     124                }
     125               
     126                return false;
     127        }
    81128       
    82129        public static DataSet parseDataSet(InputStream in, AbstractDataSetHandler handler, ProgressMonitor instance) throws JAXBException {
     
    102149                Node n = new Node(latlon);
    103150                ds.addPrimitive(n);
     151                return n;
     152        }
     153       
     154        private Node createPlatform(StopPointType stop) {
     155                Node n = createNode(createLatLon(stop));
     156                n.put(OSM_PUBLIC_TRANSPORT, OSM_PLATFORM);
     157                linkTridentObjectToOsmPrimitive(stop, n);
     158                n.put("name", stop.getName());
    104159                return n;
    105160        }
     
    223278                                                                for (String grandchildId : child.getContains()) {
    224279                                                                        if (grandchildId.contains("StopPoint")) {
    225                                                                                 // TODO
    226280                                                                                StopPoint grandchild = findStopPoint(grandchildId);
    227281                                                                                if (grandchild == null) {
     
    229283                                                                                } else {
    230284                                                                                        if (grandchild.getLongLatType().equals(LongLatTypeType.WGS_84)) {
    231                                                                                                 Node stop = createStopPosition(grandchild);
    232                                                                                                 stopArea.addMember(new RelationMember(OSM_STOP, stop));
     285                                                                                                Node platform = createPlatform(grandchild);
     286                                                                                                stopArea.addMember(new RelationMember(OSM_PLATFORM, platform));
    233287                                                                                        } else {
    234288                                                                                                System.err.println("Unsupported long/lat type: "+grandchild.getLongLatType());
     
    248302                                                                        for (RelationMember member : stopArea.getMembers()) {
    249303                                                                                // Fix stop coordinates if needed
    250                                                                                 if (member.getRole().equals(OSM_STOP) && isNullLatLon(member.getNode().getCoor())) {
     304                                                                                if (member.getRole().equals(OSM_PLATFORM) && isNullLatLon(member.getNode().getCoor())) {
    251305                                                                                        member.getNode().setCoor(createLatLon(areaCentroid));
    252306                                                                                }
     
    295349                                        if (start == null) {
    296350                                                System.err.println("Cannot find start StopPoint: "+ptlink.getStartOfLink());
    297                                         } else {
     351                                        } else if (start.get(OSM_PUBLIC_TRANSPORT).equals(OSM_STOP) || start.get(OSM_PUBLIC_TRANSPORT).equals(OSM_PLATFORM)) {
    298352                                                addStopToRoute(route, start);
    299353                                        }
     
    301355                                        if (end == null) {
    302356                                                System.err.println("Cannot find end StopPoint: "+ptlink.getEndOfLink());
    303                                         } else {
     357                                        } else if (end.get(OSM_PUBLIC_TRANSPORT).equals(OSM_STOP) || end.get(OSM_PUBLIC_TRANSPORT).equals(OSM_PLATFORM)) {
    304358                                                addStopToRoute(route, end);
    305359                                        }
     
    310364                return ds;
    311365        }
    312        
     366               
    313367        private static final boolean addStopToRoute(Relation route, OsmPrimitive stop) {
    314368                if (route.getMembersCount() == 0 || !route.getMember(route.getMembersCount()-1).getMember().equals(stop) ) {
    315                         route.addMember(new RelationMember(OSM_STOP, stop));
     369                        route.addMember(new RelationMember(stop.get(OSM_PUBLIC_TRANSPORT), stop));
    316370                        return true;
    317371                } else {
     
    319373                }
    320374        }
     375
     376        public static List<URL> getSchemas() {
     377                return schemas;
     378        }
     379
     380        public static void registerSchema(URL resource) {
     381                if (resource != null && !schemas.contains(resource)) {
     382                        schemas.add(resource);
     383                }
     384        }
    321385}
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/XmlImporter.java

    r28021 r28031  
    1616package org.openstreetmap.josm.plugins.opendata.core.io;
    1717
     18import java.io.File;
    1819import java.io.InputStream;
     20import java.net.URL;
    1921
    2022import javax.xml.bind.JAXBException;
     
    3032        }
    3133       
     34        /* (non-Javadoc)
     35         * @see org.openstreetmap.josm.io.FileImporter#acceptFile(java.io.File)
     36         */
     37        @Override
     38        public boolean acceptFile(File pathname) {
     39                if (super.acceptFile(pathname)) {
     40                        for (URL schemaURL : NeptuneReader.getSchemas()) {
     41                                if (NeptuneReader.acceptsXmlNeptuneFile(pathname, schemaURL)) {
     42                                        return true;
     43                                }
     44                        }
     45                }
     46                return false;
     47        }
     48
    3249        @Override
    3350        protected DataSet parseDataSet(InputStream in, ProgressMonitor instance)
    3451                        throws IllegalDataException {
    3552                try {
    36                         // TODO: check it is a neptune file
    3753                        return NeptuneReader.parseDataSet(in, handler, instance);
    3854                } catch (JAXBException e) {
  • applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/archive/ZipReader.java

    r28022 r28031  
    3333import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    3434import org.openstreetmap.josm.io.AbstractReader;
     35import org.openstreetmap.josm.plugins.opendata.OdPlugin;
    3536import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
    3637import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
    37 import org.openstreetmap.josm.plugins.opendata.core.datasets.fr.FrenchDataSetHandler;
    3838import org.openstreetmap.josm.plugins.opendata.core.io.NeptuneReader;
    3939import org.openstreetmap.josm.plugins.opendata.core.io.geographic.KmlReader;
     
    146146                                        from = TabReader.parseDataSet(in, file, handler, instance);
    147147                                } else if (file.getName().toLowerCase().endsWith(XML_EXT)) {
    148                                         if (handler instanceof FrenchDataSetHandler && ((FrenchDataSetHandler)handler).acceptsXmlNeptuneFile(file)) {
     148                                        if (OdPlugin.getInstance().xmlImporter.acceptFile(file)) {
    149149                                                from = NeptuneReader.parseDataSet(in, handler, instance);
    150150                                        } else {
Note: See TracChangeset for help on using the changeset viewer.