Search in sources :

Example 1 with StartElementListener

use of android.sax.StartElementListener in project c-geo by just-radovan.

the class cgGPXParser method parse.

public long parse(File file, int version, Handler handlerIn) {
    handler = handlerIn;
    if (file == null) {
        return 0l;
    }
    if (version == 11) {
        // GPX 1.1
        ns = "http://www.topografix.com/GPX/1/1";
    } else {
        // GPX 1.0
        ns = "http://www.topografix.com/GPX/1/0";
    }
    final RootElement root = new RootElement(ns, "gpx");
    final Element waypoint = root.getChild(ns, "wpt");
    // waypoint - attributes
    waypoint.setStartElementListener(new StartElementListener() {

        public void start(Attributes attrs) {
            try {
                if (attrs.getIndex("lat") > -1) {
                    cache.latitude = new Double(attrs.getValue("lat"));
                }
                if (attrs.getIndex("lon") > -1) {
                    cache.longitude = new Double(attrs.getValue("lon"));
                }
            } catch (Exception e) {
                Log.w(cgSettings.tag, "Failed to parse waypoint's latitude and/or longitude.");
            }
        }
    });
    // waypoint
    waypoint.setEndElementListener(new EndElementListener() {

        public void end() {
            if (cache.geocode == null || cache.geocode.length() == 0) {
                // try to find geocode somewhere else
                String geocode = null;
                Matcher matcherGeocode = null;
                if (name != null && geocode == null) {
                    matcherGeocode = patternGeocode.matcher(name);
                    while (matcherGeocode.find()) {
                        if (matcherGeocode.groupCount() > 0) {
                            geocode = matcherGeocode.group(1);
                        }
                    }
                }
                if (desc != null && geocode == null) {
                    matcherGeocode = patternGeocode.matcher(desc);
                    while (matcherGeocode.find()) {
                        if (matcherGeocode.groupCount() > 0) {
                            geocode = matcherGeocode.group(1);
                        }
                    }
                }
                if (cmt != null && geocode == null) {
                    matcherGeocode = patternGeocode.matcher(cmt);
                    while (matcherGeocode.find()) {
                        if (matcherGeocode.groupCount() > 0) {
                            geocode = matcherGeocode.group(1);
                        }
                    }
                }
                if (geocode != null && geocode.length() > 0) {
                    cache.geocode = geocode;
                }
                geocode = null;
                matcherGeocode = null;
            }
            if (cache.geocode != null && cache.geocode.length() > 0 && cache.latitude != null && cache.longitude != null && ((type == null && sym == null) || (type != null && type.indexOf("geocache") > -1) || (sym != null && sym.indexOf("geocache") > -1))) {
                cache.latitudeString = base.formatCoordinate(cache.latitude, "lat", true);
                cache.longitudeString = base.formatCoordinate(cache.longitude, "lon", true);
                if (cache.inventory != null) {
                    cache.inventoryItems = cache.inventory.size();
                } else {
                    cache.inventoryItems = 0;
                }
                cache.reason = listId;
                cache.updated = new Date().getTime();
                cache.detailedUpdate = new Date().getTime();
                cache.detailed = true;
                app.addCacheToSearch(search, cache);
            }
            if (handler != null) {
                final Message msg = new Message();
                msg.obj = search.getCount();
                handler.sendMessage(msg);
            }
            htmlShort = true;
            htmlLong = true;
            type = null;
            sym = null;
            name = null;
            desc = null;
            cmt = null;
            cache = null;
            cache = new cgCache();
        }
    });
    // waypoint.time
    waypoint.getChild(ns, "time").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            try {
                cache.hidden = cgBase.dateGPXIn.parse(body.trim());
            } catch (Exception e) {
                Log.w(cgSettings.tag, "Failed to parse cache date: " + e.toString());
            }
        }
    });
    // waypoint.name
    waypoint.getChild(ns, "name").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            name = body;
            final String content = Html.fromHtml(body).toString().trim();
            cache.name = content;
            if (cache.name.length() > 2 && cache.name.substring(0, 2).equalsIgnoreCase("GC") == true) {
                cache.geocode = cache.name.toUpperCase();
            }
        }
    });
    // waypoint.desc
    waypoint.getChild(ns, "desc").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            desc = body;
            final String content = Html.fromHtml(body).toString().trim();
            cache.shortdesc = content;
        }
    });
    // waypoint.cmt
    waypoint.getChild(ns, "cmt").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            cmt = body;
            final String content = Html.fromHtml(body).toString().trim();
            cache.description = content;
        }
    });
    // waypoint.type
    waypoint.getChild(ns, "type").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            final String[] content = body.split("\\|");
            if (content.length > 0) {
                type = content[0].toLowerCase().trim();
            }
        }
    });
    // waypoint.sym
    waypoint.getChild(ns, "sym").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            body = body.toLowerCase();
            sym = body;
            if (body.indexOf("geocache") != -1 && body.indexOf("found") != -1) {
                cache.found = true;
            }
        }
    });
    for (String nsGC : nsGCList) {
        // waypoints.cache
        final Element gcCache = waypoint.getChild(nsGC, "cache");
        gcCache.setStartElementListener(new StartElementListener() {

            public void start(Attributes attrs) {
                try {
                    if (attrs.getIndex("id") > -1) {
                        cache.cacheid = attrs.getValue("id");
                    }
                    if (attrs.getIndex("archived") > -1) {
                        final String at = attrs.getValue("archived").toLowerCase();
                        if (at.equals("true")) {
                            cache.archived = true;
                        } else {
                            cache.archived = false;
                        }
                    }
                    if (attrs.getIndex("available") > -1) {
                        final String at = attrs.getValue("available").toLowerCase();
                        if (at.equals("true")) {
                            cache.disabled = false;
                        } else {
                            cache.disabled = true;
                        }
                    }
                } catch (Exception e) {
                    Log.w(cgSettings.tag, "Failed to parse cache attributes.");
                }
            }
        });
        // waypoint.cache.name
        gcCache.getChild(nsGC, "name").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                final String content = Html.fromHtml(body).toString().trim();
                cache.name = content;
            }
        });
        // waypoint.cache.owner
        gcCache.getChild(nsGC, "owner").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                final String content = Html.fromHtml(body).toString().trim();
                cache.owner = content;
            }
        });
        // waypoint.cache.type
        gcCache.getChild(nsGC, "type").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                final String content = cgBase.cacheTypes.get(body.toLowerCase());
                cache.type = content;
            }
        });
        // waypoint.cache.container
        gcCache.getChild(nsGC, "container").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                final String content = body.toLowerCase();
                cache.size = content;
            }
        });
        // waypoint.cache.difficulty
        gcCache.getChild(nsGC, "difficulty").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                try {
                    cache.difficulty = new Float(body);
                } catch (Exception e) {
                    Log.w(cgSettings.tag, "Failed to parse difficulty: " + e.toString());
                }
            }
        });
        // waypoint.cache.terrain
        gcCache.getChild(nsGC, "terrain").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                try {
                    cache.terrain = new Float(body);
                } catch (Exception e) {
                    Log.w(cgSettings.tag, "Failed to parse terrain: " + e.toString());
                }
            }
        });
        // waypoint.cache.country
        gcCache.getChild(nsGC, "country").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                if (cache.location == null || cache.location.length() == 0) {
                    cache.location = body.trim();
                } else {
                    cache.location = cache.location + ", " + body.trim();
                }
            }
        });
        // waypoint.cache.state
        gcCache.getChild(nsGC, "state").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                if (cache.location == null || cache.location.length() == 0) {
                    cache.location = body.trim();
                } else {
                    cache.location = body.trim() + ", " + cache.location;
                }
            }
        });
        // waypoint.cache.encoded_hints
        gcCache.getChild(nsGC, "encoded_hints").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                cache.hint = body.trim();
            }
        });
        // waypoint.cache.short_description
        gcCache.getChild(nsGC, "short_description").setStartElementListener(new StartElementListener() {

            public void start(Attributes attrs) {
                try {
                    if (attrs.getIndex("html") > -1) {
                        final String at = attrs.getValue("html").toLowerCase();
                        if (at.equals("false")) {
                            htmlShort = false;
                        }
                    }
                } catch (Exception e) {
                // nothing
                }
            }
        });
        gcCache.getChild(nsGC, "short_description").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                if (htmlShort == false) {
                    cache.shortdesc = Html.fromHtml(body).toString();
                } else {
                    cache.shortdesc = body;
                }
            }
        });
        // waypoint.cache.long_description
        gcCache.getChild(nsGC, "long_description").setStartElementListener(new StartElementListener() {

            public void start(Attributes attrs) {
                try {
                    if (attrs.getIndex("html") > -1) {
                        final String at = attrs.getValue("html").toLowerCase();
                        if (at.equals("false")) {
                            htmlLong = false;
                        }
                    }
                } catch (Exception e) {
                // nothing
                }
            }
        });
        gcCache.getChild(nsGC, "long_description").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                if (htmlLong == false) {
                    cache.description = Html.fromHtml(body).toString().trim();
                } else {
                    cache.description = body;
                }
            }
        });
        // waypoint.cache.travelbugs
        final Element gcTBs = gcCache.getChild(nsGC, "travelbugs");
        // waypoint.cache.travelbugs.travelbug
        gcTBs.getChild(nsGC, "travelbug").setStartElementListener(new StartElementListener() {

            public void start(Attributes attrs) {
                trackable = new cgTrackable();
                try {
                    if (attrs.getIndex("ref") > -1) {
                        trackable.geocode = attrs.getValue("ref").toUpperCase();
                    }
                } catch (Exception e) {
                // nothing
                }
            }
        });
        // waypoint.cache.travelbug
        final Element gcTB = gcTBs.getChild(nsGC, "travelbug");
        gcTB.setEndElementListener(new EndElementListener() {

            public void end() {
                if (trackable.geocode != null && trackable.geocode.length() > 0 && trackable.name != null && trackable.name.length() > 0) {
                    if (cache.inventory == null)
                        cache.inventory = new ArrayList<cgTrackable>();
                    cache.inventory.add(trackable);
                }
            }
        });
        // waypoint.cache.travelbugs.travelbug.name
        gcTB.getChild(nsGC, "name").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                String content = Html.fromHtml(body).toString();
                trackable.name = content;
            }
        });
        // waypoint.cache.logs
        final Element gcLogs = gcCache.getChild(nsGC, "logs");
        // waypoint.cache.log
        final Element gcLog = gcLogs.getChild(nsGC, "log");
        gcLog.setStartElementListener(new StartElementListener() {

            public void start(Attributes attrs) {
                log = new cgLog();
                try {
                    if (attrs.getIndex("id") > -1) {
                        log.id = Integer.parseInt(attrs.getValue("id"));
                    }
                } catch (Exception e) {
                // nothing
                }
            }
        });
        gcLog.setEndElementListener(new EndElementListener() {

            public void end() {
                if (log.log != null && log.log.length() > 0) {
                    if (cache.logs == null)
                        cache.logs = new ArrayList<cgLog>();
                    cache.logs.add(log);
                }
            }
        });
        // waypoint.cache.logs.log.date
        gcLog.getChild(nsGC, "date").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                try {
                    log.date = cgBase.dateGPXIn.parse(body.trim()).getTime();
                } catch (Exception e) {
                    Log.w(cgSettings.tag, "Failed to parse log date: " + e.toString());
                }
            }
        });
        // waypoint.cache.logs.log.type
        gcLog.getChild(nsGC, "type").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                final String content = body.trim().toLowerCase();
                if (cgBase.logTypes0.containsKey(content) == true) {
                    log.type = cgBase.logTypes0.get(content);
                } else {
                    log.type = 4;
                }
            }
        });
        // waypoint.cache.logs.log.finder
        gcLog.getChild(nsGC, "finder").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                String content = Html.fromHtml(body).toString();
                log.author = content;
            }
        });
        // waypoint.cache.logs.log.finder
        gcLog.getChild(nsGC, "text").setEndTextElementListener(new EndTextElementListener() {

            public void end(String body) {
                String content = Html.fromHtml(body).toString();
                log.log = content;
            }
        });
    }
    try {
        Xml.parse(new FileInputStream(file), Xml.Encoding.UTF_8, root.getContentHandler());
        return search.getCurrentId();
    } catch (Exception e) {
        Log.e(cgSettings.tag, "Cannot parse .gpx file " + file.getAbsolutePath() + " as GPX " + version + ": " + e.toString());
    }
    return 0l;
}
Also used : EndElementListener(android.sax.EndElementListener) Message(android.os.Message) Matcher(java.util.regex.Matcher) Element(android.sax.Element) RootElement(android.sax.RootElement) Attributes(org.xml.sax.Attributes) Date(java.util.Date) FileInputStream(java.io.FileInputStream) RootElement(android.sax.RootElement) StartElementListener(android.sax.StartElementListener) EndTextElementListener(android.sax.EndTextElementListener)

Aggregations

Message (android.os.Message)1 Element (android.sax.Element)1 EndElementListener (android.sax.EndElementListener)1 EndTextElementListener (android.sax.EndTextElementListener)1 RootElement (android.sax.RootElement)1 StartElementListener (android.sax.StartElementListener)1 FileInputStream (java.io.FileInputStream)1 Date (java.util.Date)1 Matcher (java.util.regex.Matcher)1 Attributes (org.xml.sax.Attributes)1