Make BCEL classpath utility recognise Java 16-19, fixing many tests
This is a follow-up commit on @07af5d41:
Inside org.aspectj.apache.bcel.util.ClassPath.getClassPath(), some JVM
version matching occurs which previously did not include Java 16 (I also
added 17-19 to the regex matcher). This fixes test errors like:
java.lang.ClassCastException:
class org.aspectj.weaver.MissingResolvedTypeWithKnownSignature
cannot be cast to class
org.aspectj.weaver.ReferenceType
(org.aspectj.weaver.MissingResolvedTypeWithKnownSignature and
org.aspectj.weaver.ReferenceType are in unnamed module
of loader 'app')
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
After Ajc usage text output is filtered into its own category
IMessage.USAGE now - see commit @31b2d60b - some tests in module
'org.aspectj.ajdt.core' were failing. I fixed and also improved them a
bit in @e4a2a5a5, but forgot to commit this one.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Set explicit en_US locale for build timestamps in Build Helper Maven
There were warnings that builds were dependent on the system local
(de_DE in my case). In patterns like "EEEE MMM d, yyyy", parts like day
of week or month names would change otherwise.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
After Ajc usage text output is filtered into its own category
IMessage.USAGE now - see commit @31b2d60b - some tests in module
'org.aspectj.ajdt.core' were failing. I fixed and also improved them a
bit.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Add Java 16 test suite for AspectJ 1.9.7 + test refactorings
- Test all features which were preview in 14+15 and are now final in 16,
compiling them with language level 16.
- For Java 15 we only have sanity tests (and of course the Java <14
tests), compiling Java 16 features to target 15 does not seem to work.
- Test remaining Java 16 preview feature (sealed classes).
- Instead of overriding runTest(String) in several base classes like
XMLBasedAjcTestCaseForJava*Only or XMLBasedAjcTestCaseForJava*OrLater,
we now override setUp() from JUnit's TestCase base class. This will
run before runTest(String) and make the tests fail much faster, if a
user tries to run them on the wrong VM.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Remove module 'run-all-junit-tests' from root POM -> speed up the build
This module must be a relic from a test runner module once existing
during the Ant build era, but transferred and kept alive in the Maven
build. Actually, it almost doubles build time by running virtually all
tests in all modules again when doing 'mvn test' from the project root.
For now I only removed the module from the root POM, leaving behind
comments there, in the module POM and in the now @Deprecated class
RunTheseBeforeYouCommitTests.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
It failed with "RuntimeException: I never heard about what kind of build
it was!!" on my (@kriegaex) Windows machine, mostly because in case of a
failing full build the corresponding status is never set.
TODO: Ensure that 'MyStateListener.informedAboutKindOfBuild' is set for
failed builds, too.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Fix tests not finding project base directory 'org.aspectj'
Several LTW tests using class TestServer failed on my machine because
there was a hard-coded project base directory name 'org.aspectj' in the
class. This class has several other problems, but my quick fix for now -
I did not want to rename my project base directory - was to match on a
regex '(?i)(org[.])?aspectj' now. That also works for my root directory
'AspectJ'.
I also moved the code determining the project dir into a protected
(hence testable) method and added a sanity test case checking if the
directory can be determined. If not, the test will fail with a rather
lengthy warning to developers about the need to have a matching project
root folder.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Fix tests expecting usage texts as failure outputs
This is a follow-up on commit @31b2d60b. Some tests were actually
expecting usage texts as failure outputs. Because that was fixed, the
tests no longer see those failures, hence they should no longer expect
them.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Fix test relying on JVM warning being stripped from output
The line in which warnings like "Archived non-system classes are
disabled because the java.system.class.loader property is specified"
appears can start with e.g."OpenJDK 64-Bit Server VM" or "Java
HotSpot(TM) 64-Bit Server VM". Therefore, an exact match on the former
worked on Linux, but not on Windows, or maybe the difference is
generally between Oracle and OpenJDK. anyway, I use Oracle on Windows
and my build failed. Now it is fixed because I made the match more
generic using a regex.
I also removed a now obsolete check for the occurrence of the stripped
line in test "JDK14 LTW with XML".
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Improve usage text, error and warning output in batch compiler
- Usage texts are now printed to stdOut, no longer stdErr.
- 'java ...Main -?' no longer prints usage text twice (once to stdOut
and then again to stdErr).
- AjdtCommand.inferKind: Usage texts are no longer mis-identified as
warnings or errors just because they contain substrings "warning" or
"error". Matching is now more precise, looking for "[warning]" and
"[error]". But in that case the method would not be called anyway
because errors and warnings are identified in other ways already. As a
fall-back, the categories IMessage.ERROR and IMessage.WARNING still
exist in the method.
- In case of compile errors, no usage message is printed anymore,
because previously the user had to scroll up a lot in order to see the
actual messages. This is also in line with ECJ. The same is true for
warnings, but it was like this in Ajc already.
- AjdtCommand.inferKind: There is a new category IMessage.USAGE
especially for AspectJ usage texts, which will be identified by string
matching and then correctly handled (i.e. printed to stdOut, not
stdErr).
- Usage text printing is no longer done in AspectJ but in the AspectJ
"shadows" fork of JDT. This helps to get rid of some now obsolete code
here.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
- Use spaces instead of tabs for indentation.
- Document parameters bound in Eclipse JDT, e.g. {0} is not the compiler
name there but the system's path separator ';' or ':'. So if we want
to display the compiler name, we need {1}.
- For both normal usage and '-X' usage, compiler name + version are
printed now.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Fix invalid manifests leading to "Could not find or load main class"
WARNING: Please avoid line breaks in manifest values! They are passed on
like this: Assembly Plugin -> Plexus Archiver -> JRE java.util.jar
.Manifest.write(OutputStream).
The JRE Manifest class inserts hard line breaks always after 72
characters, no matter if those 72 characters contain line feeds, tabs or
spaces. Hence, it can happen that unwanted blank lines end up in the
middle of a manifest section, making the manifest invalid. Calls like
e.g. 'java -cp aspectjtools.jar org.aspectj.tools.ajc.Main' can then
fail with the absolutely unexpected error 'Could not find or load main
class org.aspectj.tools.ajc.Main'.
In IntelliJ IDEA you can deactivate wrapping text inside XML tags like
this: "File | Settings | Editor | Code Style | XML | Wrap text -> off"
The problem occurs in Maven Assembly in versions higher than 2.2. More
exactly, it occurs in Plexus Archiver after in more recent versions it
switched to using the JRE Manifest class.
TODO 1: Either add a test step in phase 'verify' doing something like
this:
new Manifest(new FileInputStream("MANIFEST.MF"));
This would lead to "IOException: invalid header field (line xy)" in case
of an invalid manifest file.
TODO 2: Or file a JRE bug at Oracle or OpenJDK, wherever appropriate.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Strip down compiler messages to AspectJ-specific ones
Delete all properties from messages_aspectj.properties which were just
copied from Eclipse and basically the same. This not only gets rid of
duplicates but also eliminates differences found between upstream and
AspectJ strings which were just cause by errors or oversights during
manual upgrade.
TODO:
- Find a way to print the '-X' options as info instead of yielding
'abort', making it seem as if compilation failed and print the usage
message to stdErr instead of stdOut.
- Eclipse also has misc.usage.warn, not just misc.usage, i.e. usage
info specifically for warning options. Make sure that AspectJ uses
it consistently.
- Find a way to merge AspectJ-specific options into the standard
Eclipse usage text instead of completely replacing it, further
reducing the need to merge and copy upstream content. Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Begin migration to 'aspectj' locale for compiler messages
Renamed messages.properties to messages_aspectj.properties and moved to
a path identical with the Eclipse original resource file. Therefore, it
is now just treated as a localised version of it.
The new jdtcore-for-aspectj.jar already contains logic to use the new
locale. Hence, BuildArgParser no longer needs the static block to
initialise its own resource bundle, Eclipse JDT will automatically pick
it up.
The version string was also updated to the new Eclipse merge commit
hash + date + "Java16".
TODO: Strip down properties file in order to only contain delta to
Eclipse.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Do not run tests using Java 14 preview features on this Java 15 compiler
These tests need a Java 14 level AspectJ compiler, because they use
version-specific preview features. This compiler has been upgraded
to a Java 15 compliant JDT Core already, i.e. it does not support
preview features of a previous version anymore.
An error message similar to the above explanation will appear when
trying to run any XMLBasedAjcTestCaseForJava14Only subclass, such as
Ajc196PreviewFeaturesTests (currently the only one).
When running AllTestsAspectJ196, Ajc196PreviewFeaturesTests will not be
added to the test suite anymore.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Keep only ASM 2.0 binary because it is still used in UnweavableTest
which uses an old ASM API, e.g. with a ClassWriter constructor which no
longer exists.
Also add JarJar 1.3 library because it is needed by an Ant task in
lib/asm/build.xml.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Simplify execution of PureJavaTests and KnownLimitationsTests
Getting rid of XML includes and two superfluous files, merging them with
their respective including counterparts. As far as I can see, the two
test suites are not part of the automatic build process, but can be
started manually as easily as any other test (suite) now.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Fix outdated ajcTestSuite.dtd and lots of XML problems
Now there should be no more inspection warnings when working with XML
test definitions. Only the strangely looking XML files used by
PureJavaTests and KnownLimitationsTests are left to be analysed and
fixed.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Make sure Java 14-only tests using preview are not executed on JVM 15+
Some Ajc196 tests are using preview features (see .../ajc196.xml), i.e.
they will fail on Java 15+ because code compiled with '--enable-preview'
can only run on the same JVM version, not on a more recent one. Hence,
the preview-using tests are now being excluded in order to make the
build run on Java 15, even though no Java 15 features are present in the
current 1.9.7 snapshot.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Move documentation generation into Maven profile 'create-docs'
The profile is active by default, but can be deactivated via
'-P !create-docs' on the Maven command line. This helps to speed up
'mvn install', maybe in combination with skipping tests, if we just want
to create a new set of AspectJ binaries.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Improve text matching in OutputSpec, fixing some failing Windows tests
Some Java 14 text block tests failed on Windows because a
StringTokenizer was used to split by LF, but the Windows line
separator is CR+LF. Because a multi-line string ending with CR+LF is
printed via 'System.out.println' in the test code, another CR+LF is
added to the output, resulting in trailing CR+LF+CR+LF. Hence, between
the two LFs, the tokenizer actually found an additional line consisting
of CR (only on Windows, of course). Despite each line token actually
containing a trailing CR token, that did not matter much because
'String.trim' was used everywhere before comparing values.
Anyway, the improved OutputSpec uses text.trim().split("\\s*\n\\s*"),
which takes care of leading/trailing whitespace both around the whole
output and for each separate line.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Make MoveInstructionsWeaveTestCase.testFancyHello pass when run twice
Reset counter, just in case this test runs multiple times in one JVM.
This can happen e.g. due to "run all tests" in IntelliJ IDEA, which
directly runs this test class and als WeaverModuleTests, both of which
implement junit.framework.TestCase. In that case, during the second run
the counter would start at a higher base count, making the 2nd test run
fail.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Make BCEL classpath utility recognise Java 15, fixing many tests
Inside org.aspectj.apache.bcel.util.ClassPath.getClassPath(), some JVM
version matching occurs which previously did not include Java 15.
Technically, AspectJ 1.9.6 does not support Java 15, but on GitHub
Actions there is a build job running on a JVM 15. This change should at
least make the weaver tests pass, making that test job more meaningful.
This fixes test errors like
java.lang.ClassCastException:
class org.aspectj.weaver.MissingResolvedTypeWithKnownSignature
cannot be cast to class
org.aspectj.weaver.ReferenceType
(org.aspectj.weaver.MissingResolvedTypeWithKnownSignature and
org.aspectj.weaver.ReferenceType are in unnamed module
of loader 'app')
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Fix: WeaveSpec no longer ignores the '-Xlintfile' parameter
Some tests in ajc150.xml and ajc190_from150.xml contain '<weave ...>'
build steps with 'xlintfile="..."' parameters. Those parameters were
passed through to Java and aspect code building steps, but not to the
final weaving step, sometimes leading to spurious "type not exposed to
weaver" warnings which occurred for some local and CI builds, but not
always. Very strange indeed. Anyway, by making method
WeaveSpec.buildWeaveArgs() pass on this parameter, the tests seem to run
reliably now.
TODO: Why does Ajc report that warning if the application JAR is on the
inpath and the aspect JAR is on the aspectpath? Is it because a marker
annotation is defined within the aspect JAR? But actually, that should
not matter, especially not work once and fail at other times. I guess
there is a class loading order problem or similar involved.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Add missing '-options' values -1.5, -1.9 to ajc{150,190_from150}.xml
When trying to find out why ajc150.xml and ajc190_from150.xml look
almost identical, I found out that only in many cases the 190 version
has '-option="1.9"' set where in the 150 version it was '-option="1.9"'.
Unfortunately, in both files source/target versions are not set at all
in many places, which looks unintentional. I tried to search & replace
all relevant '<compile ...>' commands for 190 first, then ported back to
150. Only cases in which clearly compiling to an older version like 1.3
or 1.4 is necessary were left like before.
I am expecting missing or false Java target versions in many other of
the legacy XML test suites. For now, I am just committing these two.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Set maven-assembly-plugin version 3.1.1 explicitly for each POM module
Background: There are CI tests failing because the version is not taken
from the parent POM, even if set in the 'pluginManagement' section.
Instead, it is resolved via the Maven Super POM, e.g. 2.2-beta-5, see:
https://maven.apache.org/ref/3.6.3/maven-model-builder/super-pom.html
That assembly plugin version in turn requires plexus-archiver
1.0-alpha-12. The latter cannot be downloaded from Maven Central,
leading to the problems seen during builds.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Replace path separators ';' by ',' in XML test specs
The goal is for them to be canonicalised to platform standard during
test execution. I am not sure if that will fix any tests, but at least I
hope it will not break any.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Replace directory separator '/' and surrogate path separator ',' by
platform-specific separators File.separatorChar and
File.pathSeparatorChar, respectively. Also make sure that replacement
occurs during write access, not read access. This was handled
differently in both sibling classes.
I am not sure if that helps to fix any Linux CI tests, but it is worth a
try.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Try to fix MultiProjectIncrementalTests.testAspectPath_pr265693
Check if path vs. package name discrepancy makes test fail on Linux. On
Windows it passes. So let's find out if file p/Asp.java vs. pkg.Asp
causes the problems.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
This made ModuleTests.testBuildModuleAndApplyAspectsFromAspectPath fail
because a file delete job for a module JAR failed after a previous
compile job had called FileUtil.isZipFile(File) in which the opened zip
file was never closed. A try with resources fixes that.
Maybe the corresponding test worked on Linux before, I did not try. I
just know that Linux is more forgiving about deleting open files while
on Windows they are being locked, which makes Windows the better system
to search for open file leaks.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
AjBuildManager: use try with resources in 2 places
I was debugging something in ModuleTests, trying to find out if there
are resource leaks. They were not in this class but in FileUtil - see
next commit. However, the little refactoring here does not hurt either.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Support Windows 10 and Windows Server 2016/2019 in installer
Those versions were not detected until now, which lead to bogus Windows
batch files forwarding only 9 Ajc parameters to the Java process via
"%1 %2 %3 %4 %5 %6 %7 %8 %9" instead of "%*".
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Lars Grefer [Sat, 15 Aug 2020 14:33:00 +0000 (16:33 +0200)]
Redundant Collection.addAll() call
Reports Collection.addAll() and Map.putAll() calls after instantiation of a collection using a constructor call without arguments. Such constructs can be replaced with a single call to a parametrized constructor which simplifies code. Also for some collections the replacement might be more performant.
Signed-off-by: Lars Grefer <eclipse@larsgrefer.de>
Lars Grefer [Sat, 15 Aug 2020 14:30:09 +0000 (16:30 +0200)]
Collection.toArray() call style
There are two styles to convert a collection to an array: either using a pre-sized array (like c.toArray(new String[c.size()])) or using an empty array (like c.toArray(new String[0]).
In older Java versions using pre-sized array was recommended, as the reflection call which is necessary to create an array of proper size was quite slow. However since late updates of OpenJDK 6 this call was intrinsified, making the performance of the empty array version the same and sometimes even better, compared to the pre-sized version. Also passing pre-sized array is dangerous for a concurrent or synchronized collection as a data race is possible between the size and toArray call which may result in extra nulls at the end of the array, if the collection was concurrently shrunk during the operation.
Signed-off-by: Lars Grefer <eclipse@larsgrefer.de>
Lars Grefer [Sat, 15 Aug 2020 14:25:42 +0000 (16:25 +0200)]
Single Map method can be used
Reports common usage patterns of java.util.Map that could be replaced with Java 8 methods: getOrDefault(), computeIfAbsent(), putIfAbsent(), merge(), or replaceAll().
Signed-off-by: Lars Grefer <eclipse@larsgrefer.de>