--- old/make/jdk/src/classes/build/tools/generatenimbus/Generator.java 2020-03-23 19:57:09.939962456 +0100 +++ /dev/null 2020-02-11 10:29:13.086348146 +0100 @@ -1,273 +0,0 @@ -/* - * Copyright (c) 2002, 2013, 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. - */ -package build.tools.generatenimbus; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import java.io.*; -import java.util.HashMap; -import java.util.Map; - -/** - * Generates the various Java artifacts based on a SynthModel. - *

- * Generated source files are split up among two different locations. There are those source files that are meant to be - * edited (generally, only the LookAndFeel class itself) and those that are autogenerated (everything else). - *

- * All autogenerated files are placed in "buildPackageRoot" and are package private. A LAF author (one who has access to - * the generated sources) will be able to access any of the generated classes. Those referencing the library, however, - * will only be able to access the main LookAndFeel class itself (since everything else is package private). - * - * @author Richard Bair - * @author Jasper Potts - */ -public class Generator { - private static Generator instance; - - /** A map of variables that are used for variable substitution in the template files. */ - private Map variables; - private boolean full = false; - private File buildPackageRoot; - private String packageNamePrefix; - private String lafName; - private SynthModel model; - - /** - * MAIN APPLICATION - *

- * This is for using the generator as part of the java build process - * - * @param args The commandline arguments - */ - public static void main(String[] args) throws Exception { - if (args.length == 0 || (args.length % 2) != 0) { - System.out.println("Usage: generator [-options]\n" + - " -full True if we should build the whole LAF or false for building just states and painters.\n" + - " -skinFile Path to the skin.laf file for the LAF to be generated from.\n" + - " -buildDir The directory beneath which the build-controlled artifacts (such as the Painters) should\n" + - " be placed. This is the root directory beneath which the necessary packages and source\n" + - " files will be created.\n" + - " -resourcesDir The resources directory containing templates and images.\n" + - " -packagePrefix The package name associated with this synth look and feel. For example,\n" + - " \"org.mypackage.mylaf\"\n" + - " -lafName The name of the laf, such as \"MyLAF\".\n"); - } else { - boolean full = false; - File skinFile = new File(System.getProperty("user.dir")); - File buildDir = new File(System.getProperty("user.dir")); - File resourcesDir = new File(System.getProperty("user.dir")); - String packagePrefix = "org.mypackage.mylaf"; - String lafName = "MyLAF"; - for (int i = 0; i < args.length; i += 2) { - String key = args[i].trim().toLowerCase(); - String value = args[i + 1].trim(); - if ("-full".equals(key)) { - full = Boolean.parseBoolean(value); - } else if ("-skinfile".equals(key)) { - skinFile = new File(value); - } else if ("-builddir".equals(key)) { - buildDir = new File(value); - } else if ("-resourcesdir".equals(key)) { - resourcesDir = new File(value); - } else if ("-packageprefix".equals(key)) { - packagePrefix = value; - } else if ("-lafname".equals(key)) { - lafName = value; - } - } - System.out.println("### GENERATING LAF CODE ################################"); - System.out.println(" full :" + full); - System.out.println(" skinFile :" + skinFile.getAbsolutePath()); - System.out.println(" buildDir :" + buildDir.getAbsolutePath()); - System.out.println(" resourcesDir :" + resourcesDir.getAbsolutePath()); - System.out.println(" packagePrefix :" +packagePrefix); - System.out.println(" lafName :" +lafName); - - SynthModel model; - XMLInputFactory inputFactory = XMLInputFactory.newInstance(); - XMLStreamReader reader; - try( InputStream fis = new FileInputStream(skinFile); - InputStream is = new BufferedInputStream(fis)) { - reader = inputFactory.createXMLStreamReader(is); - model = new SynthModel(reader); - } - Generator.init(full, buildDir, packagePrefix, lafName, model); - Generator.getInstance().generate(); - } - } - - /** - * Creates a new Generator, capable of outputting the source code artifacts related to a given SynthModel. It is - * capable of generating the one-time artifacts in addition to the regeneration of build-controlled artifacts. - * - * @param full True if we should build the whole LAF or false for building just states and painters. - * @param buildDir The directory beneath which the build-controlled artifacts (such as the Painters) should - * be placed. This is the root directory beneath which the necessary packages and source - * files will be created. - * @param srcDir The directory beneath which the normal user-controlled artifacts (such as the core - * LookAndFeel file) should be placed. These are one-time generated files. This is the root - * directory beneath which the necessary packages and source files will be created. - * @param packageNamePrefix The package name associated with this synth look and feel. For example, - * org.mypackage.mylaf - * @param lafName The name of the laf, such as MyLAF. - * @param model The actual SynthModel to base these generated files on. - */ - private Generator(boolean full, File buildDir, - String packageNamePrefix, String lafName, SynthModel model) { - this.full = full; - //validate the input variables - if (packageNamePrefix == null) { - throw new IllegalArgumentException("You must specify a package name prefix"); - } - if (buildDir == null) { - throw new IllegalArgumentException("You must specify the build directory"); - } - if (model == null) { - throw new IllegalArgumentException("You must specify the SynthModel"); - } - if (lafName == null) { - throw new IllegalArgumentException("You must specify the name of the look and feel"); - } - - //construct the map which is used to do variable substitution of the template - //files - variables = new HashMap(); - variables.put("PACKAGE", packageNamePrefix); - variables.put("LAF_NAME", lafName); - - //generate and save references to the package-root directories. - //(That is, given the buildDir and srcDir, generate references to the - //org.mypackage.mylaf subdirectories) - buildPackageRoot = new File(buildDir, packageNamePrefix.replaceAll("\\.", "\\/")); - buildPackageRoot.mkdirs(); - - //save the variables - this.packageNamePrefix = packageNamePrefix; - this.lafName = lafName; - this.model = model; - } - - public static void init(boolean full, File buildDir, - String packageNamePrefix, String lafName, SynthModel model) { - instance = new Generator(full, buildDir, packageNamePrefix, lafName, model); - model.initStyles(); - } - - public static Generator getInstance() { - return instance; - } - - public static Map getVariables() { - return new HashMap(instance.variables); - } - - public void generate() { - if (full) { - //create the LookAndFeel file - writeSrcFileImpl("LookAndFeel", variables, lafName + "LookAndFeel"); - - writeSrcFileImpl("AbstractRegionPainter", variables); - writeSrcFileImpl("BlendingMode", variables); - writeSrcFileImpl("SynthPainterImpl", variables); - writeSrcFileImpl("IconImpl", variables, lafName + "Icon.java"); - writeSrcFileImpl("StyleImpl", variables, lafName + "Style.java"); - writeSrcFileImpl("Effect", variables); - writeSrcFileImpl("EffectUtils", variables); - writeSrcFileImpl("ShadowEffect", variables); - writeSrcFileImpl("DropShadowEffect", variables); - writeSrcFileImpl("InnerShadowEffect", variables); - writeSrcFileImpl("InnerGlowEffect", variables); - writeSrcFileImpl("OuterGlowEffect", variables); - writeSrcFileImpl("State", variables); - writeSrcFileImpl("ImageCache", variables); - writeSrcFileImpl("ImageScalingHelper", variables); - } - //next, populate the first set of ui defaults based on what is in the - //various palettes of the synth model - StringBuilder defBuffer = new StringBuilder(); - StringBuilder styleBuffer = new StringBuilder(); - model.write(defBuffer, styleBuffer, packageNamePrefix); - - Map vars = getVariables(); - vars.put("UI_DEFAULT_INIT", defBuffer.toString()); - vars.put("STYLE_INIT", styleBuffer.toString()); - writeSrcFile("Defaults", vars, lafName + "Defaults"); - } - - private void writeSrcFileImpl(String name, Map variables) { - writeSrcFileImpl(name, variables, name); - } - - private void writeSrcFileImpl(String templateName, - Map variables, String outputName) { - PrintWriter out = null; - try { - InputStream stream = getClass().getResourceAsStream( - "resources/" + templateName + ".template"); - TemplateReader in = new TemplateReader(variables, stream); - - out = new PrintWriter(new File(buildPackageRoot, outputName + ".java")); - String line = in.readLine(); - while (line != null) { - out.println(line); - line = in.readLine(); - } - } catch (IOException e) { - throw new RuntimeException("IOException in writer", e); - } finally { - if (out != null) out.close(); - } - } - - public static void writeSrcFile(String templateName, - Map variables, String outputName) { - instance.writeSrcFileImpl(templateName, variables, outputName); - } - - /** A BufferedReader implementation that automatically performs - * string replacements as needed. - */ - private static final class TemplateReader extends BufferedReader { - private Map variables; - - TemplateReader(Map variables, InputStream template) { - super(new InputStreamReader(template)); - this.variables = variables; - } - - @Override public String readLine() throws IOException { - return substituteVariables(super.readLine()); - } - - private String substituteVariables(String input) { - if (input == null) return null; - for (Map.Entry variable : variables.entrySet()) { - input = input.replace("${" + variable.getKey() + "}", variable.getValue()); - } - return input; - } - } -} --- /dev/null 2020-02-11 10:29:13.086348146 +0100 +++ new/src/java.desktop/share/tools/org/openjdk/buildtools/generatenimbus/Generator.java 2020-03-23 19:57:09.515962459 +0100 @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2002, 2013, 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. + */ +package org.openjdk.buildtools.generatenimbus; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.io.*; +import java.util.HashMap; +import java.util.Map; + +/** + * Generates the various Java artifacts based on a SynthModel. + *

+ * Generated source files are split up among two different locations. There are those source files that are meant to be + * edited (generally, only the LookAndFeel class itself) and those that are autogenerated (everything else). + *

+ * All autogenerated files are placed in "buildPackageRoot" and are package private. A LAF author (one who has access to + * the generated sources) will be able to access any of the generated classes. Those referencing the library, however, + * will only be able to access the main LookAndFeel class itself (since everything else is package private). + * + * @author Richard Bair + * @author Jasper Potts + */ +public class Generator { + private static Generator instance; + + /** A map of variables that are used for variable substitution in the template files. */ + private Map variables; + private boolean full = false; + private File buildPackageRoot; + private String packageNamePrefix; + private String lafName; + private SynthModel model; + + /** + * MAIN APPLICATION + *

+ * This is for using the generator as part of the java build process + * + * @param args The commandline arguments + */ + public static void main(String[] args) throws Exception { + if (args.length == 0 || (args.length % 2) != 0) { + System.out.println("Usage: generator [-options]\n" + + " -full True if we should build the whole LAF or false for building just states and painters.\n" + + " -skinFile Path to the skin.laf file for the LAF to be generated from.\n" + + " -buildDir The directory beneath which the build-controlled artifacts (such as the Painters) should\n" + + " be placed. This is the root directory beneath which the necessary packages and source\n" + + " files will be created.\n" + + " -resourcesDir The resources directory containing templates and images.\n" + + " -packagePrefix The package name associated with this synth look and feel. For example,\n" + + " \"org.mypackage.mylaf\"\n" + + " -lafName The name of the laf, such as \"MyLAF\".\n"); + } else { + boolean full = false; + File skinFile = new File(System.getProperty("user.dir")); + File buildDir = new File(System.getProperty("user.dir")); + File resourcesDir = new File(System.getProperty("user.dir")); + String packagePrefix = "org.mypackage.mylaf"; + String lafName = "MyLAF"; + for (int i = 0; i < args.length; i += 2) { + String key = args[i].trim().toLowerCase(); + String value = args[i + 1].trim(); + if ("-full".equals(key)) { + full = Boolean.parseBoolean(value); + } else if ("-skinfile".equals(key)) { + skinFile = new File(value); + } else if ("-builddir".equals(key)) { + buildDir = new File(value); + } else if ("-resourcesdir".equals(key)) { + resourcesDir = new File(value); + } else if ("-packageprefix".equals(key)) { + packagePrefix = value; + } else if ("-lafname".equals(key)) { + lafName = value; + } + } + System.out.println("### GENERATING LAF CODE ################################"); + System.out.println(" full :" + full); + System.out.println(" skinFile :" + skinFile.getAbsolutePath()); + System.out.println(" buildDir :" + buildDir.getAbsolutePath()); + System.out.println(" resourcesDir :" + resourcesDir.getAbsolutePath()); + System.out.println(" packagePrefix :" +packagePrefix); + System.out.println(" lafName :" +lafName); + + SynthModel model; + XMLInputFactory inputFactory = XMLInputFactory.newInstance(); + XMLStreamReader reader; + try( InputStream fis = new FileInputStream(skinFile); + InputStream is = new BufferedInputStream(fis)) { + reader = inputFactory.createXMLStreamReader(is); + model = new SynthModel(reader); + } + Generator.init(full, buildDir, packagePrefix, lafName, model); + Generator.getInstance().generate(); + } + } + + /** + * Creates a new Generator, capable of outputting the source code artifacts related to a given SynthModel. It is + * capable of generating the one-time artifacts in addition to the regeneration of build-controlled artifacts. + * + * @param full True if we should build the whole LAF or false for building just states and painters. + * @param buildDir The directory beneath which the build-controlled artifacts (such as the Painters) should + * be placed. This is the root directory beneath which the necessary packages and source + * files will be created. + * @param srcDir The directory beneath which the normal user-controlled artifacts (such as the core + * LookAndFeel file) should be placed. These are one-time generated files. This is the root + * directory beneath which the necessary packages and source files will be created. + * @param packageNamePrefix The package name associated with this synth look and feel. For example, + * org.mypackage.mylaf + * @param lafName The name of the laf, such as MyLAF. + * @param model The actual SynthModel to base these generated files on. + */ + private Generator(boolean full, File buildDir, + String packageNamePrefix, String lafName, SynthModel model) { + this.full = full; + //validate the input variables + if (packageNamePrefix == null) { + throw new IllegalArgumentException("You must specify a package name prefix"); + } + if (buildDir == null) { + throw new IllegalArgumentException("You must specify the build directory"); + } + if (model == null) { + throw new IllegalArgumentException("You must specify the SynthModel"); + } + if (lafName == null) { + throw new IllegalArgumentException("You must specify the name of the look and feel"); + } + + //construct the map which is used to do variable substitution of the template + //files + variables = new HashMap(); + variables.put("PACKAGE", packageNamePrefix); + variables.put("LAF_NAME", lafName); + + //generate and save references to the package-root directories. + //(That is, given the buildDir and srcDir, generate references to the + //org.mypackage.mylaf subdirectories) + buildPackageRoot = new File(buildDir, packageNamePrefix.replaceAll("\\.", "\\/")); + buildPackageRoot.mkdirs(); + + //save the variables + this.packageNamePrefix = packageNamePrefix; + this.lafName = lafName; + this.model = model; + } + + public static void init(boolean full, File buildDir, + String packageNamePrefix, String lafName, SynthModel model) { + instance = new Generator(full, buildDir, packageNamePrefix, lafName, model); + model.initStyles(); + } + + public static Generator getInstance() { + return instance; + } + + public static Map getVariables() { + return new HashMap(instance.variables); + } + + public void generate() { + if (full) { + //create the LookAndFeel file + writeSrcFileImpl("LookAndFeel", variables, lafName + "LookAndFeel"); + + writeSrcFileImpl("AbstractRegionPainter", variables); + writeSrcFileImpl("BlendingMode", variables); + writeSrcFileImpl("SynthPainterImpl", variables); + writeSrcFileImpl("IconImpl", variables, lafName + "Icon.java"); + writeSrcFileImpl("StyleImpl", variables, lafName + "Style.java"); + writeSrcFileImpl("Effect", variables); + writeSrcFileImpl("EffectUtils", variables); + writeSrcFileImpl("ShadowEffect", variables); + writeSrcFileImpl("DropShadowEffect", variables); + writeSrcFileImpl("InnerShadowEffect", variables); + writeSrcFileImpl("InnerGlowEffect", variables); + writeSrcFileImpl("OuterGlowEffect", variables); + writeSrcFileImpl("State", variables); + writeSrcFileImpl("ImageCache", variables); + writeSrcFileImpl("ImageScalingHelper", variables); + } + //next, populate the first set of ui defaults based on what is in the + //various palettes of the synth model + StringBuilder defBuffer = new StringBuilder(); + StringBuilder styleBuffer = new StringBuilder(); + model.write(defBuffer, styleBuffer, packageNamePrefix); + + Map vars = getVariables(); + vars.put("UI_DEFAULT_INIT", defBuffer.toString()); + vars.put("STYLE_INIT", styleBuffer.toString()); + writeSrcFile("Defaults", vars, lafName + "Defaults"); + } + + private void writeSrcFileImpl(String name, Map variables) { + writeSrcFileImpl(name, variables, name); + } + + private void writeSrcFileImpl(String templateName, + Map variables, String outputName) { + PrintWriter out = null; + try { + InputStream stream = getClass().getResourceAsStream( + "resources/" + templateName + ".template"); + TemplateReader in = new TemplateReader(variables, stream); + + out = new PrintWriter(new File(buildPackageRoot, outputName + ".java")); + String line = in.readLine(); + while (line != null) { + out.println(line); + line = in.readLine(); + } + } catch (IOException e) { + throw new RuntimeException("IOException in writer", e); + } finally { + if (out != null) out.close(); + } + } + + public static void writeSrcFile(String templateName, + Map variables, String outputName) { + instance.writeSrcFileImpl(templateName, variables, outputName); + } + + /** A BufferedReader implementation that automatically performs + * string replacements as needed. + */ + private static final class TemplateReader extends BufferedReader { + private Map variables; + + TemplateReader(Map variables, InputStream template) { + super(new InputStreamReader(template)); + this.variables = variables; + } + + @Override public String readLine() throws IOException { + return substituteVariables(super.readLine()); + } + + private String substituteVariables(String input) { + if (input == null) return null; + for (Map.Entry variable : variables.entrySet()) { + input = input.replace("${" + variable.getKey() + "}", variable.getValue()); + } + return input; + } + } +}