You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by lk...@apache.org on 2020/09/10 00:21:33 UTC

[netbeans] branch master updated: [NETBEANS-4233] Avoiding use of Nashorn (removed in JDK 15) in J2SE multi-module projects by re-writing the JavaScript code into Java.

This is an automated email from the ASF dual-hosted git repository.

lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 61e52a8  [NETBEANS-4233] Avoiding use of Nashorn (removed in JDK 15) in J2SE multi-module projects by re-writing the JavaScript code into Java.
61e52a8 is described below

commit 61e52a80740fde8863a26157339f825d6e21c7af
Author: Jan Lahoda <jl...@netbeans.org>
AuthorDate: Sat Aug 22 21:19:08 2020 +0200

    [NETBEANS-4233] Avoiding use of Nashorn (removed in JDK 15) in J2SE multi-module projects by re-writing the JavaScript code into Java.
---
 .../java/j2semodule/resources/build-impl.xsl       | 376 +++++++++++++--------
 1 file changed, 241 insertions(+), 135 deletions(-)

diff --git a/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/resources/build-impl.xsl b/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/resources/build-impl.xsl
index 97cb56e..ec50ef2 100644
--- a/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/resources/build-impl.xsl
+++ b/java/java.j2semodule/src/org/netbeans/modules/java/j2semodule/resources/build-impl.xsl
@@ -133,10 +133,237 @@ is divided into following sections:
                 <property name="default.javac.target" value="9"/>
             </target>
             
-            <target name="-init-project">
+            <target name="-init-pre-project">
                 <xsl:attribute name="depends">-pre-init,-init-private<xsl:if test="/p:project/p:configuration/libs:libraries/libs:definitions">,-init-libraries</xsl:if>,-init-user</xsl:attribute>
                 <property file="nbproject/configs/${{config}}.properties"/>
                 <property file="nbproject/project.properties"/>
