ngmep.xml.XMLExporter.java Source code

Java tutorial

Introduction

Here is the source code for ngmep.xml.XMLExporter.java

Source

package ngmep.xml;

/*
   ngmep2osm - importador de datos de ngmep a openstreetmap
       
   Copyright (C) 2011-2012 Alberto Fernndez <infjaf@gmail.com>
       
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
       
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
       
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import ngmep.osm.datamodel.Entity;
import ngmep.osm.datamodel.Node;
import ngmep.osm.datamodel.Relation;
import ngmep.osm.datamodel.RelationMember;
import ngmep.osm.datamodel.Way;

import org.apache.commons.lang3.StringEscapeUtils;

public final class XMLExporter {

    private XMLExporter() {
        // No instances
    }

    public static void export(final Entity entity, final OutputStream output) throws IOException {
        final List<Entity> lista = new ArrayList<Entity>();
        lista.add(entity);
        export(lista, output, true);
    }

    public static void export(final List<Entity> list, final OutputStream output, final boolean force)
            throws IOException {

        try (final BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(new BufferedOutputStream(output), "UTF-8"));) {
            writer.write("<?xml version='1.0' encoding='UTF-8'?>\n");
            writer.write("<osm version='0.6' generator='JOSM'>\n");
            for (Entity entity : list) {
                internalExport(entity, writer, force);
            }
            writer.write("</osm>\n");
        }
    }

    private static void internalExport(final Entity entity, final BufferedWriter writer, final boolean force)
            throws IOException {
        if (entity instanceof Node) {
            exportNode((Node) entity, writer, force);
        }
        if (entity instanceof Way) {
            exportWay((Way) entity, writer, force);
        }
        if (entity instanceof Relation) {
            exportRelation((Relation) entity, writer, force);
        }
    }

    private static void exportRelation(final Relation relation, final BufferedWriter writer, final boolean force)
            throws IOException {
        if (!relation.isModified() && !force) {
            return;
        }
        for (RelationMember member : relation.getMembers()) {
            internalExport(member.getEntity(), writer, true);
        }
        final StringBuilder stringRelation = new StringBuilder();
        stringRelation.append("<relation");
        stringRelation.append(" id='").append(relation.getId()).append("'");
        if (relation.isModified()) {
            stringRelation.append(" action='").append("modify").append("'");
        }
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
        stringRelation.append(" timestamp='").append(sdf.format(new Date(relation.getTimestamp()))).append("'");
        if (relation.getUser() != null) {
            stringRelation.append(" uid='").append(relation.getUser().getId()).append("'");
            stringRelation.append(" user='").append(StringEscapeUtils.escapeXml(relation.getUser().getName()))
                    .append("'");
        }
        stringRelation.append(" visible='true'");
        stringRelation.append(" version='").append(relation.getVersion()).append("'");
        stringRelation.append(" changeset='").append(relation.getChangeset()).append("'");
        if (relation.getMembers().size() > 0 || relation.getNumTags() > 0) {
            stringRelation.append(">\n");

            for (RelationMember member : relation.getMembers()) {
                String tipo = "node";
                if (member.getEntity() instanceof Node) {
                    tipo = "node";
                } else if (member.getEntity() instanceof Way) {
                    tipo = "way";
                }
                stringRelation.append("    ");
                stringRelation.append("<member type='").append(tipo).append("'");
                stringRelation.append(" ref='").append(member.getEntity().getId()).append("'");
                stringRelation.append(" role='").append(StringEscapeUtils.escapeXml(member.getRole())).append("'");
                stringRelation.append(" />\n");
            }
            final Set<String> tags = relation.getTagKeys();
            for (String key : tags) {
                stringRelation.append("    ");
                stringRelation.append("<tag");
                stringRelation.append(" k='").append(StringEscapeUtils.escapeXml(key)).append("'");
                stringRelation.append(" v='").append(StringEscapeUtils.escapeXml(relation.getTag(key))).append("'");
                stringRelation.append(" />\n");
            }
            stringRelation.append("</relation>\n");
        } else {
            stringRelation.append("/>\n");
        }
        writer.write(stringRelation.toString());
        /*
         <osm version="0.6" generator="OpenStreetMap server">
        <relation id="347824" visible="true" timestamp="2011-09-11T16:04:29Z" version="2" changeset="9272105" user="afernandez" uid="41263">
        <member type="node" ref="268521663" role="admin_centre"/>
        <member type="way" ref="45320004" role=""/>
        <member type="way" ref="45357913" role=""/>
        <member type="way" ref="45377654" role=""/>
        <member type="way" ref="45382632" role=""/>
        <member type="way" ref="45369688" role=""/>
        <tag k="admin_level" v="8"/>
        <tag k="boundary" v="administrative"/>
        <tag k="idee:name" v="Moratinos"/>
        <tag k="ine:municipio" v="34109"/>
        <tag k="is_in" v="Palencia, Castilla y Len, Spain"/>
        <tag k="is_in:country" v="Spain"/>
        <tag k="is_in:province" v="Palencia"/>
        <tag k="is_in:region" v="Castilla y Len"/>
        <tag k="name" v="Moratinos"/>
        <tag k="source" v="BDLL25, EGRN, Instituto Geogrfico Nacional"/>
        <tag k="type" v="boundary"/>
        <tag k="wikipedia" v="es:Moratinos"/>
        </relation>
            
         */
    }

    private static void exportWay(final Way way, final BufferedWriter writer, final boolean force)
            throws IOException {
        if (!way.isModified() && !force) {
            return;
        }
        for (Node node : way.getNodes()) {
            exportNode(node, writer, true);
        }
        final StringBuilder stringWay = new StringBuilder();
        stringWay.append("  ");
        stringWay.append("<way");
        stringWay.append(" id='").append(way.getId()).append("'");
        if (way.isModified()) {
            stringWay.append(" action='").append("modify").append("'");
        }
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
        stringWay.append(" timestamp='").append(sdf.format(new Date(way.getTimestamp()))).append("'");
        if (way.getUser() != null) {
            stringWay.append(" uid='").append(way.getUser().getId()).append("'");
            stringWay.append(" user='").append(StringEscapeUtils.escapeXml(way.getUser().getName())).append("'");
        }
        stringWay.append(" visible='true'");
        stringWay.append(" version='").append(way.getVersion()).append("'");
        stringWay.append(" changeset='").append(way.getChangeset()).append("'");
        if (way.getNodes().size() > 0 || way.getNumTags() > 0) {
            stringWay.append(">\n");
            for (Node node : way.getNodes()) {
                stringWay.append("    ");
                stringWay.append("<nd");
                stringWay.append(" ref='").append(node.getId()).append("'");
                stringWay.append(" />\n");
            }
            final Set<String> tags = way.getTagKeys();
            for (String key : tags) {
                stringWay.append("    ");
                stringWay.append("<tag");
                stringWay.append(" k='").append(StringEscapeUtils.escapeXml(key)).append("'");
                stringWay.append(" v='").append(StringEscapeUtils.escapeXml(way.getTag(key))).append("'");
                stringWay.append(" />\n");
            }
            stringWay.append("  </way>\n");
        } else {
            stringWay.append("/>\n");
        }
        writer.write(stringWay.toString());

    }

    private static void exportNode(final Node node, final BufferedWriter writer, final boolean force)
            throws IOException {
        if (!node.isModified() && !force) {
            return;
        }
        final StringBuilder nodeString = new StringBuilder();
        nodeString.append("  ");
        nodeString.append("<node");
        nodeString.append(" id='").append(node.getId()).append("'");
        if (node.isModified()) {
            nodeString.append(" action='").append("modify").append("'");
        }
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
        nodeString.append(" timestamp='").append(sdf.format(new Date(node.getTimestamp()))).append("'");
        if (node.getUser() != null) {
            nodeString.append(" uid='").append(node.getUser().getId()).append("'");
            nodeString.append(" user='").append(StringEscapeUtils.escapeXml(node.getUser().getName())).append("'");
        }
        nodeString.append(" visble='true'");
        nodeString.append(" version='").append(node.getVersion()).append("'");
        nodeString.append(" changeset='").append(node.getChangeset()).append("'");
        nodeString.append(" lat='").append(node.getLat()).append("'");
        nodeString.append(" lon='").append(node.getLon()).append("'");

        if (node.getNumTags() > 0) {
            nodeString.append(">\n");

            final Set<String> tags = node.getTagKeys();
            for (String key : tags) {
                nodeString.append("    ");
                nodeString.append("<tag");
                nodeString.append(" k='").append(StringEscapeUtils.escapeXml(key)).append("'");
                nodeString.append(" v='").append(StringEscapeUtils.escapeXml(node.getTag(key))).append("'");
                nodeString.append("/>\n");
            }
            nodeString.append("  </node>\n");

        } else {
            nodeString.append("/>\n");
        }

        writer.write(nodeString.toString());
    }
}

