Search in sources :

Example 1 with EndElementListener

use of android.sax.EndElementListener 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)

Example 2 with EndElementListener

use of android.sax.EndElementListener in project SeriesGuide by UweTrottmann.

the class TvdbTools method parseEpisodes.

/**
     * Loads the given zipped XML and parses containing episodes to create an array of {@link
     * ContentValues} for new episodes.<br> Adds update ops for updated episodes and delete ops for
     * local orphaned episodes to the given {@link ContentProviderOperation} batch.
     */
private ArrayList<ContentValues> parseEpisodes(final ArrayList<ContentProviderOperation> batch, final Show show, String url) throws TvdbException {
    final long dateLastMonthEpoch = (System.currentTimeMillis() - (DateUtils.DAY_IN_MILLIS * 30)) / 1000;
    final DateTimeZone showTimeZone = TimeTools.getDateTimeZone(show.release_timezone);
    final LocalTime showReleaseTime = TimeTools.getShowReleaseTime(show.release_time);
    final String deviceTimeZone = TimeZone.getDefault().getID();
    RootElement root = new RootElement("Data");
    Element episode = root.getChild("Episode");
    final ArrayList<ContentValues> newEpisodesValues = new ArrayList<>();
    final HashMap<Integer, Long> localEpisodeIds = DBUtils.getEpisodeMapForShow(app, show.tvdb_id);
    final HashMap<Integer, Long> removableEpisodeIds = new HashMap<>(// just copy episodes list, then remove valid ones
    localEpisodeIds);
    final HashSet<Integer> localSeasonIds = DBUtils.getSeasonIdsOfShow(app, show.tvdb_id);
    // store updated seasons to avoid duplicate ops
    final HashSet<Integer> seasonIdsToUpdate = new HashSet<>();
    final ContentValues values = new ContentValues();
    // set handlers for elements we want to react to
    episode.setEndElementListener(new EndElementListener() {

        public void end() {
            Integer episodeId = values.getAsInteger(Episodes._ID);
            if (episodeId == null || episodeId <= 0) {
                // invalid id, skip
                return;
            }
            // don't clean up this episode
            removableEpisodeIds.remove(episodeId);
            // decide whether to insert or update
            if (localEpisodeIds.containsKey(episodeId)) {
                /*
                     * Update uses provider ops which take a long time. Only
                     * update if episode was edited on TVDb or is not older than
                     * a month (ensures show air time changes get stored).
                     */
                Long lastEditEpoch = localEpisodeIds.get(episodeId);
                Long lastEditEpochNew = values.getAsLong(Episodes.LAST_EDITED);
                if (lastEditEpoch != null && lastEditEpochNew != null && (lastEditEpoch < lastEditEpochNew || dateLastMonthEpoch < lastEditEpoch)) {
                    // complete update op for episode
                    batch.add(DBUtils.buildEpisodeUpdateOp(values));
                }
            } else {
                // episode does not exist, yet
                newEpisodesValues.add(new ContentValues(values));
            }
            Integer seasonId = values.getAsInteger(Seasons.REF_SEASON_ID);
            if (seasonId != null && !seasonIdsToUpdate.contains(seasonId)) {
                // add insert/update op for season
                batch.add(DBUtils.buildSeasonOp(values, !localSeasonIds.contains(seasonId)));
                seasonIdsToUpdate.add(values.getAsInteger(Seasons.REF_SEASON_ID));
            }
            values.clear();
        }
    });
    episode.getChild("id").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes._ID, body.trim());
        }
    });
    episode.getChild("EpisodeNumber").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.NUMBER, body.trim());
        }
    });
    episode.getChild("absolute_number").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.ABSOLUTE_NUMBER, body.trim());
        }
    });
    episode.getChild("SeasonNumber").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.SEASON, body.trim());
        }
    });
    episode.getChild("DVD_episodenumber").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.DVDNUMBER, body.trim());
        }
    });
    episode.getChild("FirstAired").setEndTextElementListener(new EndTextElementListener() {

        public void end(String releaseDate) {
            long releaseDateTime = TimeTools.parseEpisodeReleaseDate(app, showTimeZone, releaseDate, showReleaseTime, show.country, show.network, deviceTimeZone);
            values.put(Episodes.FIRSTAIREDMS, releaseDateTime);
        }
    });
    episode.getChild("EpisodeName").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.TITLE, body.trim());
        }
    });
    episode.getChild("Overview").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.OVERVIEW, body.trim());
        }
    });
    episode.getChild("seasonid").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Seasons.REF_SEASON_ID, body.trim());
        }
    });
    episode.getChild("seriesid").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Shows.REF_SHOW_ID, body.trim());
        }
    });
    episode.getChild("Director").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.DIRECTORS, body.trim());
        }
    });
    episode.getChild("GuestStars").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.GUESTSTARS, body.trim());
        }
    });
    episode.getChild("Writer").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.WRITERS, body.trim());
        }
    });
    episode.getChild("filename").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.IMAGE, body.trim());
        }
    });
    episode.getChild("IMDB_ID").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            values.put(Episodes.IMDBID, body.trim());
        }
    });
    episode.getChild("lastupdated").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            // system populated field, trimming not necessary
            try {
                values.put(Episodes.LAST_EDITED, Long.valueOf(body));
            } catch (NumberFormatException e) {
                values.put(Episodes.LAST_EDITED, 0);
            }
        }
    });
    downloadAndParse(root.getContentHandler(), url, true, "parseEpisodes: ");
    // add delete ops for leftover episodeIds in our db
    for (Integer episodeId : removableEpisodeIds.keySet()) {
        batch.add(ContentProviderOperation.newDelete(Episodes.buildEpisodeUri(episodeId)).build());
    }
    return newEpisodesValues;
}
Also used : ContentValues(android.content.ContentValues) EndElementListener(android.sax.EndElementListener) LocalTime(org.joda.time.LocalTime) HashMap(java.util.HashMap) Element(android.sax.Element) RootElement(android.sax.RootElement) ArrayList(java.util.ArrayList) DateTimeZone(org.joda.time.DateTimeZone) RootElement(android.sax.RootElement) HashSet(java.util.HashSet) EndTextElementListener(android.sax.EndTextElementListener)