+                <property name="netbeans.modular.tasks.version" value="1" />
+                <property name="netbeans.modular.tasks.dir" location="${{build.dir}}/tasks/${{netbeans.modular.tasks.version}}" />
+            </target>
+
+            <target depends="-init-pre-project" name="-check-netbeans-tasks">
+                <condition property="netbeans.tasks.compiled">
+                    <available file="${{netbeans.modular.tasks.dir}}/out/netbeans/ModuleInfoSelector.class" />
+                </condition>
+            </target>
+            <target depends="-init-pre-project,-check-netbeans-tasks" name="-init-compile-netbeans-tasks" unless="netbeans.tasks.compiled">
+                <echo file="${{netbeans.modular.tasks.dir}}/src/netbeans/CoalesceKeyvalue.java">
+<![CDATA[
+package netbeans;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+public class CoalesceKeyvalue extends Task {
+    private String property;
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    private String value;
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    private String valueSep;
+
+    public void setValueSep(String valueSep) {
+        this.valueSep = valueSep;
+    }
+
+    private String entrySep;
+
+    public void setEntrySep(String entrySep) {
+        this.entrySep = entrySep;
+    }
+
+    private String multiSep;
+
+    public void setMultiSep(String multiSep) {
+        this.multiSep = multiSep;
+    }
+
+    private String outSep;
+
+    public void setOutSep(String outSep) {
+        this.outSep = outSep;
+    }
+
+    @Override
+    public void execute() throws BuildException {
+        List<String> result = new ArrayList<>();
+        Map<String, List<String>> module2Paths = new HashMap<>();
+
+        for (String entry : value.split(Pattern.quote(entrySep))) {
+            String[] keyValue = entry.split(Pattern.quote(valueSep), 2);
+            if (keyValue.length == 1) {
+                result.add(keyValue[0]);
+            } else {
+                module2Paths.computeIfAbsent(keyValue[0], s -> new ArrayList<>())
+                            .add(keyValue[1].trim());
+            }
+        }
+        module2Paths.entrySet()
+                    .stream()
+                    .forEach(e -> result.add(e.getKey() + valueSep + e.getValue().stream().collect(Collectors.joining(multiSep))));
+        getProject().setProperty(property, result.stream().collect(Collectors.joining(" " + entrySep)));
+    }
+
+}
+]]>
+                </echo>
+                <echo file="${{netbeans.modular.tasks.dir}}/src/netbeans/ModsourceRegexp.java">
+            <![CDATA[
+package netbeans;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+
+public class ModsourceRegexp extends Task {
+    private String property;
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    private String filePattern;
+
+    public void setFilePattern(String filePattern) {
+        this.filePattern = filePattern;
+    }
+
+    private String modsource;
+
+    public void setModsource(String modsource) {
+        this.modsource = modsource;
+    }
+
+    private List<String> expandGroup(String grp) {
+        List<String> exp = new ArrayList<>();
+        String item = "";
+        int depth = 0;
+
+        for (int i = 0; i < grp.length(); i++) {
+            char c = grp.charAt(i);
+            switch (c) {
+                case '{':
+                    if (depth++ == 0) {
+                        continue;
+                    }
+                    break;
+                case '}':
+                    if (--depth == 0) {
+                        exp.add(item);
+                        continue;
+                    }
+                    break;
+                case ',':
+                    if (depth == 1) {
+                        exp.add(item);
+                        item = "";
+                        continue;
+                    }
+                default:
+                    break;
+            }
+            item = item + c;
+        }
+        return exp;
+    }
+
+    private List<String> pathVariants(String spec) {
+        return pathVariants(spec, new ArrayList<>());
+    }
+
+    private List<String> pathVariants(String spec, List<String> res) {
+        int start  = spec.indexOf('{');
+        if (start == -1) {
+            res.add(spec);
+            return res;
+        }
+        int depth = 1;
+        int end;
+        for (end = start + 1; end < spec.length() && depth > 0; end++) {
+            char c = spec.charAt(end);
+            switch (c) {
+                case '{': depth++; break;
+                case '}': depth--; break;
+            }
+        }
+        String prefix = spec.substring(0, start);
+        String suffix = spec.substring(end);
+        expandGroup(spec.substring(start, end)).stream().forEach(item -> {
+            pathVariants(prefix + item + suffix, res);
+        });
+        return res;
+    }
+
+    private String toRegexp2(String spec, String filepattern, String separator) {
+        List<String> prefixes = new ArrayList<>();
+        List<String> suffixes = new ArrayList<>();
+        pathVariants(spec).forEach(item -> {
+            suffixes.add(item);
+        });
+        String tail = "";
+        String separatorString = separator;
+        if (separatorString == "\\") {
+            separatorString = "\\\\";
+        }
+        if (filepattern != null && filepattern != tail) {
+            tail = separatorString + filepattern;
+        }
+        return "([^" + separatorString +"]+)\\Q" + separator + "\\E(" + suffixes.stream().collect(Collectors.joining("|")) + ")" + tail;
+    }
+
+    @Override
+    public void execute() throws BuildException {
+        getProject().setProperty(property, toRegexp2(modsource, filePattern, getProject().getProperty("file.separator")));
+    }
+
+}
+]]>
+                </echo>
+                <echo file="${{netbeans.modular.tasks.dir}}/src/netbeans/ModuleInfoSelector.java">
+            <![CDATA[
+package netbeans;
+
+import java.io.File;
+import java.util.Arrays;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.selectors.BaseExtendSelector;
+
+public class ModuleInfoSelector extends BaseExtendSelector {
+
+    @Override
+    public boolean isSelected(File basedir, String filename, File file) throws BuildException {
+        String extension = Arrays.stream(getParameters())
+                                 .filter(p -> "extension".equals(p.getName()))
+                                 .map(p -> p.getValue())
+                                 .findAny()
+                                 .get();
+        return !new File(file, "module-info." + extension).exists();
+    }
+
+}
+]]>
+                </echo>
+                <mkdir dir="${{netbeans.modular.tasks.dir}}/out" />
+                <javac destdir="${{netbeans.modular.tasks.dir}}/out" srcdir="${{netbeans.modular.tasks.dir}}/src" classpath="${{ant.core.lib}}" />
+            </target>
+            <target depends="-init-pre-project,-init-compile-netbeans-tasks" name="-init-project">
+                <taskdef name="coalesce_keyvalue" uri="http://www.netbeans.org/ns/j2se-modular-project/1" classname="netbeans.CoalesceKeyvalue" classpath="${{netbeans.modular.tasks.dir}}/out" />
+                <taskdef name="modsource_regexp" uri="http://www.netbeans.org/ns/j2se-modular-project/1" classname="netbeans.ModsourceRegexp" classpath="${{netbeans.modular.tasks.dir}}/out" />
             </target>
 
             <target name="-init-source-module-properties">
