Skip to content

Conversation

Copy link

Copilot AI commented Oct 27, 2025

The EE enum requires code changes for each new Java release (every 6 months). This refactors it to a class that dynamically creates instances for future Java versions.

Changes

Core refactoring:

  • Convert enum EE to final class EE implements Comparable<EE>
  • Replace enum constants with static final instances
  • Replace EnumSet<EE> with LinkedHashSet<EE> for compatibility tracking
  • Add lookup maps (BY_NAME, BY_RELEASE) for efficient retrieval

New API:

// Dynamically create EE for future Java versions
EE ee31 = EE.getOrCreate(31);  // No code changes needed for Java 31+

Preserved API:

  • All static instances (EE.JavaSE_17, etc.)
  • All public methods (parse(), values(), getEEName(), getRelease(), etc.)
  • Comparable behavior for sorting

Breaking changes:

  • Switch statements on EE → if-else chains
  • EnumSet<EE>Set<EE> or List<EE>

Version:

  • Package version bumped to 5.0.0 (breaking API change)

Example migration

// Before: switch statement
switch (ee) {
    case JavaSE_17 -> handle17();
    case JavaSE_21 -> handle21();
}

// After: if-else
if (ee == EE.JavaSE_17) {
    handle17();
} else if (ee == EE.JavaSE_21) {
    handle21();
}

// Before: EnumSet
for (EE ee : EnumSet.of(EE.JavaSE_17, EE.JavaSE_21)) { }

// After: Set or List
for (EE ee : Set.of(EE.JavaSE_17, EE.JavaSE_21)) { }

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • bndtools.jfrog.io
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED -Xms1024m -Xmx2048m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/gradle-daemon-main-8.14.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/agents/gradle-instrumentation-agent-8.14.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.14 (dns block)
  • example.org
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.gradle.internal.worker.tmpdir=/home/REDACTED/work/bnd/bnd/biz.aQute.resolve/generated/tmp/test/work -Dorg.slf4j.simpleLogger.defaultLogLevel=LIFECYCLE --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.jar=ALL-UNNAMED --add-opens=java.base/java.util.regex=ALL-UNNAMED --add-opens=java.base/java.util.zip=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.file=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.ftp=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.http=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.https=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.jar=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.jrt=ALL-UNNAMED -XX:&#43;ShowCodeDetailsInExceptionMessages @/home/REDACTED/.gradle/.tmp/gradle-worker-classpath7577141382990267232txt -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -ea worker.org.gradle.process.internal.worker.GradleWorkerMain &#39;Gradle Test Executor 12&#39; (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java -Dorg.gradle.internal.worker.tmpdir=/home/REDACTED/work/bnd/bnd/biz.aQute.resolve/generated/tmp/test/work -Dorg.slf4j.simpleLogger.defaultLogLevel=LIFECYCLE --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.jar=ALL-UNNAMED --add-opens=java.base/java.util.regex=ALL-UNNAMED --add-opens=java.base/java.util.zip=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.file=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.ftp=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.http=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.https=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.jar=ALL-UNNAMED --add-opens=java.base/sun.net.www.protocol.jrt=ALL-UNNAMED -XX:&#43;ShowCodeDetailsInExceptionMessages @/home/REDACTED/.gradle/.tmp/gradle-worker-classpath900547154258508454txt -Xmx512m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -ea worker.org.gradle.process.internal.worker.GradleWorkerMain &#39;Gradle Test Executor 2&#39; (dns block)
  • scans-in.gradle.com
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.xml/javax.xml.namespace=ALL-UNNAMED -Xms1024m -Xmx2048m -Dfile.encoding=UTF-8 -Duser.country -Duser.language=en -Duser.variant -cp /home/REDACTED/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/gradle-daemon-main-8.14.jar -javaagent:/home/REDACTED/.gradle/wrapper/dists/gradle-8.14-bin/38aieal9i53h9rfe7vjup95b9/gradle-8.14/lib/agents/gradle-instrumentation-agent-8.14.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 8.14 (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

Refactor the usages of EE enum

The EE class is currently an enum but new java versions aproaching every day

this was tried already to be accounted by extend the enum but this is only a short term solution.

Instead it has to be refactored into a class that allows dynmics changes mas proposed here:

bndtools#6859 (comment)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI and others added 4 commits October 27, 2025 06:15
- Convert EE enum to final class implementing Comparable<EE>
- Replace EnumSet with LinkedHashSet for compatibility tracking
- Add ordinal and name fields to mimic enum behavior
- Implement static factory method getOrCreate() for dynamic EE instances
- Add lookup maps (BY_NAME, BY_RELEASE) for efficient parsing
- Update package version to 5.0.0 (breaking change)
- Fix test to use if-else instead of switch statement
- All EE tests passing successfully

Co-authored-by: laeubi <1331477+laeubi@users.noreply.github.com>
- Add testDynamicEECreation test to verify getOrCreate() method
- Test creation of EE instances for future Java versions (31, 40)
- Verify caching works correctly (same instance returned)
- All tests passing successfully

Co-authored-by: laeubi <1331477+laeubi@users.noreply.github.com>
- Convert switch on EE to if-else in GenericResolveContextResolveTest
- Replace EnumSet.of() with Arrays.asList() in StandaloneTest
- Add class-level documentation explaining dynamic EE support
- All resolve tests now passing

Co-authored-by: laeubi <1331477+laeubi@users.noreply.github.com>
- Add documentation explaining magic number 5 in ordinal calculation
- Make getOrCreate() more maintainable by dynamically finding highest release
- Improve readability in test by using Set.of() instead of OR chains
- All tests still passing

Co-authored-by: laeubi <1331477+laeubi@users.noreply.github.com>
Copilot AI changed the title [WIP] Refactor EE enum to dynamic class structure Refactor EE from enum to class for dynamic Java version support Oct 27, 2025
Copilot AI requested a review from laeubi October 27, 2025 06:34
Copilot finished work on behalf of laeubi October 27, 2025 06:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants