#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code 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
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

# Scan for all locale resources and extract for which locales there exists
# resources. Then put this meta information about exiting (supported?) locales
# into LocaleDataMetaInfo.java

# First go look for all locale files
LOCALE_FILES := $(shell $(FIND) $(JDK_TOPDIR)/src/share/classes \
    -name "FormatData_*.java" -o -name "FormatData_*.properties" -o \
    -name "CollationData_*.java" -o -name "CollationData_*.properties" -o \
    -name "TimeZoneNames_*.java" -o -name "TimeZoneNames_*.properties" -o \
    -name "LocaleNames_*.java" -o -name "LocaleNames_*.properties" -o \
    -name "CurrencyNames_*.java" -o -name "CurrencyNames_*.properties" -o \
    -name "CalendarData_*.java" -o -name "CalendarData_*.properties" -o \
    -name "BreakIteratorInfo_*.java" -o -name "BreakIteratorRules_*.java")

# Then translate the locale files into for example: FormatData_sv
LOCALE_RESOURCES := $(sort $(subst .properties,,$(subst .java,,$(notdir $(LOCALE_FILES)))))

# Include the list of resources found during the previous compile.
-include $(JDK_OUTPUTDIR)/gensrc/_the.locale_resources

MISSING_RESOURCES := $(filter-out $(LOCALE_RESOURCES), $(PREV_LOCALE_RESOURCES))
NEW_RESOURCES := $(filter-out $(PREV_LOCALE_RESOURCES), $(LOCALE_RESOURCES))

ifneq (, $(MISSING_RESOURCES)$(NEW_RESOURCES))
  # There is a difference in the number of supported resources. Trigger a regeneration.
  $(shell $(RM) $(JDK_OUTPUTDIR)/gensrc/sun/util/locale/provider/LocaleDataMetaInfo.java)
endif

# The EN locales
EN_LOCALES := en%

# ja-JP-JP and th-TH-TH need to be manually added, as they don't have any resource files.
ALL_NON_EN_LOCALES := ja-JP-JP th-TH-TH

SED_ARGS := -e 's|$(HASH)warn This file is preprocessed before being compiled|// -- This file was mechanically generated: Do not edit! -- //|g'

# This macro creates a sed expression that substitues for example:
# #FormatData_ENLocales# with: en% locales.
define CaptureLocale
  $1_LOCALES := $$(subst _,-,$$(filter-out $1, $$(subst $1_,,$$(filter $1_%, $(LOCALE_RESOURCES)))))
  $1_EN_LOCALES := $$(filter $(EN_LOCALES), $$($1_LOCALES))
  $1_NON_EN_LOCALES := $$(filter-out $(EN_LOCALES), $$($1_LOCALES))

  ALL_EN_LOCALES += $$($1_EN_LOCALES)
  ALL_NON_EN_LOCALES += $$($1_NON_EN_LOCALES)

  # Don't sed in a space if there are no locales.
  SED_ARGS += -e 's/$$(HASH)$1_ENLocales$$(HASH)/$$(if $$($1_EN_LOCALES),$$(SPACE)$$($1_EN_LOCALES),)/g'
  SED_ARGS += -e 's/$$(HASH)$1_NonENLocales$$(HASH)/$$(if $$($1_NON_EN_LOCALES),$$(SPACE)$$($1_NON_EN_LOCALES),)/g'
endef

#sun.text.resources.FormatData
$(eval $(call CaptureLocale,FormatData))

#sun.text.resources.CollationData
$(eval $(call CaptureLocale,CollationData))

#sun.text.resources.BreakIteratorInfo
$(eval $(call CaptureLocale,BreakIteratorInfo))

#sun.text.resources.BreakIteratorRules
$(eval $(call CaptureLocale,BreakIteratorRules))

#sun.util.resources.TimeZoneNames
$(eval $(call CaptureLocale,TimeZoneNames))

#sun.util.resources.LocaleNames
$(eval $(call CaptureLocale,LocaleNames))

#sun.util.resources.CurrencyNames
$(eval $(call CaptureLocale,CurrencyNames))

#sun.util.resources.CalendarData
$(eval $(call CaptureLocale,CalendarData))

SED_ARGS += -e 's/$(HASH)AvailableLocales_ENLocales$(HASH)/$(sort $(ALL_EN_LOCALES))/g'
SED_ARGS += -e 's/$(HASH)AvailableLocales_NonENLocales$(HASH)/$(sort $(ALL_NON_EN_LOCALES))/g'

$(JDK_OUTPUTDIR)/gensrc/sun/util/locale/provider/LocaleDataMetaInfo.java: \
    $(JDK_TOPDIR)/src/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template
	$(MKDIR) -p $(@D)
	$(ECHO) Creating sun/util/LocaleDataMetaInfo.java from $(words $(LOCALE_RESOURCES)) found resources.
	$(PRINTF) "PREV_LOCALE_RESOURCES:=$(LOCALE_RESOURCES)" > $(JDK_OUTPUTDIR)/gensrc/_the.locale_resources
	$(SED) $(SED_ARGS) $< > $@

GENSRC_LOCALEDATAMETAINFO := $(JDK_OUTPUTDIR)/gensrc/sun/util/locale/provider/LocaleDataMetaInfo.java

###

GENSRC_CRBC_DST := $(JDK_OUTPUTDIR)/gensrc/sun/util/CoreResourceBundleControl.java
GENSRC_CRBC_CMD := $(JDK_TOPDIR)/make/scripts/localelist.sh

JRE_NONEXIST_LOCALES := en en_US de_DE es_ES fr_FR it_IT ja_JP ko_KR sv_SE zh

$(GENSRC_CRBC_DST): $(JDK_TOPDIR)/src/share/classes/sun/util/CoreResourceBundleControl-XLocales.java.template \
    $(GENSRC_CRBC_CMD)
	$(MKDIR) -p $(@D)
	NAWK="$(NAWK)" SED="$(SED)" $(SH) $(GENSRC_CRBC_CMD) "$(JRE_NONEXIST_LOCALES)" $< $@

GENSRC_LOCALEDATAMETAINFO += $(GENSRC_CRBC_DST)

###