@@ -211,9 +438,9 @@ is divided into following sections:
                     <xsl:with-param name="propName">have.tests</xsl:with-param>
                     <xsl:with-param name="suffix">patchset</xsl:with-param>
                     <xsl:with-param name="filter">
-                        <scriptselector language="javascript">
-                            self.setSelected(!new java.io.File(file, "module-info.java").exists());
-                        </scriptselector>                    
+                        <custom classname="netbeans.ModuleInfoSelector" classpath="${{netbeans.modular.tasks.dir}}/out">
+                            <param name="extension" value="java" />
+                        </custom>
                     </xsl:with-param>
                 </xsl:call-template>
                 <xsl:call-template name="createRootAvailableTest">
@@ -1459,131 +1686,6 @@ is divided into following sections:
                 <xsl:comment> You can override this target in the ../build.xml file. </xsl:comment>
             </target>
             
-            <scriptdef language="javascript" name="coalesce_keyvalue" uri="http://www.netbeans.org/ns/j2se-modular-project/1">
-                <attribute name="property"/>
-                <attribute name="value"/>
-                <attribute name="value-sep"/>
-                <attribute name="entry-sep"/>
-                <attribute name="multi-sep"/>
-                <attribute name="out-sep"/>
-
-            <![CDATA[
-
-            function coalesce(input, keyValueSeparator, multiSeparator, entrySeparator) {
-                var result = [];
-                var values = {};
-
-                (typeof input === "string" ? input.split(entrySeparator) : input).forEach(function(entry) {
-                    var idx = entry.indexOf(keyValueSeparator);
-                    if (idx < 1) {
-                        result.push(entry);
-                    } else {
-                        var key = entry.substring(0, idx);
-                        var val = entry.substring(idx + 1);
-                        if (!values[key]) {
-                            values[key] = [];
-                        }
-                        values[key].push(val.trim());
-                    }
-                });
-                Object.keys(values).sort().forEach(function(k) {
-                    result.push(k + keyValueSeparator + values[k].join(multiSeparator));
-                });
-                return result.join(" " + entrySeparator);
-            }
-            self.project.setProperty(attributes.get("property"),
-                coalesce(attributes.get("value"), 
-                attributes.get("value-sep"), 
-                attributes.get("entry-sep"),
-                attributes.get("multi-sep")
-            ));
-            ]]>
-            </scriptdef>
-
-            <scriptdef name="modsource_regexp" language="javascript" uri="http://www.netbeans.org/ns/j2se-modular-project/1">
-                <attribute name="property"/>
-                <attribute name="filePattern"/>
-                <attribute name="modsource"/><![CDATA[
-        function expandGroup(grp) {
-            var exp = [];
-            var item = "";
-            var depth = 0;
-
-            for (i = 0; i < grp.length; i++) {
-                var c = grp[i];
-                switch (c) {
-                    case '{':
-                        if (depth++ === 0) {
-                            continue;
-                        }
-                        break;
-                    case '}':
-                        if (--depth === 0) {
-                            exp.push(item);
-                            continue;
-                        }
-                        break;
-                    case ',':
-                        if (depth === 1) {
-                            exp.push(item);
-                            item = "";
-                            continue;
-                        }
-                    default:
-                        break;
-                }
-                item = item + c;
-            }
-            return exp;
-        }
-
-        function pathVariants(spec, res) {
-            res = res || [];
-            var start  = spec.indexOf('{');
-            if (start === -1) {
-                res.push(spec);
-                return res;
-            }
-            var depth = 1;
-            var end;
-            for (end = start + 1; end < spec.length && depth > 0; end++) {
-                var c = spec[end];
-                switch (c) {
-                    case '{': depth++; break;
-                    case '}': depth--; break;
-                }
-            }
-            var prefix = spec.substring(0, start);
-            var suffix = spec.substring(end);
-            expandGroup(spec.slice(start, end)).forEach(function (item) {
-                pathVariants(prefix + item + suffix, res);
-            })
-            return res;
-        }
-
-        function toRegexp2(spec, filepattern, separator) {
-            var prefixes = [];
-            var suffixes = [];
-            pathVariants(spec).forEach(function(item) {
-                suffixes.push(item);
-            });
-            var tail = "";
-            var separatorString = separator;
-            if (separatorString == "\\") {
-                separatorString = "\\\\";
-            }
-            if (filepattern && filepattern != tail) {
-                tail = separatorString + filepattern;
-            }
-            return "([^" + separatorString +"]+)\\Q" + separator + "\\E(" + suffixes.join("|") + ")" + tail;
-        }
-                self.project.setProperty(attributes.get("property"), 
-                    toRegexp2(attributes.get("modsource"), attributes.get("filepattern"), self.project.getProperty("file.separator")));
-            
-            ]]>
-            </scriptdef>
-            
-            
             <target name="-compile-depend" if="do.depend.true">
                 <pathconvert property="build.generated.subdirs">
                     <dirset dir="${{build.generated.sources.dir}}" erroronmissingdir="false">