Example 3 with EndElementListener

use of android.sax.EndElementListener in project SeriesGuide by UweTrottmann.

the class TvdbTools method searchShow.

/**
     * Search TheTVDB for shows which include a certain keyword in their title.
     *
     * @param language If not provided, will query for results in all languages.
     * @return At most 100 results (limited by TheTVDB API).
     */
@Nonnull
public List<SearchResult> searchShow(@NonNull String query, @Nullable final String language) throws TvdbException {
    final List<SearchResult> series = new ArrayList<>();
    final SearchResult currentShow = new SearchResult();
    RootElement root = new RootElement("Data");
    Element item = root.getChild("Series");
    // set handlers for elements we want to react to
    item.setEndElementListener(new EndElementListener() {

        public void end() {
            // only take results in the selected language
            if (language == null || language.equals(currentShow.language)) {
                series.add(currentShow.copy());
            }
        }
    });
    item.getChild("id").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            currentShow.tvdbid = Integer.valueOf(body);
        }
    });
    item.getChild("language").setEndTextElementListener(new EndTextElementListener() {

        @Override
        public void end(String body) {
            currentShow.language = body.trim();
        }
    });
    item.getChild("SeriesName").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            currentShow.title = body.trim();
        }
    });
    item.getChild("Overview").setEndTextElementListener(new EndTextElementListener() {

        public void end(String body) {
            currentShow.overview = body.trim();
        }
    });
    // build search URL: encode query...
    String url;
    try {
        url = TVDB_API_GETSERIES + URLEncoder.encode(query, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        throw new TvdbDataException("searchShow: " + e.getMessage(), e);
    }
    // ...and set language filter
    if (language == null) {
        url += TVDB_PARAM_LANGUAGE + "all";
    } else {
        url += TVDB_PARAM_LANGUAGE + language;
    }
    downloadAndParse(root.getContentHandler(), url, false, "searchShow: ");
    return series;
}
Also used : RootElement(android.sax.RootElement) EndElementListener(android.sax.EndElementListener) Element(android.sax.Element) RootElement(android.sax.RootElement) ArrayList(java.util.ArrayList) UnsupportedEncodingException(java.io.UnsupportedEncodingException) SearchResult(com.battlelancer.seriesguide.items.SearchResult) EndTextElementListener(android.sax.EndTextElementListener) Nonnull(javax.annotation.Nonnull)

Aggregations

Element (android.sax.Element)3 EndElementListener (android.sax.EndElementListener)3 EndTextElementListener (android.sax.EndTextElementListener)3 RootElement (android.sax.RootElement)3 ArrayList (java.util.ArrayList)2 ContentValues (android.content.ContentValues)1 Message (android.os.Message)1 StartElementListener (android.sax.StartElementListener)1 SearchResult (com.battlelancer.seriesguide.items.SearchResult)1 FileInputStream (java.io.FileInputStream)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 Date (java.util.Date)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Matcher (java.util.regex.Matcher)1 Nonnull (javax.annotation.Nonnull)1 DateTimeZone (org.joda.time.DateTimeZone)1 LocalTime (org.joda.time.LocalTime)1 Attributes (org.xml.sax.Attributes)1