Class TzdbZoneRulesCompiler


  • final class TzdbZoneRulesCompiler
    extends java.lang.Object
    A builder that can read the TZDB time-zone files and build ZoneRules instances.

    Specification for implementors

    This class is a mutable builder. A new instance must be created for each compile.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.util.SortedMap<java.lang.String,​ZoneRules> builtZones
      The built zones.
      private java.util.Map<java.lang.Object,​java.lang.Object> deduplicateMap
      A map to deduplicate object instances.
      private static java.util.Map<java.lang.String,​java.lang.Integer> DOW_LOOKUP  
      private java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds
      Sorted collection of LeapSecondRules.
      private java.io.File leapSecondsFile
      The leap seconds file.
      private static java.util.Set<java.lang.String> LINK_LOOKUP  
      private java.util.Map<java.lang.String,​java.lang.String> links
      The TZDB links.
      private static java.util.Set<java.lang.String> MAX_YEAR_LOOKUP  
      private static java.util.Set<java.lang.String> MIN_YEAR_LOOKUP  
      private static java.util.Map<java.lang.String,​java.lang.Integer> MONTH_LOOKUP  
      private static java.util.Set<java.lang.String> ONLY_YEAR_LOOKUP  
      private static java.util.Set<java.lang.String> RULE_LOOKUP  
      private java.util.Map<java.lang.String,​java.util.List<TzdbZoneRulesCompiler.TZDBRule>> rules
      The TZDB rules.
      private java.util.List<java.io.File> sourceFiles
      The source files.
      private static DateTimeFormatter TIME_PARSER
      Time parser.
      private boolean verbose
      The version to produce.
      private java.lang.String version
      The version to produce.
      private static java.util.Set<java.lang.String> ZONE_LOOKUP  
      private java.util.Map<java.lang.String,​java.util.List<TzdbZoneRulesCompiler.TZDBZone>> zones
      The TZDB zones.
    • Constructor Summary

      Constructors 
      Constructor Description
      TzdbZoneRulesCompiler​(java.lang.String version, java.util.List<java.io.File> sourceFiles, java.io.File leapSecondsFile, boolean verbose)
      Creates an instance if you want to invoke the compiler manually.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private void buildZoneRules()
      Build the rules, zones and links into real zones.
      void compile()
      Compile the rules file.
      (package private) <T> T deduplicate​(T object)
      Deduplicates an object instance.
      private static java.util.Set<java.lang.String> expand​(java.lang.String whole, java.lang.String shortest)  
      java.util.SortedMap<LocalDate,​java.lang.Byte> getLeapSeconds()
      Gets the parsed leap seconds.
      private LocalDate getMostRecentLeapSecond()
      Gets the most recent leap second.
      java.util.SortedMap<java.lang.String,​ZoneRules> getZones()
      Gets the parsed zone rules.
      static void main​(java.lang.String[] args)
      Reads a set of TZDB files and builds a single combined data file.
      private static void outputFile​(java.io.File dstFile, java.lang.String version, java.util.SortedMap<java.lang.String,​ZoneRules> builtZones, java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds)
      Outputs the file.
      private static void outputFile​(java.io.File dstFile, java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones, java.util.Set<java.lang.String> allRegionIds, java.util.Set<ZoneRules> allRules, java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds)
      Outputs the file.
      private static void outputFilesDat​(java.io.File dstDir, java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones, java.util.Set<java.lang.String> allRegionIds, java.util.Set<ZoneRules> allRules, java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds)
      Outputs the DAT files.
      private static void outputHelp()
      Output usage text for the command line.
      private static void outputTzdbDat​(java.io.OutputStream jos, java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones, java.util.Set<java.lang.String> allRegionIds, java.util.Set<ZoneRules> allRules)
      Outputs the timezone DAT file.
      private static void outputTzdbEntry​(java.util.jar.JarOutputStream jos, java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones, java.util.Set<java.lang.String> allRegionIds, java.util.Set<ZoneRules> allRules)
      Outputs the timezone entry in the JAR file.
      private DayOfWeek parseDayOfWeek​(java.lang.String str)  
      private void parseFile​(java.io.File file)
      Parses a source file.
      private void parseFiles()
      Parses the source files.
      private TzdbZoneRulesCompiler.LeapSecondRule parseLeapSecondRule​(java.lang.String line)  
      private void parseLeapSecondsFile()
      Parses the leap seconds file.
      private Month parseMonth​(java.lang.String str)  
      private void parseMonthDayTime​(java.util.StringTokenizer st, TzdbZoneRulesCompiler.TZDBMonthDayTime mdt)
      Parses a Rule line.
      private ZoneOffset parseOffset​(java.lang.String str)  
      private java.lang.String parseOptional​(java.lang.String str)  
      private int parsePeriod​(java.lang.String str)  
      private void parseRuleLine​(java.util.StringTokenizer st)
      Parses a Rule line.
      private int parseSecs​(java.lang.String str)  
      private ZoneOffsetTransitionRule.TimeDefinition parseTimeDefinition​(char c)  
      private int parseYear​(java.lang.String str, int defaultYear)  
      private boolean parseZoneLine​(java.util.StringTokenizer st, java.util.List<TzdbZoneRulesCompiler.TZDBZone> zoneList)
      Parses a Zone line.
      private void printVerbose​(java.lang.String message)
      Prints a verbose message.
      private static void process​(java.util.List<java.io.File> srcDirs, java.util.List<java.lang.String> srcFileNames, java.io.File dstDir, boolean unpacked, boolean verbose)
      Process to create the jar files.
      private static void put​(java.util.Set<java.lang.String> strs, int value, java.util.Map<java.lang.String,​java.lang.Integer> map)  
      (package private) void setDeduplicateMap​(java.util.Map<java.lang.Object,​java.lang.Object> deduplicateMap)
      Sets the deduplication map.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • RULE_LOOKUP

        private static final java.util.Set<java.lang.String> RULE_LOOKUP
      • ZONE_LOOKUP

        private static final java.util.Set<java.lang.String> ZONE_LOOKUP
      • LINK_LOOKUP

        private static final java.util.Set<java.lang.String> LINK_LOOKUP
      • MIN_YEAR_LOOKUP

        private static final java.util.Set<java.lang.String> MIN_YEAR_LOOKUP
      • MAX_YEAR_LOOKUP

        private static final java.util.Set<java.lang.String> MAX_YEAR_LOOKUP
      • ONLY_YEAR_LOOKUP

        private static final java.util.Set<java.lang.String> ONLY_YEAR_LOOKUP
      • MONTH_LOOKUP

        private static final java.util.Map<java.lang.String,​java.lang.Integer> MONTH_LOOKUP
      • DOW_LOOKUP

        private static final java.util.Map<java.lang.String,​java.lang.Integer> DOW_LOOKUP
      • links

        private final java.util.Map<java.lang.String,​java.lang.String> links
        The TZDB links.
      • builtZones

        private final java.util.SortedMap<java.lang.String,​ZoneRules> builtZones
        The built zones.
      • deduplicateMap

        private java.util.Map<java.lang.Object,​java.lang.Object> deduplicateMap
        A map to deduplicate object instances.
      • leapSeconds

        private final java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds
        Sorted collection of LeapSecondRules.
      • version

        private final java.lang.String version
        The version to produce.
      • sourceFiles

        private final java.util.List<java.io.File> sourceFiles
        The source files.
      • leapSecondsFile

        private final java.io.File leapSecondsFile
        The leap seconds file.
      • verbose

        private final boolean verbose
        The version to produce.
    • Constructor Detail

      • TzdbZoneRulesCompiler

        public TzdbZoneRulesCompiler​(java.lang.String version,
                                     java.util.List<java.io.File> sourceFiles,
                                     java.io.File leapSecondsFile,
                                     boolean verbose)
        Creates an instance if you want to invoke the compiler manually.
        Parameters:
        version - the version, such as 2009a, not null
        sourceFiles - the list of source files, not empty, not null
        verbose - whether to output verbose messages
    • Method Detail

      • put

        private static void put​(java.util.Set<java.lang.String> strs,
                                int value,
                                java.util.Map<java.lang.String,​java.lang.Integer> map)
      • expand

        private static java.util.Set<java.lang.String> expand​(java.lang.String whole,
                                                              java.lang.String shortest)
      • main

        public static void main​(java.lang.String[] args)
        Reads a set of TZDB files and builds a single combined data file.
        Parameters:
        args - the arguments
      • outputHelp

        private static void outputHelp()
        Output usage text for the command line.
      • process

        private static void process​(java.util.List<java.io.File> srcDirs,
                                    java.util.List<java.lang.String> srcFileNames,
                                    java.io.File dstDir,
                                    boolean unpacked,
                                    boolean verbose)
        Process to create the jar files.
      • outputFilesDat

        private static void outputFilesDat​(java.io.File dstDir,
                                           java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones,
                                           java.util.Set<java.lang.String> allRegionIds,
                                           java.util.Set<ZoneRules> allRules,
                                           java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds)
        Outputs the DAT files.
      • outputFile

        private static void outputFile​(java.io.File dstFile,
                                       java.lang.String version,
                                       java.util.SortedMap<java.lang.String,​ZoneRules> builtZones,
                                       java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds)
        Outputs the file.
      • outputFile

        private static void outputFile​(java.io.File dstFile,
                                       java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones,
                                       java.util.Set<java.lang.String> allRegionIds,
                                       java.util.Set<ZoneRules> allRules,
                                       java.util.SortedMap<LocalDate,​java.lang.Byte> leapSeconds)
        Outputs the file.
      • outputTzdbEntry

        private static void outputTzdbEntry​(java.util.jar.JarOutputStream jos,
                                            java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones,
                                            java.util.Set<java.lang.String> allRegionIds,
                                            java.util.Set<ZoneRules> allRules)
        Outputs the timezone entry in the JAR file.
      • outputTzdbDat

        private static void outputTzdbDat​(java.io.OutputStream jos,
                                          java.util.Map<java.lang.String,​java.util.SortedMap<java.lang.String,​ZoneRules>> allBuiltZones,
                                          java.util.Set<java.lang.String> allRegionIds,
                                          java.util.Set<ZoneRules> allRules)
                                   throws java.io.IOException
        Outputs the timezone DAT file.
        Throws:
        java.io.IOException
      • compile

        public void compile()
                     throws java.lang.Exception
        Compile the rules file.

        Use getZones() and getLeapSeconds() to retrieve the parsed data.

        Throws:
        java.lang.Exception - if an error occurs
      • getZones

        public java.util.SortedMap<java.lang.String,​ZoneRules> getZones()
        Gets the parsed zone rules.
        Returns:
        the parsed zone rules, not null
      • getLeapSeconds

        public java.util.SortedMap<LocalDate,​java.lang.Byte> getLeapSeconds()
        Gets the parsed leap seconds.
        Returns:
        the parsed and sorted leap seconds, not null
      • getMostRecentLeapSecond

        private LocalDate getMostRecentLeapSecond()
        Gets the most recent leap second.
        Returns:
        the most recent leap second, null if none
      • setDeduplicateMap

        void setDeduplicateMap​(java.util.Map<java.lang.Object,​java.lang.Object> deduplicateMap)
        Sets the deduplication map.
        Parameters:
        deduplicateMap - the map to deduplicate items
      • parseFiles

        private void parseFiles()
                         throws java.lang.Exception
        Parses the source files.
        Throws:
        java.lang.Exception - if an error occurs
      • parseLeapSecondsFile

        private void parseLeapSecondsFile()
                                   throws java.lang.Exception
        Parses the leap seconds file.
        Throws:
        java.lang.Exception - if an error occurs
      • parseFile

        private void parseFile​(java.io.File file)
                        throws java.lang.Exception
        Parses a source file.
        Parameters:
        file - the file being read, not null
        Throws:
        java.lang.Exception - if an error occurs
      • parseRuleLine

        private void parseRuleLine​(java.util.StringTokenizer st)
        Parses a Rule line.
        Parameters:
        st - the tokenizer, not null
      • parseZoneLine

        private boolean parseZoneLine​(java.util.StringTokenizer st,
                                      java.util.List<TzdbZoneRulesCompiler.TZDBZone> zoneList)
        Parses a Zone line.
        Parameters:
        st - the tokenizer, not null
        Returns:
        true if the zone is complete
      • parseMonthDayTime

        private void parseMonthDayTime​(java.util.StringTokenizer st,
                                       TzdbZoneRulesCompiler.TZDBMonthDayTime mdt)
        Parses a Rule line.
        Parameters:
        st - the tokenizer, not null
        mdt - the object to parse into, not null
      • parseYear

        private int parseYear​(java.lang.String str,
                              int defaultYear)
      • parseMonth

        private Month parseMonth​(java.lang.String str)
      • parseDayOfWeek

        private DayOfWeek parseDayOfWeek​(java.lang.String str)
      • parseOptional

        private java.lang.String parseOptional​(java.lang.String str)
      • parseSecs

        private int parseSecs​(java.lang.String str)
      • parseOffset

        private ZoneOffset parseOffset​(java.lang.String str)
      • parsePeriod

        private int parsePeriod​(java.lang.String str)
      • buildZoneRules

        private void buildZoneRules()
                             throws java.lang.Exception
        Build the rules, zones and links into real zones.
        Throws:
        java.lang.Exception - if an error occurs
      • deduplicate

        <T> T deduplicate​(T object)
        Deduplicates an object instance.
        Type Parameters:
        T - the generic type
        Parameters:
        object - the object to deduplicate
        Returns:
        the deduplicated object
      • printVerbose

        private void printVerbose​(java.lang.String message)
        Prints a verbose message.
        Parameters:
        message - the message, not null