@@ -2309,9 +2411,9 @@ is divided into following sections:
                 </pathconvert>
                 <pathconvert property="run.test.patchmodules.list" pathsep=" ">
                     <dirset dir="${{build.test.modules.dir}}" includes="*">
-                        <scriptselector language="javascript">
-                            self.setSelected(!new java.io.File(file, "module-info.class").exists());
-                        </scriptselector>
+                        <custom classname="netbeans.ModuleInfoSelector" classpath="${{netbeans.modular.tasks.dir}}/out">
+                            <param name="extension" value="class" />
+                        </custom>
                     </dirset>
                     <chainedmapper>
                         <filtermapper>
@@ -2320,7 +2422,7 @@ is divided into following sections:
                         <regexpmapper from=".*\Q${{file.separator}}\E([^${{file.separator.string}}]+)$" to="--patch-module \1=\0"/>
                     </chainedmapper>
                 </pathconvert>
-                <j2semodularproject1:coalesce_keyvalue property="run.test.patchmodules" value="${{run.test.patchmodules.list}}" value-sep="=" entry-sep="${{path.separator}}" multi-sep="--patch-module "/>
+                <j2semodularproject1:coalesce_keyvalue property="run.test.patchmodules" value="${{run.test.patchmodules.list}}" valueSep="=" multiSep="${{path.separator}}" entrySep="--patch-module "/>
                 <condition property="run.test.addmodules.internal" value="--add-modules ${{run.test.addmodules.list}}" else="">
                     <isset property="run.test.addmodules.list"/>
                 </condition>
@@ -2353,7 +2455,7 @@ is divided into following sections:
                         </filtermapper>
                     </chainedmapper>
                 </pathconvert>
-                <j2semodularproject1:coalesce_keyvalue property="compile.test.patchmodules" value="${{compile.test.patchmodule.internal}}" value-sep="=" entry-sep="${{path.separator}}" multi-sep="--patch-module "/>
+                <j2semodularproject1:coalesce_keyvalue property="compile.test.patchmodules" value="${{compile.test.patchmodule.internal}}" valueSep="=" multiSep="${{path.separator}}" entrySep="--patch-module "/>
                 <property name="javac.test.moduleargs" value="${{compile.test.patchmodules}} ${{compile.test.addreads}}"/>
             </target>
             <target name="-init-test-module-properties" depends="-init-test-javac-module-properties">
@@ -2637,8 +2739,12 @@ is divided into following sections:
                 <xsl:comment> You can override this target in the ../build.xml file. </xsl:comment>
             </target>
             
+            <target name="-recompile-netbeans-tasks-after-clean">
+                <antcall target="-init-compile-netbeans-tasks" inheritall="false"/>
+            </target>
+
             <target name="clean">
-                <xsl:attribute name="depends">init,deps-clean,-do-clean,-post-clean</xsl:attribute>
+                <xsl:attribute name="depends">init,deps-clean,-do-clean,-recompile-netbeans-tasks-after-clean,-post-clean</xsl:attribute>
                 <xsl:attribute name="description">Clean build products.</xsl:attribute>
             </target>
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists