From 4af6490d1b2545ffce5d9e78316f15c97973bd3c Mon Sep 17 00:00:00 2001
From: Greg DiCristofaro <gregd@basistech.com>
Date: Sun, 8 Nov 2020 16:08:46 -0500
Subject: [PATCH] update to use star notation

---
 Core/build.xml | 65 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 64 insertions(+), 1 deletion(-)

diff --git a/Core/build.xml b/Core/build.xml
index e54c4eda97..3a2b99eb6d 100644
--- a/Core/build.xml
+++ b/Core/build.xml
@@ -197,7 +197,7 @@
     </target>
 
     <!--sets up integration test system properties, calls underlying test-init and then sets up the pathing jar-->
-    <target name="test-init" depends="projectized-common.test-init,getTestDataFiles,qa-functional-pathing-jar" />
+    <target name="test-init" depends="projectized-common.test-init,getTestDataFiles,qa-functional-pathing-jar,unit-test-path-simplification" />
 
     <!--    
         The paths specified in 'module.run.classpath' are incorporated into the manifest of a jar and then the path to the 
@@ -238,4 +238,67 @@
             </path>
         </sequential>
     </target>    
+    
+ 
+    <!--
+    Putting junit on the classpath with a pathing jar fails (NoClassDefError’s).  
+    This specifies the classpath for unit tests using * notation 
+    (i.e. https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory-within-the-java-classpath).  
+    This solution involves taking the initial ‘module.run.classpath’ property and simplifying it to the directories containing jars 
+    (i.e. instead of “/dir/lib1.jar:/dir/lib2.jar:/dir/lib3.jar” it becomes “/dir/*” ).  
+    More information on ‘module.run.classpath’ can be found in “netbeans-plat\11.3\harness\README” and it appears that
+    “netbeans-plat\11.3\harness\build.xml:build-init target is in charge of setting the ‘module.run.classpath’ variable.
+    -->
+    <target name="unit-test-path-simplification" depends="projectized-common.test-init">
+        <sequential>
+            <script language="javascript">
+                <![CDATA[ 
+                    var moduleRunClasspath = project.getProperty("module.run.classpath");
+
+                    var directories = [];
+                    // searches for jar file parent directories with path separators of \ or /
+                    var individualPathRegex = /^\s*(.+?[\\\/])[^\\\/]+?\.jar\s*$/i;
+                    // split on ':' but not 'C:\'
+                    var classPathRegex = /((C:\\)?.+?)(:|$)/gi;
+                    var match;
+                    while((match = classPathRegex.exec(moduleRunClasspath)) !== null) {
+                        var thisPath = match[1];
+                        var pathMatch = thisPath.match(individualPathRegex);
+                        // find unique matches
+                        if (pathMatch && directories.indexOf(pathMatch[1]) < 0) {
+                            directories.push(pathMatch[1]);
+                        }
+                    }
+
+                    // suffix with *
+                    for (var i = 0; i < directories.length; i++) {
+                        directories[i] = directories[i] + "*";
+                    }
+
+                    // set project property
+                    project.setNewProperty("test.unit.abbreviatedModuleRunClassPath", directories.join(":"));
+                ]]>
+            </script>
+
+            <!--grab properties from common.xml:test-init so that "test.unit.run.cp" can be properly formed-->
+            <property name="build.test.unit.dir" location="${build.dir}/test/unit"/>
+            <property name="build.test.unit.classes.dir" location="${build.test.unit.dir}/classes"/>
+            <property name="test.unit.cp.extra" value=""/>
+                
+            <!--set up "test.unit.run.cp" to be used by common.xml:-do-junit-->
+            <path id="test.unit.run.cp">
+                <pathelement path="${build.test.unit.classes.dir}"/>
+                <!-- Cannot use <path refid="cp"/> since that uses ${module.classpath} and we want ${module.run.classpath}: -->
+                <pathelement path="${test.unit.runtime.cp}"/>
+                <pathelement path="${cp.extra}"/>
+                <pathelement location="${cluster}/${module.jar}"/>
+                <path refid="test.unit.lib.cp"/>
+                <!-- for compatibility with property based classpath-->
+                <pathelement path="${test.unit.abbreviatedModuleRunClassPath}"/>
+                <pathelement path="${test.unit.run.cp.extra}"/>
+                <pathelement path="${test.unit.cp.extra}"/>
+                <pathelement path="${test.extra.nb.javac.deps}"/>
+            </path>
+        </sequential>
+    </target>     
 </project>
-- 
GitLab