/*
  <way id='45975724' action='modify' timestamp='2009-12-11T00:03:23Z' uid='5265' user='ivansanchez' visible='true' version='1' changeset='3345956'>
<nd ref='585478760' />
<nd ref='585478780' />
<nd ref='585478785' />
<nd ref='585478782' />
<nd ref='585478787' />
<nd ref='585478801' />
<nd ref='585478771' />
<nd ref='585478773' />
<nd ref='585478775' />
<nd ref='585478776' />
<nd ref='585478832' />
<nd ref='585478834' />
<nd ref='585478836' />
<nd ref='585478838' />
<nd ref='585478842' />
<nd ref='585478844' />
<nd ref='585479100' />
<nd ref='585478846' />
<nd ref='585478895' />
<nd ref='585478903' />
<nd ref='585478905' />
<nd ref='585479025' />
<nd ref='585479113' />
<nd ref='585479115' />
<nd ref='585479122' />
<nd ref='585479128' />
<nd ref='585479129' />
<nd ref='585479136' />
<nd ref='585479137' />
<nd ref='585479074' />
<nd ref='585479076' />
<nd ref='585479077' />
<nd ref='585479078' />
<nd ref='585479065' />
<nd ref='585479069' />
<nd ref='585479070' />
<nd ref='585479059' />
<nd ref='585479050' />
<nd ref='585479051' />
<nd ref='585478980' />
<nd ref='585478967' />
<nd ref='585478969' />
<nd ref='585478971' />
<nd ref='585478924' />
<nd ref='585478928' />
<nd ref='585478930' />
<nd ref='585478932' />
<nd ref='585478934' />
<nd ref='585478760' />
<tag k='landuse' v='residential' />
<tag k='name' v='Blascosancho' />
<tag k='place' v='village' />
<tag k='source' v='ITACyL' />
  </way>
    
 */
/*
<osm version='0.6' generator='JOSM'>
  <bounds minlat='42.345504999999996' minlon='-4.9165589' maxlat='42.3457072' maxlon='-4.9158883' origin='CGImap 0.0.2' />
  <node id='271241537' action='modify' timestamp='2011-08-09T21:00:44Z' uid='101355' user='ottokar55' visible='true' version='3' changeset='8971469' lat='42.3456062' lon='-4.9162025'>
<tag k='highway' v='stop' />
<tag k='is_in' v='Palencia, Castilla y Len, Spain, Europe' />
<tag k='name' v='San Martn de la Fuente' />
<tag k='place' v='hamlet' />
  </node>
</osm>
*/