Example #1
0
        /**
         *  Extracts the available formats from the provided DOM element. If it does not contain any
         *  nationalPrefixFormattingRule, the one passed-in is retained. The nationalPrefix,
         *  nationalPrefixFormattingRule and nationalPrefixOptionalWhenFormatting values are provided from
         *  the parent (territory) element.
         */
        // @VisibleForTesting
        internal static void loadAvailableFormats(PhoneMetadata.Builder metadata,
                                                  XmlElement element, String nationalPrefix,
                                                  String nationalPrefixFormattingRule,
                                                  bool nationalPrefixOptionalWhenFormatting)
        {
            String carrierCodeFormattingRule = "";

            if (element.HasAttribute(CARRIER_CODE_FORMATTING_RULE))
            {
                carrierCodeFormattingRule = validateRE(
                    getDomesticCarrierCodeFormattingRuleFromXmlElement(element, nationalPrefix));
            }
            var  numberFormatXmlElements      = element.GetElementsByTagName(NUMBER_FORMAT);
            bool hasExplicitIntlFormatDefined = false;

            int numOfFormatXmlElements = numberFormatXmlElements.Count;

            if (numOfFormatXmlElements > 0)
            {
                for (int i = 0; i < numOfFormatXmlElements; i++)
                {
                    XmlElement           numberFormatXmlElement = (XmlElement)numberFormatXmlElements.Item(i);
                    NumberFormat.Builder format = NumberFormat.newBuilder();

                    if (numberFormatXmlElement.HasAttribute(NATIONAL_PREFIX_FORMATTING_RULE))
                    {
                        format.setNationalPrefixFormattingRule(
                            getNationalPrefixFormattingRuleFromXmlElement(numberFormatXmlElement, nationalPrefix));
                    }
                    else
                    {
                        format.setNationalPrefixFormattingRule(nationalPrefixFormattingRule);
                    }

                    if (format.HasNationalPrefixFormattingRule())
                    {
                        if (numberFormatXmlElement.HasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING))
                        {
                            format.setNationalPrefixOptionalWhenFormatting(
                                Boolean.Parse(numberFormatXmlElement.GetAttribute(
                                                  NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)));
                        }
                        else
                        {
                            format.setNationalPrefixOptionalWhenFormatting(nationalPrefixOptionalWhenFormatting);
                        }
                    }
                    if (numberFormatXmlElement.HasAttribute(CARRIER_CODE_FORMATTING_RULE))
                    {
                        format.setDomesticCarrierCodeFormattingRule(validateRE(
                                                                        getDomesticCarrierCodeFormattingRuleFromXmlElement(numberFormatXmlElement,
                                                                                                                           nationalPrefix)));
                    }
                    else
                    {
                        format.setDomesticCarrierCodeFormattingRule(carrierCodeFormattingRule);
                    }
                    loadNationalFormat(metadata, numberFormatXmlElement, format);
                    metadata.addNumberFormat(format);

                    if (loadInternationalFormat(metadata, numberFormatXmlElement, format.build()))
                    {
                        hasExplicitIntlFormatDefined = true;
                    }
                }
                // Only a small number of regions need to specify the intlFormats in the xml. For the majority
                // of countries the intlNumberFormat metadata is an exact copy of the national NumberFormat
                // metadata. To minimize the size of the metadata file, we only keep intlNumberFormats that
                // actually differ in some way to the national formats.
                if (!hasExplicitIntlFormatDefined)
                {
                    metadata.clearIntlNumberFormat();
                }
            }
        }