--- old/make/CompileJavaModules.gmk 2018-06-14 11:33:45.086168321 -0700 +++ new/make/CompileJavaModules.gmk 2018-06-14 11:33:44.910168328 -0700 @@ -515,6 +515,7 @@ # Exclude BreakIterator classes that are just used in compile process to generate # data files and shouldn't go in the product jdk.localedata_EXCLUDE_FILES += sun/text/resources/ext/BreakIteratorRules_th.java +jdk.localedata_KEEP_ALL_TRANSLATIONS := true ################################################################################ # There is an issue in sjavac that triggers a warning in jdk.jfr that isn't --- old/make/ZipSource.gmk 2018-06-14 11:33:45.754168298 -0700 +++ new/make/ZipSource.gmk 2018-06-14 11:33:45.534168306 -0700 @@ -68,6 +68,17 @@ # Only evaluate the creation of src.zip in a sub make call when the symlinked # src directory structure has been generated. ifeq ($(SRC_GENERATED), true) + + # Rewrite the EXCLUDE_TRANSLATIONS locales as exclude patters for java files + TRANSLATIONS_PATTERN := $(addprefix %_, $(addsuffix .java, $(EXCLUDE_TRANSLATIONS))) + + # Add excludes for translations for all modules except jdk.localedata + $(foreach s, $(SRC_ZIP_SRCS), \ + $(if $(filter $(notdir $s), jdk.localedata), , \ + $(eval BUILD_SRC_ZIP_EXCLUDE_PATTERNS_$(dir $s) := $$(TRANSLATIONS_PATTERN)) \ + ) \ + ) + $(eval $(call SetupZipArchive, BUILD_SRC_ZIP, \ SRC := $(dir $(SRC_ZIP_SRCS)), \ INCLUDES := $(SRC_ZIP_INCLUDES), \ --- old/make/autoconf/configure.ac 2018-06-14 11:33:46.434168274 -0700 +++ new/make/autoconf/configure.ac 2018-06-14 11:33:46.218168282 -0700 @@ -232,6 +232,7 @@ JDKOPT_DETECT_INTREE_EC JDKOPT_ENABLE_DISABLE_FAILURE_HANDLER JDKOPT_ENABLE_DISABLE_GENERATE_CLASSLIST +JDKOPT_EXCLUDE_TRANSLATIONS ############################################################################### # --- old/make/autoconf/jdk-options.m4 2018-06-14 11:33:47.102168251 -0700 +++ new/make/autoconf/jdk-options.m4 2018-06-14 11:33:46.882168259 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2018, 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 @@ -582,3 +582,25 @@ AC_SUBST(ENABLE_GENERATE_CLASSLIST) ]) + +################################################################################ +# +# Optionally filter resource translations +# +AC_DEFUN([JDKOPT_EXCLUDE_TRANSLATIONS], +[ + AC_ARG_WITH([exclude-translations], [AS_HELP_STRING([--with-exclude-translations], + [a comma separated list of locales to exclude translations for. Default is + to include all translations present in the source.])]) + + EXCLUDE_TRANSLATIONS="" + AC_MSG_CHECKING([if any translations should be excluded]) + if test "x$with_exclude_translations" != "x"; then + EXCLUDE_TRANSLATIONS="${with_exclude_translations//,/ }" + AC_MSG_RESULT([yes: $EXCLUDE_TRANSLATIONS]) + else + AC_MSG_RESULT([no]) + fi + + AC_SUBST(EXCLUDE_TRANSLATIONS) +]) --- old/make/autoconf/spec.gmk.in 2018-06-14 11:33:47.766168228 -0700 +++ new/make/autoconf/spec.gmk.in 2018-06-14 11:33:47.550168236 -0700 @@ -303,6 +303,8 @@ ENABLE_GENERATE_CLASSLIST := @ENABLE_GENERATE_CLASSLIST@ +EXCLUDE_TRANSLATIONS := @EXCLUDE_TRANSLATIONS@ + # The boot jdk to use. This is overridden in bootcycle-spec.gmk. Make sure to keep # it in sync. BOOT_JDK:=@BOOT_JDK@ --- old/make/common/JavaCompilation.gmk 2018-06-14 11:33:48.362168207 -0700 +++ new/make/common/JavaCompilation.gmk 2018-06-14 11:33:48.186168213 -0700 @@ -180,6 +180,7 @@ # CREATE_API_DIGEST:=Set to true to use a javac plugin to generate a public API # hash which can be used for down stream dependencies to only rebuild # when the API changes. Implicitly used in sjavac. +# KEEP_ALL_TRANSLATIONS:=Set to true to skip translation filtering SetupJavaCompilation = $(NamedParamsMacroTemplate) define SetupJavaCompilationBody @@ -266,6 +267,11 @@ $$(eval $1_$$(relative_src) := 1) $$(s)))) endif + # Filter out any excluded translations + ifneq ($$($1_KEEP_ALL_TRANSLATIONS), true) + $1_SRCS := $$(call FilterExcludedTranslations, $$($1_SRCS), .java) + endif + ifeq ($$(strip $$($1_SRCS)), ) ifneq ($$($1_FAIL_NO_SRC), false) $$(error No source files found for $1) @@ -290,6 +296,10 @@ ifneq (,$$($1_EXCLUDE_PATTERN)) $1_ALL_COPIES := $$(filter-out $$($1_EXCLUDE_PATTERN),$$($1_ALL_COPIES)) endif + # Filter out any excluded translations + ifneq ($$($1_KEEP_ALL_TRANSLATIONS), true) + $1_ALL_COPIES := $$(call FilterExcludedTranslations, $$($1_ALL_COPIES), .properties) + endif ifneq (,$$($1_ALL_COPIES)) # Yep, there are files to be copied! $1_ALL_COPY_TARGETS:= @@ -310,6 +320,10 @@ ifneq (,$$($1_EXCLUDE_PATTERN)) $1_ALL_CLEANS := $$(filter-out $$($1_EXCLUDE_PATTERN),$$($1_ALL_CLEANS)) endif + # Filter out any excluded translations + ifneq ($$($1_KEEP_ALL_TRANSLATIONS), true) + $1_ALL_CLEANS := $$(call FilterExcludedTranslations, $$($1_ALL_CLEANS), .properties) + endif ifneq (,$$($1_ALL_CLEANS)) # Yep, there are files to be copied and cleaned! $1_ALL_COPY_CLEAN_TARGETS:= --- old/make/common/MakeBase.gmk 2018-06-14 11:33:48.950168187 -0700 +++ new/make/common/MakeBase.gmk 2018-06-14 11:33:48.774168193 -0700 @@ -1075,6 +1075,22 @@ ) ################################################################################ +# Given a list of files, filters out locale specific files for translations +# that should be excluded from this build. +# $1 - The list of files to filter +# $2 - The suffix of the files that should be considered (.java or .properties) +FilterExcludedTranslations = \ + $(strip $(if $(EXCLUDE_TRANSLATIONS), \ + $(filter-out \ + $(foreach suffix, $2, \ + $(addprefix %_, $(addsuffix $(suffix), $(EXCLUDE_TRANSLATIONS))) \ + ), \ + $1 \ + ), \ + $1 \ + )) + +################################################################################ # Hook to include the corresponding custom file, if present. $(eval $(call IncludeCustomExtension, common/MakeBase.gmk)) --- old/make/common/ZipArchive.gmk 2018-06-14 11:33:49.602168164 -0700 +++ new/make/common/ZipArchive.gmk 2018-06-14 11:33:49.382168172 -0700 @@ -42,6 +42,10 @@ # INCLUDE_FILES # EXCLUDES # EXCLUDE_FILES +# EXCLUDE_PATTERNS - Patterns with at most one % wildcard matching filenames +# and not directories. +# EXCLUDE_PATTERNS_$dir - Exclude patterns just like above but specific to one +# src dir # SUFFIXES # EXTRA_DEPS # ZIP_OPTIONS extra options to pass to zip @@ -88,11 +92,26 @@ $1_ALL_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_ALL_SRCS)) endif ifneq ($$($1_EXCLUDE_FILES),) - # Cannot precompute ZIP_EXCLUDE_FILES as it is dependent on which src root is being - # zipped at the moment. $1_SRC_EXCLUDE_FILES := $$(addprefix %, $$($1_EXCLUDE_FILES)) $$($1_EXCLUDE_FILES) $1_ALL_SRCS := $$(filter-out $$($1_SRC_EXCLUDE_FILES), $$($1_ALL_SRCS)) - endif + $$(foreach s, $$($1_SRC), \ + $$(eval $1_ZIP_EXCLUDES_$$s += \ + $$(addprefix -x$$(SPACE), $$(patsubst $$s/%,%, $$($1_EXCLUDE_FILES))) \ + ) \ + ) + endif + ifneq ($$($1_EXCLUDE_PATTERNS), ) + $1_ALL_SRCS := $$(filter-out $$($1_EXCLUDE_PATTERNS), $$($1_ALL_SRCS)) + $1_ZIP_EXCLUDES += $$(addprefix -x$(SPACE), $$(subst %,\*,$$($1_EXCLUDE_PATTERNS))) + endif + # Rewrite src dir specific exclude patterns to zip excludes + $$(foreach s, $$($1_SRC), \ + $$(if $$($1_EXCLUDE_PATTERNS_$$s), \ + $$(eval $1_ZIP_EXCLUDES_$$s += \ + $$(addprefix -x$$(SPACE), $$(subst %,\*,$$($1_EXCLUDE_PATTERNS_$$s))) \ + ) \ + ) \ + ) # Use a slightly shorter name for logging, but with enough path to identify this zip. $1_NAME:=$$(subst $$(OUTPUTDIR)/,,$$($1_ZIP)) @@ -107,9 +126,9 @@ $$($1_ZIP) : $$($1_ALL_SRCS) $$($1_EXTRA_DEPS) $(MKDIR) -p $$(@D) $(ECHO) Updating $$($1_NAME) - $$(foreach i,$$($1_SRC),(cd $$i && $(ZIPEXE) -qru $$($1_ZIP_OPTIONS) $$@ . $$($1_ZIP_INCLUDES) \ - $$($1_ZIP_EXCLUDES) -x \*_the.\* \ - $$(addprefix -x$(SPACE), $$(patsubst $$i/%,%, $$($1_EXCLUDE_FILES))) \ + $$(foreach s,$$($1_SRC),(cd $$s && $(ZIPEXE) -qru $$($1_ZIP_OPTIONS) $$@ . \ + $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* \ + $$($1_ZIP_EXCLUDES_$$s) \ || test "$$$$?" = "12" )$$(NEWLINE)) true $(TOUCH) $$@ --- old/make/conf/jib-profiles.js 2018-06-14 11:33:50.278168141 -0700 +++ new/make/conf/jib-profiles.js 2018-06-14 11:33:50.062168148 -0700 @@ -242,7 +242,8 @@ dependencies: ["boot_jdk", "gnumake", "jtreg", "jib"], default_make_targets: ["product-bundles", "test-bundles"], configure_args: concat(["--enable-jtreg-failure-handler"], - versionArgs(input, common)) + "--with-exclude-translations=de,es,fr,it,ko,pt_BR,sv,ca,tr,cs,sk,ja_JP_A,ja_JP_HA,ja_JP_HI,ja_JP_I", + versionArgs(input, common)) }; // Extra settings for debug profiles common.debug_suffix = "-debug"; --- old/make/gensrc/Gensrc-jdk.localedata.gmk 2018-06-14 11:33:50.962168117 -0700 +++ new/make/gensrc/Gensrc-jdk.localedata.gmk 2018-06-14 11:33:50.742168124 -0700 @@ -38,6 +38,7 @@ $(eval $(call SetupCompileProperties, COMPILE_PROPERTIES, \ SRC_DIRS := $(TOPDIR)/src/jdk.localedata/share/classes/sun/util/resources, \ CLASS := sun.util.resources.LocaleNamesBundle, \ + KEEP_ALL_TRANSLATIONS := true, \ )) # Skip generating zh_HK from zh_TW for this module. --- old/make/gensrc/GensrcCommonLangtools.gmk 2018-06-14 11:33:51.646168093 -0700 +++ new/make/gensrc/GensrcCommonLangtools.gmk 2018-06-14 11:33:51.426168101 -0700 @@ -66,6 +66,9 @@ PROPSOURCES := $2 \ $$(shell $(FIND) $(TOPDIR)/src/$(MODULE)/share/classes -name "*.properties") + # Filter out any excluded translations + PROPSOURCES := $$(call FilterExcludedTranslations, $$(PROPSOURCES), .properties) + # Convert .../src//share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties # to .../langtools/gensrc//com/sun/tools/javac/resources/javac_zh_CN.java # Strip away prefix and suffix, leaving for example only: @@ -105,6 +108,7 @@ define SetupParseProperties # property files to process PARSEPROPSOURCES := $$(addprefix $(TOPDIR)/src/$(MODULE)/share/classes/, $2) + PARSEPROPSOURCES := $$(call FilterExcludedTranslations, $$(PARSEPROPSOURCES), .properties) PARSEPROPALLDIRS := $$(patsubst $(TOPDIR)/src/$(MODULE)/share/classes/%, \ $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/%, \ --- old/make/gensrc/GensrcProperties.gmk 2018-06-14 11:33:52.306168070 -0700 +++ new/make/gensrc/GensrcProperties.gmk 2018-06-14 11:33:52.090168077 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2018, 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 @@ -59,6 +59,7 @@ # EXCLUDE Exclude files matching this pattern. # CLASS The super class for the generated classes. # MODULE_PATH_ROOT Module path root, defaults to $(TOPDIR)/src. +# KEEP_ALL_TRANSLATIONS Set to true to skip filtering of excluded translations. SetupCompileProperties = $(NamedParamsMacroTemplate) define SetupCompilePropertiesBody # Set default value unless overridden @@ -73,10 +74,13 @@ $1_SRC_FILES := $$(filter-out $$($1_EXCLUDE), $$($1_SRC_FILES)) endif + # Filter out any excluded translations + ifneq ($$($1_KEEP_ALL_TRANSLATIONS), true) + $1_SRC_FILES := $$(call FilterExcludedTranslations, $$($1_SRC_FILES), .properties) + endif + # Convert .../src//share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties # to .../support/gensrc//com/sun/tools/javac/resources/javac_zh_CN.java - # Strip away prefix and suffix, leaving for example only: - # "/share/classes/com/sun/tools/javac/resources/javac_zh_CN" $1_JAVAS := $$(patsubst $$($1_MODULE_PATH_ROOT)/%, \ $(SUPPORT_OUTPUTDIR)/gensrc/%, \ $$(patsubst %.properties, %.java, \ @@ -99,7 +103,7 @@ $1_TARGET := $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/_the.$1.marker $1_CMDLINE_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/_the.$1.cmdline -# Now setup the rule for the generation of the resource bundles. + # Now setup the rule for the generation of the resource bundles. $$($1_TARGET): $$($1_SRC_FILES) $$($1_JAVAS) $(BUILD_TOOLS_JDK) $(MKDIR) -p $$(@D) $$($1_DIRS) $(ECHO) Compiling $$(words $$($1_SRC_FILES)) properties into resource bundles for $(MODULE) --- old/test/jdk/TEST.ROOT 2018-06-14 11:33:52.978168046 -0700 +++ new/test/jdk/TEST.ROOT 2018-06-14 11:33:52.758168054 -0700 @@ -38,7 +38,8 @@ sun.arch.data.model \ java.runtime.name \ vm.graal.enabled \ - vm.cds + vm.cds \ + release.implementor # Minimum jtreg version requiredVersion=4.2 b12 --- old/test/jdk/TEST.groups 2018-06-14 11:33:53.642168023 -0700 +++ new/test/jdk/TEST.groups 2018-06-14 11:33:53.426168031 -0700 @@ -30,7 +30,7 @@ :tier1_part1 \ :tier1_part2 \ :tier1_part3 - + tier1_part1 = \ :jdk_lang @@ -39,7 +39,6 @@ -java/util/Arrays/TimSortStackSize2.java tier1_part3 = \ - :build_sanity \ :jdk_math \ :jdk_svc_sanity \ java/nio/Buffer \ @@ -74,8 +73,9 @@ tier2_part3 = \ :jdk_net - + tier3 = \ + :build \ :jdk_rmi \ :jdk_beans \ :jdk_imageio \ @@ -88,8 +88,8 @@ # # Build source checking -build_sanity = \ - sanity/releaseFile +build = \ + build # java.lang package and VM runtime support jdk_lang = \ --- old/test/jdk/java/util/logging/LocalizedLevelName.java 2018-06-14 11:33:54.318168000 -0700 +++ new/test/jdk/java/util/logging/LocalizedLevelName.java 2018-06-14 11:33:54.098168007 -0700 @@ -34,19 +34,19 @@ public class LocalizedLevelName { private static Object[] namesMap = { - "SEVERE", Locale.ENGLISH, "Severe", Level.SEVERE, - "WARNING", Locale.FRENCH, "Avertissement", Level.WARNING, - "INFO", Locale.ITALIAN, "Informazioni", Level.INFO, - "SEVERE", Locale.FRENCH, "Grave", Level.SEVERE, - "CONFIG", Locale.GERMAN, "Konfiguration", Level.CONFIG, - "ALL", Locale.ROOT, "All", Level.ALL, - "SEVERE", Locale.ROOT, "Severe", Level.SEVERE, - "WARNING", Locale.ROOT, "Warning", Level.WARNING, - "CONFIG", Locale.ROOT, "Config", Level.CONFIG, - "INFO", Locale.ROOT, "Info", Level.INFO, - "FINE", Locale.ROOT, "Fine", Level.FINE, - "FINER", Locale.ROOT, "Finer", Level.FINER, - "FINEST", Locale.ROOT, "Finest", Level.FINEST + "SEVERE", Locale.ENGLISH, "Severe", Level.SEVERE, + "WARNING", Locale.JAPANESE, "\u8B66\u544A", Level.WARNING, + "INFO", Locale.SIMPLIFIED_CHINESE, "\u4FE1\u606F", Level.INFO, + "SEVERE", Locale.TRADITIONAL_CHINESE, "\u56B4\u91CD", Level.SEVERE, + "CONFIG", Locale.forLanguageTag("zh-HK"), "\u7D44\u614B", Level.CONFIG, + "ALL", Locale.ROOT, "All", Level.ALL, + "SEVERE", Locale.ROOT, "Severe", Level.SEVERE, + "WARNING", Locale.ROOT, "Warning", Level.WARNING, + "CONFIG", Locale.ROOT, "Config", Level.CONFIG, + "INFO", Locale.ROOT, "Info", Level.INFO, + "FINE", Locale.ROOT, "Fine", Level.FINE, + "FINER", Locale.ROOT, "Finer", Level.FINER, + "FINEST", Locale.ROOT, "Finest", Level.FINEST }; public static void main(String args[]) throws Exception { --- old/test/jtreg-ext/requires/VMProps.java 2018-06-14 11:33:54.998167976 -0700 +++ new/test/jtreg-ext/requires/VMProps.java 2018-06-14 11:33:54.778167984 -0700 @@ -22,7 +22,10 @@ */ package requires; +import java.io.BufferedInputStream; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -31,6 +34,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; @@ -79,6 +83,7 @@ // vm.graal.enabled is true if Graal is used as JIT map.put("vm.graal.enabled", isGraalEnabled()); map.put("docker.support", dockerSupport()); + map.put("release.implementor", implementor()); vmGC(map); // vm.gc.X = true/false vmOptFinalFlags(map); @@ -421,6 +426,18 @@ } + private String implementor() { + try (InputStream in = new BufferedInputStream(new FileInputStream( + System.getProperty("java.home") + "/release"))) { + Properties properties = new Properties(); + properties.load(in); + return properties.getProperty("IMPLEMENTOR").replace("\"", ""); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + /** * Dumps the map to the file if the file name is given as the property. --- old/test/jdk/sanity/releaseFile/CheckSource.java 2018-06-14 11:33:55.790167949 -0700 +++ /dev/null 2018-05-25 16:30:56.425740436 -0700 @@ -1,120 +0,0 @@ - -/* - * Copyright (c) 2018, 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. - * - * 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. - */ - -/* - * @test - * @bug 8193660 - * @summary Check SOURCE line in "release" file for closedjdk - * @run main CheckSource - */ - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.FileNotFoundException; -import java.io.IOException; - -public class CheckSource { - - CheckSource(String dataFile, boolean isOpenJDK) { - // Read data files - readFile(dataFile, isOpenJDK); - } - - private void readFile(String fileName, boolean isOpenJDK) { - String fishForSOURCE = null; - - File file = new File(fileName); - - // open the stream to read in for Entries - try (BufferedReader buffRead = - new BufferedReader(new FileReader(fileName))) { - - // this is the string read - String readIn; - - // let's read some strings! - while ((readIn = buffRead.readLine()) != null) { - readIn = readIn.trim(); - - // throw out blank lines - if (readIn.length() == 0) - continue; - - // grab SOURCE line - if (readIn.startsWith("SOURCE=")) { - fishForSOURCE = readIn; - break; - } - } - } catch (FileNotFoundException fileExcept) { - throw new RuntimeException("File " + fileName + - " not found reading data!", fileExcept); - } catch (IOException ioExcept) { - throw new RuntimeException("Unexpected problem reading data!", - ioExcept); - } - - // was SOURCE even found? - if (fishForSOURCE == null) { - throw new RuntimeException("SOURCE line was not found!"); - } else { - // OK it was found, did it have correct sources? - System.out.println("The source string found: " + fishForSOURCE); - - // First it MUST have .: regardless of closed or openJDK - if (!fishForSOURCE.contains(".:")) { - throw new RuntimeException("The test failed, .: not found!"); - } - // take out the .: source path - fishForSOURCE = fishForSOURCE.replace(".:", ""); - - // if its closedJDK it MUST have open: - if (!isOpenJDK && !fishForSOURCE.contains("open:")) { - throw new RuntimeException("The test failed, open: not found!"); - } - // take out the open: source path - fishForSOURCE = fishForSOURCE.replace("open:", ""); - - // if any other source exists, that's an error - if (fishForSOURCE.contains(":")) { - throw new RuntimeException("The test failed, additional sources found!"); - } - } - - // Everything was fine - System.out.println("The test passed!"); - } - - public static void main(String args[]) { - String jdkPath = System.getProperty("test.jdk"); - String runtime = System.getProperty("java.runtime.name"); - - System.out.println("JDK Path : " + jdkPath); - System.out.println("Runtime Name : " + runtime); - - new CheckSource(jdkPath + "/release", - runtime.contains("OpenJDK")); - } -} --- /dev/null 2018-05-25 16:30:56.425740436 -0700 +++ new/test/jdk/build/releaseFile/CheckSource.java 2018-06-14 11:33:55.454167960 -0700 @@ -0,0 +1,120 @@ + +/* + * Copyright (c) 2018, 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. + * + * 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. + */ + +/* + * @test + * @bug 8193660 + * @summary Check SOURCE line in "release" file for closedjdk + * @run main CheckSource + */ + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class CheckSource { + + CheckSource(String dataFile, boolean isOpenJDK) { + // Read data files + readFile(dataFile, isOpenJDK); + } + + private void readFile(String fileName, boolean isOpenJDK) { + String fishForSOURCE = null; + + File file = new File(fileName); + + // open the stream to read in for Entries + try (BufferedReader buffRead = + new BufferedReader(new FileReader(fileName))) { + + // this is the string read + String readIn; + + // let's read some strings! + while ((readIn = buffRead.readLine()) != null) { + readIn = readIn.trim(); + + // throw out blank lines + if (readIn.length() == 0) + continue; + + // grab SOURCE line + if (readIn.startsWith("SOURCE=")) { + fishForSOURCE = readIn; + break; + } + } + } catch (FileNotFoundException fileExcept) { + throw new RuntimeException("File " + fileName + + " not found reading data!", fileExcept); + } catch (IOException ioExcept) { + throw new RuntimeException("Unexpected problem reading data!", + ioExcept); + } + + // was SOURCE even found? + if (fishForSOURCE == null) { + throw new RuntimeException("SOURCE line was not found!"); + } else { + // OK it was found, did it have correct sources? + System.out.println("The source string found: " + fishForSOURCE); + + // First it MUST have .: regardless of closed or openJDK + if (!fishForSOURCE.contains(".:")) { + throw new RuntimeException("The test failed, .: not found!"); + } + // take out the .: source path + fishForSOURCE = fishForSOURCE.replace(".:", ""); + + // if its closedJDK it MUST have open: + if (!isOpenJDK && !fishForSOURCE.contains("open:")) { + throw new RuntimeException("The test failed, open: not found!"); + } + // take out the open: source path + fishForSOURCE = fishForSOURCE.replace("open:", ""); + + // if any other source exists, that's an error + if (fishForSOURCE.contains(":")) { + throw new RuntimeException("The test failed, additional sources found!"); + } + } + + // Everything was fine + System.out.println("The test passed!"); + } + + public static void main(String args[]) { + String jdkPath = System.getProperty("test.jdk"); + String runtime = System.getProperty("java.runtime.name"); + + System.out.println("JDK Path : " + jdkPath); + System.out.println("Runtime Name : " + runtime); + + new CheckSource(jdkPath + "/release", + runtime.contains("OpenJDK")); + } +} --- /dev/null 2018-05-25 16:30:56.425740436 -0700 +++ new/test/jdk/build/translations/VerifyTranslations.java 2018-06-14 11:33:56.026167940 -0700 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2018, 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. + * + * 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. + */ + +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * @test + * @requires release.implementor == "Oracle Corporation" + * @modules jdk.jlink/jdk.tools.jimage + * @summary Oracle builds of OpenJDK should only contain english, chinese and + * japanese translations + */ +public class VerifyTranslations { + + /** + * The set of translations we want to see in an Oracle built image + */ + private static final Set VALID_TRANSLATION_SUFFIXES = Set.of( + "_en", "_en_US", "_en_US_POSIX", "_ja", "_zh_CN", "_zh_TW", "_zh_HK" + ); + + /** + * This regexp will not match locales with 3 letter lang strings because + * doing so would trigger a ton of false positives all over the source + * tree. This is ok for now but is a potential future flaw in the test. + */ + private static final String BASE_LOCALE_REGEXP + = "(_[a-z]{2}(_[A-Z][a-z]{3})?(_([A-Z]{2})|([0-9]{3}))?(_[a-zA-Z]+)?)"; + + public static void main(String[] args) { + String jdkPath = System.getProperty("test.jdk"); + String modulesFile = jdkPath + "/lib/modules"; + + // Run jimage tool to extract list of all classes and resources in the jdk + StringWriter output = new StringWriter(); + jdk.tools.jimage.Main.run(new String[] { "list", modulesFile }, new PrintWriter(output)); + + Pattern classesLocalePattern = Pattern.compile(BASE_LOCALE_REGEXP + "\\.(class|properties)"); + + boolean failed = false; + String module = ""; + for (String line : output.toString().split("\n")) { + if (line.startsWith("Module: ")) { + module = line.substring(8).trim(); + } + // We do not filter resources in jdk.localedata + if (!module.equals("jdk.localedata")) { + Matcher matcher = classesLocalePattern.matcher(line); + if (matcher.find()) { + if (!VALID_TRANSLATION_SUFFIXES.contains(matcher.group(1))) { + System.out.println("Unsupported translation found in lib/modules: " + + module + "/" + line.trim()); + failed = true; + } + } + } + } + + // Check all files in src.zip + Pattern sourceLocalePattern = Pattern.compile(BASE_LOCALE_REGEXP + "\\.java"); + String srcZip = jdkPath + "/lib/src.zip"; + try (ZipInputStream srcZipInput = new ZipInputStream( + new BufferedInputStream(new FileInputStream(srcZip)))) { + ZipEntry entry; + while ((entry = srcZipInput.getNextEntry()) != null) { + String name = entry.getName(); + if (!name.startsWith("jdk.localedata")) { + Matcher matcher = sourceLocalePattern.matcher(name); + if (matcher.find()) { + if (!VALID_TRANSLATION_SUFFIXES.contains(matcher.group(1))) { + System.out.println("Unsupported translation found in lib/src.zip: " + name); + failed = true; + } + } + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + if (failed) { + throw new RuntimeException("lib/modules contains unsupported translations"); + } + } +}