Changeset 32859 in osm for applications


Ignore:
Timestamp:
2016-08-21T15:04:46+02:00 (8 years ago)
Author:
donvip
Message:

fix #josm10132 - IndexOutOfBoundsException while reading PBF without metadata (based on patch by Gerd Petermann) + add unit tests, checkstyle, sonar fixes

Location:
applications/editors/josm/plugins/pbf
Files:
16 added
9 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/pbf/.classpath

    r32680 r32859  
    33        <classpathentry kind="src" path="gen"/>
    44        <classpathentry excluding="crosby/binary/test/" kind="src" path="src"/>
     5        <classpathentry kind="src" path="test/unit"/>
    56        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
    67        <classpathentry combineaccessrules="false" kind="src" path="/JOSM"/>
     8        <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
    79        <classpathentry kind="output" path="build"/>
    810</classpath>
  • applications/editors/josm/plugins/pbf/.project

    r32286 r32859  
    1616                        </arguments>
    1717                </buildCommand>
     18                <buildCommand>
     19                        <name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
     20                        <arguments>
     21                        </arguments>
     22                </buildCommand>
    1823        </buildSpec>
    1924        <natures>
    2025                <nature>org.sonar.ide.eclipse.core.sonarNature</nature>
    2126                <nature>org.eclipse.jdt.core.javanature</nature>
     27                <nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
    2228        </natures>
    2329</projectDescription>
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/PbfConstants.java

    r30341 r32859  
    77
    88/**
    9  *
     9 * PBF constants.
    1010 * @author Don-vip
    11  *
    1211 */
    1312public interface PbfConstants {
    14    
     13
    1514    /**
    1615     * File extension.
    1716     */
    18     public static final String EXTENSION = "osm.pbf";
    19    
     17    String EXTENSION = "osm.pbf";
     18
    2019    /**
    2120     * File filter used in import/export dialogs.
    2221     */
    23     public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(EXTENSION, EXTENSION, tr("OSM Server Files pbf compressed") + " (*."+EXTENSION+")");
     22    ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(EXTENSION, EXTENSION,
     23            tr("OSM Server Files pbf compressed") + " (*."+EXTENSION+")");
    2424}
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/action/DownloadPbfTask.java

    r30341 r32859  
    1313import org.openstreetmap.josm.plugins.pbf.io.PbfServerReader;
    1414
     15/**
     16 * Task allowing to download remote PBF files.
     17 */
    1518public class DownloadPbfTask extends DownloadOsmTask implements PbfConstants {
    1619
    17         @Override
    18         public Future<?> download(boolean newLayer, Bounds downloadArea,
    19                         ProgressMonitor progressMonitor) {
    20                 return null;
    21         }
     20    @Override
     21    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
     22        return null;
     23    }
    2224
    23         @Override
    24         public Future<?> loadUrl(boolean newLayer, String url,
    25                         ProgressMonitor progressMonitor) {
    26         downloadTask = new DownloadTask(newLayer,
    27                 new PbfServerReader(url), progressMonitor);
     25    @Override
     26    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
     27        downloadTask = new DownloadTask(newLayer, new PbfServerReader(url), progressMonitor);
    2828        // We need submit instead of execute so we can wait for it to finish and get the error
    2929        // message if necessary. If no one calls getErrorMessage() it just behaves like execute.
    3030        return Main.worker.submit(downloadTask);
    31         }
     31    }
    3232
    3333    @Override
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfExporter.java

    r30659 r32859  
    33
    44import java.io.File;
    5 import java.io.FileNotFoundException;
    65import java.io.FileOutputStream;
    76import java.io.IOException;
     
    1312
    1413/**
     14 * Exports data to a .pbf file.
    1515 * @author Don-vip
    16  *
    1716 */
    1817public class PbfExporter extends OsmExporter {
    1918
     19    /**
     20     * Constructs a new {@code PbfExporter}.
     21     */
    2022    public PbfExporter() {
    2123        super(PbfConstants.FILE_FILTER);
     
    2325
    2426    @Override
    25     protected void doSave(File file, OsmDataLayer layer) throws IOException, FileNotFoundException {
     27    protected void doSave(File file, OsmDataLayer layer) throws IOException {
    2628        try (
    2729            OutputStream out = new FileOutputStream(file);
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfImporter.java

    r30495 r32859  
    88import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    99import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     10import org.openstreetmap.josm.io.CachedFile;
    1011import org.openstreetmap.josm.io.IllegalDataException;
    11 import org.openstreetmap.josm.io.CachedFile;
    1212import org.openstreetmap.josm.io.OsmImporter;
    1313import org.openstreetmap.josm.plugins.pbf.PbfConstants;
    14 import org.xml.sax.SAXException;
    1514
    1615/**
     16 * Imports data from a .pbf file.
    1717 * @author Don-vip
    18  *
    1918 */
    2019public class PbfImporter extends OsmImporter {
    2120
     21    /**
     22     * Constructs a new {@code PbfImporter}.
     23     */
    2224    public PbfImporter() {
    2325        super(PbfConstants.FILE_FILTER);
    2426    }
    2527
    26         @Override
    27         protected DataSet parseDataSet(InputStream in, ProgressMonitor progressMonitor) throws IllegalDataException {
    28                 return PbfReader.parseDataSet(in, progressMonitor);
    29         }
     28    @Override
     29    protected DataSet parseDataSet(InputStream in, ProgressMonitor progressMonitor) throws IllegalDataException {
     30        return PbfReader.parseDataSet(in, progressMonitor);
     31    }
    3032
    31         protected DataSet parseDataSet(final String source) throws IOException, SAXException, IllegalDataException {
    32         return parseDataSet(new CachedFile(source).getInputStream(), NullProgressMonitor.INSTANCE);
    33         }
     33    protected DataSet parseDataSet(final String source) throws IOException, IllegalDataException {
     34        try (CachedFile cf = new CachedFile(source)) {
     35            return parseDataSet(cf.getInputStream(), NullProgressMonitor.INSTANCE);
     36        }
     37    }
    3438}
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfReader.java

    r32128 r32859  
    1919import org.openstreetmap.josm.data.osm.DataSet;
    2020import org.openstreetmap.josm.data.osm.Node;
     21import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2122import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    2223import org.openstreetmap.josm.data.osm.Relation;
     
    3233import crosby.binary.BinaryParser;
    3334import crosby.binary.Osmformat;
     35import crosby.binary.Osmformat.DenseInfo;
    3436import crosby.binary.Osmformat.DenseNodes;
    3537import crosby.binary.Osmformat.HeaderBBox;
    3638import crosby.binary.Osmformat.HeaderBlock;
    3739import crosby.binary.Osmformat.Info;
     40import crosby.binary.Osmformat.Relation.MemberType;
    3841import crosby.binary.file.BlockInputStream;
    3942import crosby.binary.file.FileBlockPosition;
    4043
    4144/**
     45 * OSM reader for the PBF file format.
    4246 * @author Don-vip
    43  *
    4447 */
    4548public class PbfReader extends AbstractReader {
    46    
     49
    4750    protected class PbfParser extends BinaryParser {
    4851
    49         public IllegalDataException exception = null;
    50        
     52        private IllegalDataException exception = null;
     53        private boolean discourageUpload;
    5154        private double parseRawDegrees(long raw) {
    5255            return raw * .000000001;
    5356        }
    54        
     57
    5558        @Override
    5659        protected void parse(HeaderBlock header) {
    57            
     60
    5861            for (String requiredFeature : header.getRequiredFeaturesList()) {
    5962                switch (requiredFeature) {
     
    6770                }
    6871            }
    69            
     72
    7073            HeaderBBox bbox = header.getBbox();
    7174            if (bbox != null) {
     
    7578                double maxlon = parseRawDegrees(bbox.getRight());
    7679                Bounds b = new Bounds(minlat, minlon, maxlat, maxlon);
    77                 if (!b.isCollapsed() && LatLon.isValidLat(minlat) && LatLon.isValidLat(maxlat)
    78                                      && LatLon.isValidLon(minlon) && LatLon.isValidLon(maxlon)) {
     80                if (!b.isCollapsed() && areCoordinatesValid(minlat, minlon, maxlat, maxlon)) {
    7981                    ds.dataSources.add(new DataSource(b, header.getSource()));
    8082                } else {
     
    8486        }
    8587
     88        private boolean areCoordinatesValid(double minlat, double minlon, double maxlat, double maxlon) {
     89            return LatLon.isValidLat(minlat) && LatLon.isValidLat(maxlat)
     90                && LatLon.isValidLon(minlon) && LatLon.isValidLon(maxlon);
     91        }
     92
     93        private void setMetadata(OsmPrimitive osm, Info info) throws IllegalDataException {
     94            if (info.hasChangeset()) {
     95                checkChangesetId(info.getChangeset());
     96                osm.setChangesetId((int) info.getChangeset());
     97            }
     98            if (info.hasUid() && info.hasUserSid()) {
     99                osm.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
     100            }
     101            if (info.hasTimestamp()) {
     102                checkTimestamp(info.getTimestamp());
     103                osm.setTimestamp(getDate(info));
     104            }
     105        }
     106
    86107        @Override
    87108        public boolean skipBlock(FileBlockPosition block) {
    88109            return exception != null;
    89110        }
    90        
     111
    91112        protected void checkCoordinates(LatLon coor) throws IllegalDataException {
    92113            if (!coor.isValid()) {
     
    100121            }
    101122        }
    102        
     123
    103124        protected void checkTimestamp(long timestamp) throws IllegalDataException {
    104125            if (timestamp < 0) {
     
    109130        @Override
    110131        protected void parseDense(DenseNodes nodes) {
     132            if (!nodes.hasDenseinfo())
     133                discourageUpload = true;
    111134            if (exception == null) {
    112135                try {
     
    122145                    for (int i = 0; i < nodes.getIdCount(); i++) {
    123146                        // Id (delta) and version (normal)
    124                         Node node = new Node(nodeId+=nodes.getId(i), nodes.getDenseinfo().getVersion(i));
     147                        Node node = new Node(nodeId += nodes.getId(i), nodes.hasDenseinfo() ? nodes.getDenseinfo().getVersion(i) : 1);
    125148                        // Lat/Lon (delta)
    126                         node.setCoor(new LatLon(parseLat(nodeLat+=nodes.getLat(i)), parseLon(nodeLon+=nodes.getLon(i))).getRoundedToOsmPrecision());
     149                        node.setCoor(new LatLon(parseLat(nodeLat += nodes.getLat(i)),
     150                                                parseLon(nodeLon += nodes.getLon(i))).getRoundedToOsmPrecision());
    127151                        checkCoordinates(node.getCoor());
    128                         // Changeset (delta)
    129                         checkChangesetId(changesetId+=nodes.getDenseinfo().getChangeset(i));
    130                         node.setChangesetId((int) changesetId);
    131                         // User (delta)
    132                         node.setUser(User.createOsmUser(uid+=nodes.getDenseinfo().getUid(i), getStringById(suid+=nodes.getDenseinfo().getUserSid(i))));
    133                         // Timestamp (delta)
    134                         checkTimestamp(timestamp+=nodes.getDenseinfo().getTimestamp(i));
    135                         node.setTimestamp(new Date(date_granularity * timestamp));
     152                        if (nodes.hasDenseinfo()) {
     153                            DenseInfo info = nodes.getDenseinfo();
     154                            // Changeset (delta)
     155                            if (info.getChangesetCount() > i) {
     156                                checkChangesetId(changesetId += info.getChangeset(i));
     157                                node.setChangesetId((int) changesetId);
     158                            }
     159                            // User (delta)
     160                            if (info.getUidCount() > i && info.getUserSidCount() > i) {
     161                                node.setUser(User.createOsmUser(uid += info.getUid(i),
     162                                                 getStringById(suid += info.getUserSid(i))));
     163                            }
     164                            // Timestamp (delta)
     165                            if (info.getTimestampCount() > i) {
     166                                checkTimestamp(timestamp += info.getTimestamp(i));
     167                                node.setTimestamp(new Date(date_granularity * timestamp));
     168                            }
     169                        }
    136170                        // A single table contains all keys/values of all nodes.
    137171                        // Each node's tags are encoded in alternating <key_id> <value_id>.
     
    139173                        Map<String, String> keys = new HashMap<>();
    140174                        while (keyIndex < nodes.getKeysValsCount()) {
    141                             int key_id = nodes.getKeysVals(keyIndex++);
    142                             if (key_id == 0) {
     175                            int keyId = nodes.getKeysVals(keyIndex++);
     176                            if (keyId == 0) {
    143177                                break; // End of current node's tags
    144178                            } else if (keyIndex < nodes.getKeysValsCount()) {
    145                                 int value_id = nodes.getKeysVals(keyIndex++);
    146                                 keys.put(getStringById(key_id), getStringById(value_id));
     179                                keys.put(getStringById(keyId), getStringById(nodes.getKeysVals(keyIndex++)));
    147180                            } else {
    148181                                throw new IllegalDataException(tr("Invalid DenseNodes key/values table"));
     
    163196                try {
    164197                    for (Osmformat.Node n : osmNodes) {
    165                         final Info info = n.getInfo();
    166                         final Node node = new Node(n.getId(), info.getVersion());
     198                        final Info info = n.getInfo();
     199                        if (!info.hasVersion())
     200                            discourageUpload = true;
     201                        final Node node = new Node(n.getId(), info.hasVersion() ? info.getVersion() : 1);
    167202                        node.setCoor(new LatLon(parseLat(n.getLat()), parseLon(n.getLon())).getRoundedToOsmPrecision());
    168203                        checkCoordinates(node.getCoor());
    169                         checkChangesetId(info.getChangeset());
    170                         node.setChangesetId((int) info.getChangeset());
    171                         node.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
    172                         checkTimestamp(info.getTimestamp());
    173                         node.setTimestamp(getDate(info));
     204                        setMetadata(node, info);
    174205                        Map<String, String> keys = new HashMap<>();
    175                         for (int i=0; i<n.getKeysCount(); i++) {
     206                        for (int i = 0; i < n.getKeysCount(); i++) {
    176207                            keys.put(getStringById(n.getKeys(i)), getStringById(n.getVals(i)));
    177208                        }
     
    184215            }
    185216        }
    186        
     217
    187218        @Override
    188219        protected void parseWays(List<Osmformat.Way> osmWays) {
     
    190221                try {
    191222                    for (Osmformat.Way w : osmWays) {
    192                         final Info info = w.getInfo();
    193                         final Way way = new Way(w.getId(), info.getVersion());
    194                         checkChangesetId(info.getChangeset());
    195                         way.setChangesetId((int) info.getChangeset());
    196                         way.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
    197                         checkTimestamp(info.getTimestamp());
    198                         way.setTimestamp(getDate(info));
     223                        final Info info = w.getInfo();
     224                        if (!info.hasVersion())
     225                            discourageUpload = true;
     226                        final Way way = new Way(w.getId(), info.hasVersion() ? info.getVersion() : 1);
     227                        setMetadata(way, info);
    199228                        Map<String, String> keys = new HashMap<>();
    200                         for (int i=0; i<w.getKeysCount(); i++) {
     229                        for (int i = 0; i < w.getKeysCount(); i++) {
    201230                            keys.put(getStringById(w.getKeys(i)), getStringById(w.getVals(i)));
    202231                        }
     
    205234                        Collection<Long> nodeIds = new ArrayList<>();
    206235                        for (Long id : w.getRefsList()) {
    207                             nodeIds.add(previousId+=id);
     236                            nodeIds.add(previousId += id);
    208237                        }
    209238                        ways.put(way.getUniqueId(), nodeIds);
     
    215244            }
    216245        }
    217        
     246
    218247        @Override
    219248        protected void parseRelations(List<Osmformat.Relation> osmRels) {
     
    221250                try {
    222251                    for (Osmformat.Relation r : osmRels) {
    223                         final Info info = r.getInfo();
    224                         final Relation rel = new Relation(r.getId(), info.getVersion());
    225                         checkChangesetId(info.getChangeset());
    226                         rel.setChangesetId((int) info.getChangeset());
    227                         rel.setUser(User.createOsmUser(info.getUid(), getStringById(info.getUserSid())));
    228                         checkTimestamp(info.getTimestamp());
    229                         rel.setTimestamp(getDate(info));
     252                        final Info info = r.getInfo();
     253                        if (!info.hasVersion())
     254                            discourageUpload = true;
     255                        final Relation rel = new Relation(r.getId(), info.hasVersion() ? info.getVersion() : 1);
     256                        setMetadata(rel, info);
    230257                        Map<String, String> keys = new HashMap<>();
    231                         for (int i=0; i<r.getKeysCount(); i++) {
     258                        for (int i = 0; i < r.getKeysCount(); i++) {
    232259                            keys.put(getStringById(r.getKeys(i)), getStringById(r.getVals(i)));
    233260                        }
     
    235262                        long previousId = 0; // Member ids are delta coded
    236263                        Collection<RelationMemberData> members = new ArrayList<>();
    237                         for (int i = 0; i<r.getMemidsCount(); i++) {
    238                             long id = previousId+=r.getMemids(i);
    239                             String role = getStringById(r.getRolesSid(i));
    240                             OsmPrimitiveType type = null;
    241                             switch (r.getTypes(i)) {
    242                                 case NODE:
    243                                     type = OsmPrimitiveType.NODE;
    244                                     break;
    245                                 case WAY:
    246                                     type = OsmPrimitiveType.WAY;
    247                                     break;
    248                                 case RELATION:
    249                                     type = OsmPrimitiveType.RELATION;
    250                                     break;
    251                             }
    252                             members.add(new RelationMemberData(role, type, id));
     264                        for (int i = 0; i < r.getMemidsCount(); i++) {
     265                            members.add(new RelationMemberData(
     266                                    getStringById(r.getRolesSid(i)),
     267                                    mapOsmType(r.getTypes(i)),
     268                                    previousId += r.getMemids(i)));
    253269                        }
    254270                        relations.put(rel.getUniqueId(), members);
     
    259275                }
    260276            }
     277            if (discourageUpload)
     278                ds.setUploadDiscouraged(true);
     279        }
     280
     281        private OsmPrimitiveType mapOsmType(MemberType type) {
     282            switch (type) {
     283            case NODE:
     284                return OsmPrimitiveType.NODE;
     285            case WAY:
     286                return OsmPrimitiveType.WAY;
     287            case RELATION:
     288                return OsmPrimitiveType.RELATION;
     289            default:
     290                return null;
     291            }
    261292        }
    262293
    263294        @Override
    264295        public void complete() {
     296            if (discourageUpload)
     297                ds.setUploadDiscouraged(true);
    265298        }
    266299    }
    267300
    268301    private PbfParser parser = new PbfParser();
    269    
     302
    270303    /**
    271304     * Parse the given input source and return the dataset.
     
    279312     */
    280313    public static DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException {
    281         if (progressMonitor == null) {
    282             progressMonitor = NullProgressMonitor.INSTANCE;
    283         }
     314        ProgressMonitor monitor = progressMonitor == null ? NullProgressMonitor.INSTANCE : progressMonitor;
    284315        CheckParameterUtil.ensureParameterNotNull(source, "source");
    285316
    286317        PbfReader reader = new PbfReader();
    287        
     318
    288319        try {
    289             progressMonitor.beginTask(tr("Prepare OSM data...", 2));
    290             progressMonitor.indeterminateSubTask(tr("Reading OSM data..."));
     320            monitor.beginTask(tr("Prepare OSM data...", 2));
     321            monitor.indeterminateSubTask(tr("Reading OSM data..."));
    291322
    292323            reader.parse(source);
    293             progressMonitor.worked(1);
    294 
    295             progressMonitor.indeterminateSubTask(tr("Preparing data set..."));
     324            monitor.worked(1);
     325
     326            monitor.indeterminateSubTask(tr("Preparing data set..."));
    296327            reader.prepareDataSet();
    297             progressMonitor.worked(1);
     328            monitor.worked(1);
    298329            return reader.getDataSet();
    299330        } catch (IllegalDataException e) {
     
    302333            throw new IllegalDataException(e);
    303334        } finally {
    304             progressMonitor.finishTask();
     335            monitor.finishTask();
    305336        }
    306337    }
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfServerReader.java

    r30341 r32859  
    99import org.openstreetmap.josm.io.OsmTransferException;
    1010
     11/**
     12 * This DataReader reads PBF directly from an URL.
     13 */
    1114public class PbfServerReader extends OsmServerReader {
    1215
    13         private String url;
    14        
    15         public PbfServerReader(String url) {
    16                 this.url = url;
    17         }
     16    private String url;
    1817
    19         @Override
    20         public DataSet parseOsm(ProgressMonitor progressMonitor)
    21                         throws OsmTransferException {
     18    /**
     19     * Constructs a new {@code PbfServerReader}.
     20     * @param url source URL
     21     */
     22    public PbfServerReader(String url) {
     23        this.url = url;
     24    }
     25
     26    @Override
     27    public DataSet parseOsm(ProgressMonitor progressMonitor)
     28            throws OsmTransferException {
    2229        try {
    2330            progressMonitor.beginTask(tr("Contacting Server...", 10));
     
    2835            progressMonitor.finishTask();
    2936        }
    30         }
     37    }
    3138}
  • applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfWriter.java

    r30737 r32859  
    2929import crosby.binary.file.FileBlock;
    3030
     31/**
     32 * OSM writer for the PBF file format.
     33 * @author Don-vip
     34 */
    3135public class PbfWriter implements Closeable {
    3236
    3337    private final PbfSerializer out;
    3438
     39    /**
     40     * Constructs a new {@code PbfWriter}.
     41     * @param out output stream
     42     */
    3543    public PbfWriter(OutputStream out) {
    3644        this.out = new PbfSerializer(new BlockOutputStream(out));
     
    4250        /** Additional configuration flag for whether to serialize into DenseNodes/DenseInfo? */
    4351        protected boolean useDense = true;
    44        
     52
    4553        /** Has the header been written yet? */
    4654        protected boolean headerWritten = false;
     
    4856        /**
    4957         * Constructs a new {@code PbfSerializer}.
    50          * 
     58         *
    5159         * @param output The PBF block stream to send serialized data
    5260         */
     
    5765        /**
    5866         * Change the flag of whether to use the dense format.
    59          * 
     67         *
    6068         * @param useDense The new use dense value.
    6169         */
     
    7381            /**
    7482             * Add to the queue.
    75              * 
     83             *
    7684             * @param item The entity to add
    7785             */
     
    101109                }
    102110
    103                 long lasttimestamp = 0, lastchangeset = 0;
    104                 int lastuserSid = 0, lastuid = 0;
     111                long lasttimestamp = 0;
     112                long lastchangeset = 0;
     113                int lastuserSid = 0;
     114                int lastuid = 0;
    105115                StringTable stable = getStringTable();
    106116                for (OsmPrimitive e : entities) {
    107117
    108                     int uid =  e.getUser() == null ? -1 : (int) e.getUser().getId();
     118                    int uid = e.getUser() == null ? -1 : (int) e.getUser().getId();
    109119                    int userSid = stable.getIndex(e.getUser() == null ? "" : e.getUser().getName());
    110120                    int timestamp = (int) (e.getTimestamp().getTime() / date_granularity);
     
    139149            }
    140150        }
    141        
     151
    142152        private class NodeGroup extends Prim<Node> implements PrimGroupWriterInterface {
    143153
     154            @Override
    144155            public Osmformat.PrimitiveGroup serialize() {
    145156                if (useDense) {
     
    154165             */
    155166            public Osmformat.PrimitiveGroup serializeDense() {
    156                 if (contents.size() == 0) {
     167                if (contents.isEmpty()) {
    157168                    return null;
    158169                }
     
    160171                StringTable stable = getStringTable();
    161172
    162                 long lastlat = 0, lastlon = 0, lastid = 0;
     173                long lastlat = 0;
     174                long lastlon = 0;
     175                long lastid = 0;
    163176                Osmformat.DenseNodes.Builder bi = Osmformat.DenseNodes.newBuilder();
    164177                boolean doesBlockHaveTags = false;
     
    202215            /**
    203216             * Serialize all nodes in the non-dense format.
    204              * 
     217             *
    205218             * @param parentbuilder Add to this PrimitiveBlock.
    206219             */
    207220            public Osmformat.PrimitiveGroup serializeNonDense() {
    208                 if (contents.size() == 0) {
     221                if (contents.isEmpty()) {
    209222                    return null;
    210223                }
     
    235248        private class WayGroup extends Prim<Way> implements
    236249                PrimGroupWriterInterface {
     250            @Override
    237251            public Osmformat.PrimitiveGroup serialize() {
    238                 if (contents.size() == 0) {
     252                if (contents.isEmpty()) {
    239253                    return null;
    240254                }
     
    265279
    266280        private class RelationGroup extends Prim<Relation> implements PrimGroupWriterInterface {
     281            @Override
    267282            public void addStringsToStringtable() {
    268283                StringTable stable = getStringTable();
     
    275290            }
    276291
     292            @Override
    277293            public Osmformat.PrimitiveGroup serialize() {
    278                 if (contents.size() == 0) {
     294                if (contents.isEmpty()) {
    279295                    return null;
    280296                }
     
    299315                            bi.addTypes(MemberType.RELATION);
    300316                        } else {
    301                             assert (false); // Software bug: Unknown entity.
     317                            assert false; // Software bug: Unknown entity.
    302318                        }
    303319                        bi.addRolesSid(stable.getIndex(j.getRole()));
     
    321337        private NodeGroup nodes;
    322338        private RelationGroup relations;
    323        
     339
    324340        private Processor processor = new Processor();
    325341
     
    350366            }
    351367
     368            /**
     369             * Process node.
     370             * @param node node
     371             */
    352372            public void processNode(Node node) {
    353373                if (nodes == null) {
     
    362382            }
    363383
     384            /**
     385             * Process way.
     386             * @param way way
     387             */
    364388            public void processWay(Way way) {
    365389                if (ways == null) {
     
    372396            }
    373397
     398            /**
     399             * Process relation.
     400             * @param relation relation
     401             */
    374402            public void processRelation(Relation relation) {
    375403                if (relations == null) {
     
    404432        public void processBounds(DataSource entity) {
    405433            Osmformat.HeaderBlock.Builder headerblock = Osmformat.HeaderBlock.newBuilder();
    406            
     434
    407435            Osmformat.HeaderBBox.Builder bbox = Osmformat.HeaderBBox.newBuilder();
    408436            bbox.setLeft(mapRawDegrees(entity.bounds.getMinLon()));
     
    429457        /**
    430458         * Write the header fields that are always needed.
    431          * 
     459         *
    432460         * @param headerblock Incomplete builder to complete and write.
    433461         * */
     
    446474            headerWritten = true;
    447475        }
    448        
     476
    449477        public void process(DataSet ds) {
    450478            processor.processSources(ds.dataSources);
     
    471499    }
    472500
     501    /**
     502     * Writes data to an OSM data layer.
     503     * @param layer data layer
     504     */
    473505    public void writeLayer(OsmDataLayer layer) {
    474506        writeData(layer.data);
    475507    }
    476508
     509    /**
     510     * Writes data to a dataset.
     511     * @param ds dataset
     512     */
    477513    public void writeData(DataSet ds) {
    478514        out.process(ds);
Note: See TracChangeset for help on using the changeset viewer.