#
# Copyright (c) 2011, 2012, 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")

# 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 US locales
US_LOCALES:=en en-US

# ja-JP-JP and th-TH-TH need to be manually added, as they don't have any resource files.
ALL_NON_US_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_USLocales# with: en and/or en_US.
define CaptureLocale
    $1_LOCALES := $$(subst _,-,$$(filter-out $1,$$(subst $1_,,$$(filter $1_%,$(LOCALE_RESOURCES)))))
    $1_US_LOCALES := $$(filter $(US_LOCALES),$$($1_LOCALES))
    $1_NON_US_LOCALES := $$(filter-out $(US_LOCALES),$$($1_LOCALES))

    ALL_US_LOCALES += $$($1_US_LOCALES)
    ALL_NON_US_LOCALES += $$($1_NON_US_LOCALES)

    # Don't sed in a space if there are no locales.
    SED_ARGS+= -e 's/$$(HASH)$1_USLocales$$(HASH)/$$(if $$($1_US_LOCALES),$$(SPACE)$$($1_US_LOCALES),)/g'
    SED_ARGS+= -e 's/$$(HASH)$1_NonUSLocales$$(HASH)/$$(if $$($1_NON_US_LOCALES),$$(SPACE)$$($1_NON_US_LOCALES),)/g'
endef

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

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

#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_USLocales$(HASH)/$(sort $(ALL_US_LOCALES))/g'
SED_ARGS+= -e 's/$(HASH)AvailableLocales_NonUSLocales$(HASH)/$(sort $(ALL_NON_US_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)/makefiles/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)

###
