diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a814cc5e8..61cb3ee27 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: name: "Tests and Analysis (JDK: ${{ matrix.jdk }})" strategy: matrix: - jdk: [ 11, 17, 21 ] + jdk: [ 17, 21, 25 ] runs-on: ubuntu-latest steps: - name: Checkout @@ -56,7 +56,7 @@ jobs: needs: [ tests-and-analysis ] strategy: matrix: - jdk: [ 11, 17, 21 ] + jdk: [ 17, 21, 25 ] os: [ ubuntu-latest, windows-latest, macOS-latest ] runs-on: ${{ matrix.os }} steps: @@ -99,7 +99,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - name: Set up cache uses: actions/cache@v3 with: @@ -150,7 +150,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'zulu' - java-version: 11 + java-version: 17 - name: Set up cache uses: actions/cache@v3 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a3d68f22..ef261e8de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed -* LearnLib now requires Java 11 at runtime. +* LearnLib now requires Java 17 at runtime. * The `generateTestWords` method of `AbstractTestWordEQOracle` now needs to be public. ### Fixed diff --git a/README.md b/README.md index dd2610ed6..b924e69d6 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Contributions -- whether it is in the form of new features, better documentation For simply using LearnLib you may use the Maven artifacts which are available in the [Maven Central repository][maven-central]. It is also possible to download a bundled [distribution artifact][maven-central-distr] if you want to use LearnLib without Maven support. -Note that LearnLib requires Java 11 (or newer) to build but still supports Java 8 at runtime. +Note that LearnLib requires Java 17 (or newer) to build and run. #### Building development versions diff --git a/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/AbstractAbstractionTree.java b/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/AbstractAbstractionTree.java index 7402d3afb..c34e4f530 100644 --- a/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/AbstractAbstractionTree.java +++ b/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/AbstractAbstractionTree.java @@ -132,8 +132,7 @@ public Collection getRepresentativeSymbols() { @Override public Collection getOutgoingEdges(Node node) { - if (node instanceof InnerNode) { - final InnerNode n = (InnerNode) node; + if (node instanceof InnerNode n) { return Arrays.asList(n.equalsNext, n.otherNext); } @@ -155,8 +154,7 @@ public Collection getNodes() { while (!nodes.isEmpty()) { final Node n = nodes.poll(); - if (n instanceof InnerNode) { - final InnerNode in = (InnerNode) n; + if (n instanceof InnerNode in) { result.add(in); nodes.add(in.equalsNext); nodes.add(in.otherNext); @@ -177,11 +175,9 @@ public VisualizationHelper getVisualizationHelper() { public boolean getNodeProperties(Node node, Map properties) { super.getNodeProperties(node, properties); - if (node instanceof InnerNode) { - final InnerNode n = (InnerNode) node; + if (node instanceof InnerNode n) { properties.put(NodeAttrs.LABEL, n.prefix + ", " + n.suffix); - } else if (node instanceof Leaf) { - final Leaf l = (Leaf) node; + } else if (node instanceof Leaf l) { properties.put(NodeAttrs.LABEL, String.format("Abs.: '%s'%nRep.: '%s'", l.abs, l.rep)); } @@ -192,8 +188,7 @@ public boolean getNodeProperties(Node node, Map properties) { public boolean getEdgeProperties(Node src, Node edge, Node tgt, Map properties) { super.getEdgeProperties(src, edge, tgt, properties); - if (src instanceof InnerNode) { - final InnerNode n = (InnerNode) src; + if (src instanceof InnerNode n) { if (n.equalsNext == tgt) { properties.put(EdgeAttrs.LABEL, "== " + n.out); } else { diff --git a/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/Node.java b/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/Node.java index 174a6acc3..6d9700948 100644 --- a/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/Node.java +++ b/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/abstraction/Node.java @@ -17,7 +17,7 @@ import net.automatalib.word.Word; -class Node { +public class Node { static class InnerNode extends Node { diff --git a/algorithms/active/aaar/src/test/java/de/learnlib/algorithm/aaar/explicit/ModuloInitialAbstraction.java b/algorithms/active/aaar/src/test/java/de/learnlib/algorithm/aaar/explicit/ModuloInitialAbstraction.java index 428b9ac46..f1a8fc9ae 100644 --- a/algorithms/active/aaar/src/test/java/de/learnlib/algorithm/aaar/explicit/ModuloInitialAbstraction.java +++ b/algorithms/active/aaar/src/test/java/de/learnlib/algorithm/aaar/explicit/ModuloInitialAbstraction.java @@ -40,14 +40,11 @@ public String getAbstractSymbol(CI c) { @Override public CI getRepresentative(String a) { - switch (a) { - case "even": - return alphabet.getSymbol(0); - case "odd": - return alphabet.getSymbol(1); - default: - throw new IllegalArgumentException("Unknown symbol: " + a); - } + return switch (a) { + case "even" -> alphabet.getSymbol(0); + case "odd" -> alphabet.getSymbol(1); + default -> throw new IllegalArgumentException("Unknown symbol: " + a); + }; } @Override diff --git a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/ADTExtender.java b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/ADTExtender.java index 43405be41..7ea725ff4 100644 --- a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/ADTExtender.java +++ b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/ADTExtender.java @@ -24,6 +24,7 @@ * Interface for configuration objects that specify how to finalize the temporary splitter given by regular * counterexample decomposition. */ +@FunctionalInterface public interface ADTExtender { /** diff --git a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/LeafSplitter.java b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/LeafSplitter.java index 14b7464e6..ea2784d96 100644 --- a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/LeafSplitter.java +++ b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/LeafSplitter.java @@ -22,6 +22,7 @@ * Interface for configuration objects that specify how to split the ADT leaf of a hypothesis state that needs * refinement. */ +@FunctionalInterface public interface LeafSplitter { /** diff --git a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/SubtreeReplacer.java b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/SubtreeReplacer.java index 17bbd3ec2..77e58d3e5 100644 --- a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/SubtreeReplacer.java +++ b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/api/SubtreeReplacer.java @@ -25,6 +25,7 @@ /** * Interface for configuration objects that specify how nodes of the current ADT should be replaced. */ +@FunctionalInterface public interface SubtreeReplacer { /** diff --git a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/ADSCalculator.java b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/ADSCalculator.java index f4a446105..f176f3881 100644 --- a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/ADSCalculator.java +++ b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/ADSCalculator.java @@ -22,6 +22,7 @@ import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.transducer.MealyMachine; +@FunctionalInterface public interface ADSCalculator { Optional> compute(MealyMachine hypothesis, diff --git a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/DefensiveADSCalculator.java b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/DefensiveADSCalculator.java index c8908fcb4..218704dc9 100644 --- a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/DefensiveADSCalculator.java +++ b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/config/model/DefensiveADSCalculator.java @@ -23,6 +23,7 @@ import net.automatalib.alphabet.Alphabet; import net.automatalib.automaton.transducer.MealyMachine; +@FunctionalInterface public interface DefensiveADSCalculator { Optional> compute(MealyMachine automaton, diff --git a/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/dfa/KearnsVaziraniDFA.java b/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/dfa/KearnsVaziraniDFA.java index 7a0cab966..84a0eda75 100644 --- a/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/dfa/KearnsVaziraniDFA.java +++ b/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/dfa/KearnsVaziraniDFA.java @@ -186,9 +186,7 @@ private void updateTransitions(List transList, final List> transAs = new ArrayList<>(numTrans); - for (int i = 0; i < numTrans; i++) { - long encodedTrans = transList.get(i); - + for (long encodedTrans : transList) { int sourceState = (int) (encodedTrans >> Integer.SIZE); int transIdx = (int) encodedTrans; diff --git a/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/mealy/KearnsVaziraniMealy.java b/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/mealy/KearnsVaziraniMealy.java index 6fe1bd63a..c3535c218 100644 --- a/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/mealy/KearnsVaziraniMealy.java +++ b/algorithms/active/kearns-vazirani/src/main/java/de/learnlib/algorithm/kv/mealy/KearnsVaziraniMealy.java @@ -198,9 +198,7 @@ private void updateTransitions(List transList, final List> transAs = new ArrayList<>(numTrans); - for (int i = 0; i < numTrans; i++) { - long encodedTrans = transList.get(i); - + for (long encodedTrans : transList) { int sourceState = (int) (encodedTrans >> Integer.SIZE); int transIdx = (int) encodedTrans; diff --git a/algorithms/active/lambda/src/main/java/de/learnlib/algorithm/lambda/ttt/dt/DTLeaf.java b/algorithms/active/lambda/src/main/java/de/learnlib/algorithm/lambda/ttt/dt/DTLeaf.java index 09c3d26ca..6b5df86bc 100644 --- a/algorithms/active/lambda/src/main/java/de/learnlib/algorithm/lambda/ttt/dt/DTLeaf.java +++ b/algorithms/active/lambda/src/main/java/de/learnlib/algorithm/lambda/ttt/dt/DTLeaf.java @@ -111,8 +111,8 @@ public void split(PTNode u1, PTNode u2, I a) { DTLeaf ua2 = s2.state(); AbstractDTNode n = lca(ua1, ua2); STNode av; - if (n instanceof DTInnerNode) { - av = ((DTInnerNode) n).suffix().prepend(a); + if (n instanceof DTInnerNode in) { + av = in.suffix().prepend(a); } else { av = tree.newSuffix(a); } diff --git a/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/LSOracle.java b/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/LSOracle.java index 980799fb8..9e80c9bcc 100644 --- a/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/LSOracle.java +++ b/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/LSOracle.java @@ -78,8 +78,9 @@ private List sample2(Collection collection) { return shuffled.subList(0, 2); } + @SuppressWarnings("PMD.SwitchDensity") private Pair, Word> rule3IO(List> candidates, Word prefix) { - switch (this.rule3) { + return switch (this.rule3) { case ADS: if (candidates.size() == 2) { Word q1Acc = candidates.get(0); @@ -92,28 +93,25 @@ private Pair, Word> rule3IO(List> candidates, Word prefix) Word wit = ApartnessUtil.computeWitness(obsTree, q1, q2); assert wit != null; - WordBuilder inputSeq = new WordBuilder<>(prefix); assert !(ApartnessUtil.accStatesAreApart(obsTree, prefix, q1Acc) || ApartnessUtil.accStatesAreApart(obsTree, prefix, q2Acc)); - inputSeq.append(wit); - Word outputSeq = this.outputQuery(inputSeq.toWord()); - return Pair.of(inputSeq.toWord(), outputSeq); + Word inputSeq = prefix.concat(wit); + Word outputSeq = this.outputQuery(inputSeq); + yield Pair.of(inputSeq, outputSeq); } else { List candss = getSuccs(candidates); ADSTree suffix = new ADSTree<>(obsTree, candss, sinkOutput); - return this.adaptiveOutputQuery(prefix, null, suffix); + yield this.adaptiveOutputQuery(prefix, null, suffix); } case SEPSEQ: List withS = getSuccs(sample2(candidates)); Word wit = ApartnessUtil.computeWitness(obsTree, withS.get(0), withS.get(1)); assert wit != null; Word inputSeq = prefix.concat(wit); - return Pair.of(inputSeq, this.outputQuery(inputSeq)); - default: - throw new IllegalStateException("Shouldn't get here!"); - } + yield Pair.of(inputSeq, this.outputQuery(inputSeq)); + }; } private List getSuccs(Collection> candidates) { @@ -148,14 +146,14 @@ public List> identifyFrontier(Word fsAcc, List> candidates) { } private Pair, Word> rule2IO(Word accessQ, I i, List bss, Collection> basis) { - switch (this.rule2) { + return switch (this.rule2) { case ADS: ADSTree suffix = new ADSTree<>(obsTree, bss, sinkOutput); - return this.adaptiveOutputQuery(accessQ, i, suffix); + yield this.adaptiveOutputQuery(accessQ, i, suffix); case NOTHING: Word prefix = accessQ.append(i); Word oSeq = this.outputQuery(prefix); - return Pair.of(prefix, oSeq); + yield Pair.of(prefix, oSeq); case SEPSEQ: Word wit; if (basis.size() >= 2) { @@ -167,10 +165,8 @@ private Pair, Word> rule2IO(Word accessQ, I i, List bss, } Word inputSeq = accessQ.append(i).concat(wit); Word outputSeq = this.outputQuery(inputSeq); - return Pair.of(inputSeq, outputSeq); - default: - throw new IllegalStateException("Shouldn't get here!"); - } + yield Pair.of(inputSeq, outputSeq); + }; } public List, List>>> exploreFrontier(Collection> basis) { diff --git a/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/ads/ADSTree.java b/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/ads/ADSTree.java index a59ceb48a..72ba6f8a4 100644 --- a/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/ads/ADSTree.java +++ b/algorithms/active/lsharp/src/main/java/de/learnlib/algorithm/lsharp/ads/ADSTree.java @@ -110,7 +110,7 @@ public static , I, O> ADSNode constructADS(Observa } } - assert bestInput != null && bestChildren != null; + assert bestInput != null; return new ADSNode<>(bestInput, toMap(bestChildren), bestIScore); } diff --git a/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractAutomatonLStar.java b/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractAutomatonLStar.java index c12b8bc1e..0bf1c8ac5 100644 --- a/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractAutomatonLStar.java +++ b/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractAutomatonLStar.java @@ -205,7 +205,7 @@ public void resume(AutomatonLStarState state) { } } - static final class StateInfo { + protected static final class StateInfo { private final Row row; private final S state; diff --git a/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/closing/ClosingStrategy.java b/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/closing/ClosingStrategy.java index 469773395..5c284e45d 100644 --- a/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/closing/ClosingStrategy.java +++ b/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/closing/ClosingStrategy.java @@ -29,6 +29,7 @@ * @param * type variable for output symbol upper bound. */ +@FunctionalInterface public interface ClosingStrategy { /** diff --git a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/Splitter.java b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/Splitter.java index 750834e94..91393a91d 100644 --- a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/Splitter.java +++ b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/Splitter.java @@ -65,21 +65,16 @@ public ContextPair getNewDiscriminator() { Word prefix = succSeparator.getDiscriminator().getPrefix(); Word suffix = succSeparator.getDiscriminator().getSuffix(); - switch (type) { - case INTERNAL: - return new ContextPair<>(prefix, suffix.prepend(symbol)); - case RETURN: - return new ContextPair<>(prefix.concat(location.getAccessSequence()).append(otherSymbol), - suffix.prepend(symbol)); - case CALL: - return new ContextPair<>(prefix, - location.getAccessSequence() - .prepend(symbol) - .append(otherSymbol) - .concat(suffix)); - default: - throw new IllegalStateException("Unhandled type " + type); - } + return switch (type) { + case INTERNAL -> new ContextPair<>(prefix, suffix.prepend(symbol)); + case RETURN -> new ContextPair<>(prefix.concat(location.getAccessSequence()).append(otherSymbol), + suffix.prepend(symbol)); + case CALL -> new ContextPair<>(prefix, + location.getAccessSequence() + .prepend(symbol) + .append(otherSymbol) + .concat(suffix)); + }; } public int getNewDiscriminatorLength() { diff --git a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/TTTLearnerVPA.java b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/TTTLearnerVPA.java index b7a3ffd86..0aa7fd8db 100644 --- a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/TTTLearnerVPA.java +++ b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/TTTLearnerVPA.java @@ -218,7 +218,7 @@ protected State> getAnySuccessor(State> state, I sym) { final VPAlphabet.SymbolType type = alphabet.getSymbolType(sym); final StackContents stackContents = state.getStackContents(); - switch (type) { + return switch (type) { case INTERNAL: { AbstractHypTrans trans = hypothesis.getInternalTransition(state.getLocation(), sym); HypLoc succLoc; @@ -227,11 +227,11 @@ protected State> getAnySuccessor(State> state, I sym) { } else { succLoc = trans.getNonTreeTarget().subtreeLocsIterator().next(); } - return new State<>(succLoc, stackContents); + yield new State<>(succLoc, stackContents); } case CALL: { int stackSym = hypothesis.encodeStackSym(state.getLocation(), sym); - return new State<>(hypothesis.getInitialLocation(), StackContents.push(stackSym, stackContents)); + yield new State<>(hypothesis.getInitialLocation(), StackContents.push(stackSym, stackContents)); } case RETURN: { assert stackContents != null; @@ -243,11 +243,9 @@ protected State> getAnySuccessor(State> state, I sym) { } else { succLoc = trans.getNonTreeTarget().subtreeLocsIterator().next(); } - return new State<>(succLoc, stackContents.pop()); + yield new State<>(succLoc, stackContents.pop()); } - default: - throw new IllegalStateException("Unhandled type " + type); - } + }; } private PrefixTransformAcex deriveAcex(OutputInconsistency outIncons) { @@ -592,16 +590,11 @@ private static void markAndPropagate(DTNode node, Boolean label) { } public AbstractHypTrans getSplitterTrans(HypLoc loc, Splitter splitter) { - switch (splitter.type) { - case INTERNAL: - return hypothesis.getInternalTransition(loc, splitter.symbol); - case RETURN: - return hypothesis.getReturnTransition(loc, splitter.symbol, splitter.location, splitter.otherSymbol); - case CALL: - return hypothesis.getReturnTransition(splitter.location, splitter.otherSymbol, loc, splitter.symbol); - default: - throw new IllegalStateException("Unhandled type " + splitter.type); - } + return switch (splitter.type) { + case INTERNAL -> hypothesis.getInternalTransition(loc, splitter.symbol); + case RETURN -> hypothesis.getReturnTransition(loc, splitter.symbol, splitter.location, splitter.otherSymbol); + case CALL -> hypothesis.getReturnTransition(splitter.location, splitter.otherSymbol, loc, splitter.symbol); + }; } private static void moveIncoming(DTNode newNode, DTNode oldNode, Boolean label) { diff --git a/api/src/main/java/de/learnlib/AccessSequenceProvider.java b/api/src/main/java/de/learnlib/AccessSequenceProvider.java index db3106a62..d0e628522 100644 --- a/api/src/main/java/de/learnlib/AccessSequenceProvider.java +++ b/api/src/main/java/de/learnlib/AccessSequenceProvider.java @@ -24,6 +24,7 @@ * @param * input symbol type */ +@FunctionalInterface public interface AccessSequenceProvider { /** diff --git a/api/src/main/java/de/learnlib/AccessSequenceTransformer.java b/api/src/main/java/de/learnlib/AccessSequenceTransformer.java index 20e995117..3e33439ae 100644 --- a/api/src/main/java/de/learnlib/AccessSequenceTransformer.java +++ b/api/src/main/java/de/learnlib/AccessSequenceTransformer.java @@ -17,6 +17,7 @@ import net.automatalib.word.Word; +@FunctionalInterface public interface AccessSequenceTransformer { Word transformAccessSequence(Word word); diff --git a/api/src/main/java/de/learnlib/TestWordGenerator.java b/api/src/main/java/de/learnlib/TestWordGenerator.java index 2e8808edb..9fd7f378a 100644 --- a/api/src/main/java/de/learnlib/TestWordGenerator.java +++ b/api/src/main/java/de/learnlib/TestWordGenerator.java @@ -29,6 +29,7 @@ * @param * input symbol type */ +@FunctionalInterface public interface TestWordGenerator { /** diff --git a/api/src/main/java/de/learnlib/algorithm/LearnerConstructor.java b/api/src/main/java/de/learnlib/algorithm/LearnerConstructor.java index b5877fc38..00360baf4 100644 --- a/api/src/main/java/de/learnlib/algorithm/LearnerConstructor.java +++ b/api/src/main/java/de/learnlib/algorithm/LearnerConstructor.java @@ -29,6 +29,7 @@ * @param * output domain type */ +@FunctionalInterface public interface LearnerConstructor { /** diff --git a/api/src/main/java/de/learnlib/oracle/AdaptiveMembershipOracle.java b/api/src/main/java/de/learnlib/oracle/AdaptiveMembershipOracle.java index 110ceafad..c554fc60a 100644 --- a/api/src/main/java/de/learnlib/oracle/AdaptiveMembershipOracle.java +++ b/api/src/main/java/de/learnlib/oracle/AdaptiveMembershipOracle.java @@ -30,6 +30,7 @@ * @param * output symbol type */ +@FunctionalInterface public interface AdaptiveMembershipOracle extends BatchProcessor> { /** diff --git a/api/src/main/java/de/learnlib/oracle/BatchProcessor.java b/api/src/main/java/de/learnlib/oracle/BatchProcessor.java index 95ec589d5..0f61f16b8 100644 --- a/api/src/main/java/de/learnlib/oracle/BatchProcessor.java +++ b/api/src/main/java/de/learnlib/oracle/BatchProcessor.java @@ -26,6 +26,7 @@ * @param * batch type */ +@FunctionalInterface public interface BatchProcessor { /** diff --git a/api/src/main/java/de/learnlib/oracle/EmptinessOracle.java b/api/src/main/java/de/learnlib/oracle/EmptinessOracle.java index 77b55911d..4c629e3ad 100644 --- a/api/src/main/java/de/learnlib/oracle/EmptinessOracle.java +++ b/api/src/main/java/de/learnlib/oracle/EmptinessOracle.java @@ -38,6 +38,7 @@ * @param * the output type */ +@FunctionalInterface public interface EmptinessOracle, I, D> { default boolean isCounterExample(Output hypothesis, Iterable input, D output) { @@ -46,7 +47,9 @@ default boolean isCounterExample(Output hypothesis, Iterable @Nullable DefaultQuery findCounterExample(A hypothesis, Collection inputs); + @FunctionalInterface interface DFAEmptinessOracle extends EmptinessOracle, I, Boolean> {} + @FunctionalInterface interface MealyEmptinessOracle extends EmptinessOracle, I, Word> {} } diff --git a/api/src/main/java/de/learnlib/oracle/EquivalenceOracle.java b/api/src/main/java/de/learnlib/oracle/EquivalenceOracle.java index 065c2c747..ee8b75e88 100644 --- a/api/src/main/java/de/learnlib/oracle/EquivalenceOracle.java +++ b/api/src/main/java/de/learnlib/oracle/EquivalenceOracle.java @@ -42,6 +42,7 @@ * @param * output domain type */ +@FunctionalInterface public interface EquivalenceOracle { /** @@ -66,6 +67,7 @@ public interface EquivalenceOracle { * @param * input symbol class */ + @FunctionalInterface interface DFAEquivalenceOracle extends EquivalenceOracle, I, Boolean> {} /** @@ -76,6 +78,7 @@ interface DFAEquivalenceOracle extends EquivalenceOracle, I, Boolea * @param * output symbol class */ + @FunctionalInterface interface MealyEquivalenceOracle extends EquivalenceOracle, I, Word> {} /** @@ -86,6 +89,7 @@ interface MealyEquivalenceOracle extends EquivalenceOracle * output symbol class */ + @FunctionalInterface interface MooreEquivalenceOracle extends EquivalenceOracle, I, Word> {} } diff --git a/api/src/main/java/de/learnlib/oracle/InclusionOracle.java b/api/src/main/java/de/learnlib/oracle/InclusionOracle.java index 94b8a3f2e..e29ffbf33 100644 --- a/api/src/main/java/de/learnlib/oracle/InclusionOracle.java +++ b/api/src/main/java/de/learnlib/oracle/InclusionOracle.java @@ -38,14 +38,17 @@ * @param * the output type */ +@FunctionalInterface public interface InclusionOracle, I, D> extends EquivalenceOracle { default boolean isCounterExample(Output hypothesis, Iterable input, D output) { return !Objects.equals(hypothesis.computeOutput(input), output); } + @FunctionalInterface interface DFAInclusionOracle extends InclusionOracle, I, Boolean>, DFAEquivalenceOracle {} + @FunctionalInterface interface MealyInclusionOracle extends InclusionOracle, I, Word>, MealyEquivalenceOracle {} } diff --git a/api/src/main/java/de/learnlib/oracle/LassoEmptinessOracle.java b/api/src/main/java/de/learnlib/oracle/LassoEmptinessOracle.java index 29caa731a..6ea73d84e 100644 --- a/api/src/main/java/de/learnlib/oracle/LassoEmptinessOracle.java +++ b/api/src/main/java/de/learnlib/oracle/LassoEmptinessOracle.java @@ -29,9 +29,12 @@ * @param the input type * @param the output type */ +@FunctionalInterface public interface LassoEmptinessOracle, I, D> extends EmptinessOracle { + @FunctionalInterface interface DFALassoEmptinessOracle extends LassoEmptinessOracle, I, Boolean> {} + @FunctionalInterface interface MealyLassoEmptinessOracle extends LassoEmptinessOracle, I, Word> {} } diff --git a/api/src/main/java/de/learnlib/oracle/MembershipOracle.java b/api/src/main/java/de/learnlib/oracle/MembershipOracle.java index 618a94d48..af716faa6 100644 --- a/api/src/main/java/de/learnlib/oracle/MembershipOracle.java +++ b/api/src/main/java/de/learnlib/oracle/MembershipOracle.java @@ -33,6 +33,7 @@ * * @see DefaultQuery */ +@FunctionalInterface public interface MembershipOracle extends QueryAnswerer, BatchProcessor> { @Override @@ -92,6 +93,7 @@ default void processBatch(Collection> batch) { * @param * input symbol type */ + @FunctionalInterface interface DFAMembershipOracle extends MembershipOracle {} /** @@ -105,6 +107,7 @@ interface DFAMembershipOracle extends MembershipOracle {} * @param * output symbol type */ + @FunctionalInterface interface MealyMembershipOracle extends MembershipOracle> {} /** @@ -118,6 +121,7 @@ interface MealyMembershipOracle extends MembershipOracle> {} * @param * output symbol type */ + @FunctionalInterface interface MooreMembershipOracle extends MembershipOracle> {} } diff --git a/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java b/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java index 7253d326e..0eca103cc 100644 --- a/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java +++ b/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java @@ -25,6 +25,7 @@ * @param * output domain type */ +@FunctionalInterface public interface QueryAnswerer { default D answerQuery(Word input) { diff --git a/api/src/main/java/de/learnlib/oracle/SingleAdaptiveMembershipOracle.java b/api/src/main/java/de/learnlib/oracle/SingleAdaptiveMembershipOracle.java index 975562604..bf0e63da7 100644 --- a/api/src/main/java/de/learnlib/oracle/SingleAdaptiveMembershipOracle.java +++ b/api/src/main/java/de/learnlib/oracle/SingleAdaptiveMembershipOracle.java @@ -25,6 +25,7 @@ * @see AdaptiveMembershipOracle * @see SingleQueryOracle */ +@FunctionalInterface public interface SingleAdaptiveMembershipOracle extends AdaptiveMembershipOracle { @Override diff --git a/api/src/main/java/de/learnlib/oracle/SingleQueryOracle.java b/api/src/main/java/de/learnlib/oracle/SingleQueryOracle.java index 91b1705ec..ba940dccb 100644 --- a/api/src/main/java/de/learnlib/oracle/SingleQueryOracle.java +++ b/api/src/main/java/de/learnlib/oracle/SingleQueryOracle.java @@ -32,6 +32,7 @@ * @param * output domain type */ +@FunctionalInterface public interface SingleQueryOracle extends MembershipOracle { @Override @@ -48,10 +49,13 @@ default void processQueries(Collection> queries) { @Override D answerQuery(Word prefix, Word suffix); + @FunctionalInterface interface SingleQueryOracleDFA extends SingleQueryOracle, DFAMembershipOracle {} + @FunctionalInterface interface SingleQueryOracleMealy extends SingleQueryOracle>, MealyMembershipOracle {} + @FunctionalInterface interface SingleQueryOracleMoore extends SingleQueryOracle>, MooreMembershipOracle {} } diff --git a/api/src/main/java/de/learnlib/query/OmegaQuery.java b/api/src/main/java/de/learnlib/query/OmegaQuery.java index 183a517c2..9855e7ca8 100644 --- a/api/src/main/java/de/learnlib/query/OmegaQuery.java +++ b/api/src/main/java/de/learnlib/query/OmegaQuery.java @@ -102,16 +102,9 @@ public String toString() { @Override public final boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (!(o instanceof OmegaQuery)) { - return false; - } - - final OmegaQuery that = (OmegaQuery) o; - return periodicity == that.periodicity && Objects.equals(prefix, that.prefix) && - Objects.equals(loop, that.loop) && Objects.equals(output, that.output); + return this == o || o instanceof OmegaQuery that && periodicity == that.periodicity && + Objects.equals(prefix, that.prefix) && Objects.equals(loop, that.loop) && + Objects.equals(output, that.output); } @Override diff --git a/api/src/main/java/de/learnlib/query/Query.java b/api/src/main/java/de/learnlib/query/Query.java index 458b423bc..0eab8d69c 100644 --- a/api/src/main/java/de/learnlib/query/Query.java +++ b/api/src/main/java/de/learnlib/query/Query.java @@ -118,15 +118,8 @@ public final int hashCode() { @Override public final boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Query)) { - return false; - } - - final Query that = (Query) o; - return Objects.equals(getPrefix(), that.getPrefix()) && Objects.equals(getSuffix(), that.getSuffix()); + return this == o || o instanceof Query that && Objects.equals(getPrefix(), that.getPrefix()) && + Objects.equals(getSuffix(), that.getSuffix()); } /** diff --git a/api/src/main/java/de/learnlib/statistic/StatisticCollector.java b/api/src/main/java/de/learnlib/statistic/StatisticCollector.java index 60d46d740..9919b876a 100644 --- a/api/src/main/java/de/learnlib/statistic/StatisticCollector.java +++ b/api/src/main/java/de/learnlib/statistic/StatisticCollector.java @@ -19,6 +19,7 @@ * A utility interface to indicate that the implementing class collects statistical information that may be obtained via * its {@link #getStatisticalData()} method. */ +@FunctionalInterface public interface StatisticCollector { /** diff --git a/api/src/main/java/de/learnlib/sul/ContextExecutableInput.java b/api/src/main/java/de/learnlib/sul/ContextExecutableInput.java index b4beec05a..b601f9cb8 100644 --- a/api/src/main/java/de/learnlib/sul/ContextExecutableInput.java +++ b/api/src/main/java/de/learnlib/sul/ContextExecutableInput.java @@ -26,6 +26,7 @@ * @param * context */ +@FunctionalInterface public interface ContextExecutableInput { /** diff --git a/api/src/main/java/de/learnlib/sul/ExecutableInput.java b/api/src/main/java/de/learnlib/sul/ExecutableInput.java index eda3e80fe..5bb1ef647 100644 --- a/api/src/main/java/de/learnlib/sul/ExecutableInput.java +++ b/api/src/main/java/de/learnlib/sul/ExecutableInput.java @@ -23,6 +23,7 @@ * @param * output */ +@FunctionalInterface public interface ExecutableInput { /** diff --git a/build-config/src/main/resources/learnlib-pmd-ruleset.xml b/build-config/src/main/resources/learnlib-pmd-ruleset.xml index 1dae2428e..00802f952 100644 --- a/build-config/src/main/resources/learnlib-pmd-ruleset.xml +++ b/build-config/src/main/resources/learnlib-pmd-ruleset.xml @@ -25,7 +25,6 @@ limitations under the License. - @@ -55,7 +54,6 @@ limitations under the License. - @@ -102,22 +100,28 @@ limitations under the License. + + + + + + - + - - + - + - + + diff --git a/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzer.java b/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzer.java index 60647eb59..c2b4920bb 100644 --- a/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzer.java +++ b/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzer.java @@ -15,6 +15,7 @@ */ package de.learnlib.acex; +@FunctionalInterface public interface AcexAnalyzer { /** diff --git a/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzers.java b/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzers.java index d8872950b..27efe5bcb 100644 --- a/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzers.java +++ b/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalyzers.java @@ -109,14 +109,10 @@ private static Map createMap(Map getAnalyzers(Direction dir) { - switch (dir) { - case FORWARD: - return getForwardAnalyzers(); - case BACKWARD: - return getBackwardAnalyzers(); - default: - throw new IllegalArgumentException(); - } + return switch (dir) { + case FORWARD -> getForwardAnalyzers(); + case BACKWARD -> getBackwardAnalyzers(); + }; } public static Collection getForwardAnalyzers() { diff --git a/commons/counterexamples/src/main/java/de/learnlib/counterexample/GlobalSuffixFinder.java b/commons/counterexamples/src/main/java/de/learnlib/counterexample/GlobalSuffixFinder.java index 2b1696de4..a454f07f0 100644 --- a/commons/counterexamples/src/main/java/de/learnlib/counterexample/GlobalSuffixFinder.java +++ b/commons/counterexamples/src/main/java/de/learnlib/counterexample/GlobalSuffixFinder.java @@ -41,6 +41,7 @@ * @param * output domain type upper bound */ +@FunctionalInterface public interface GlobalSuffixFinder { /** diff --git a/commons/counterexamples/src/main/java/de/learnlib/counterexample/LocalSuffixFinder.java b/commons/counterexamples/src/main/java/de/learnlib/counterexample/LocalSuffixFinder.java index 051c429c7..8797e24ca 100644 --- a/commons/counterexamples/src/main/java/de/learnlib/counterexample/LocalSuffixFinder.java +++ b/commons/counterexamples/src/main/java/de/learnlib/counterexample/LocalSuffixFinder.java @@ -47,6 +47,7 @@ * @param * output domain type upper bound */ +@FunctionalInterface public interface LocalSuffixFinder { /** diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java index 4125f908d..a9ff6e79f 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java @@ -203,15 +203,7 @@ public int hashCode() { @Override public boolean equals(@Nullable Object o) { - if (this == o) { - return true; - } - if (!(o instanceof BooleanMap.Entry)) { - return false; - } - - final BooleanMap.Entry that = (BooleanMap.Entry) o; - return Objects.equals(key, that.key); + return this == o || o instanceof BooleanMap.Entry that && Objects.equals(key, that.key); } } } diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/ObservationTableFeature.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/ObservationTableFeature.java index 3c7c350aa..a5ef9b232 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/ObservationTableFeature.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/ObservationTableFeature.java @@ -15,6 +15,7 @@ */ package de.learnlib.datastructure.observationtable; +@FunctionalInterface public interface ObservationTableFeature { ObservationTable getObservationTable(); diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/reader/ObservationTableReader.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/reader/ObservationTableReader.java index 1004a7d2c..b60143ddb 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/reader/ObservationTableReader.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/reader/ObservationTableReader.java @@ -26,6 +26,7 @@ * @param * observation (output) domain class */ +@FunctionalInterface public interface ObservationTableReader { /** diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriter.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriter.java index b65743698..afce2f6c8 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriter.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriter.java @@ -23,6 +23,7 @@ import de.learnlib.datastructure.observationtable.ObservationTable; import net.automatalib.common.util.IOUtil; +@FunctionalInterface public interface ObservationTableWriter { void write(ObservationTable table, Appendable out) throws IOException; diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBlueFringePTAState.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBlueFringePTAState.java index b4da79886..2c69bd784 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBlueFringePTAState.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBlueFringePTAState.java @@ -18,6 +18,10 @@ import net.automatalib.common.util.comparison.CmpUtil; import org.checkerframework.checker.nullness.qual.Nullable; +/** + * Note: this class has a natural ordering that is inconsistent with equals. + */ +@SuppressWarnings("PMD.OverrideBothEqualsAndHashCodeOnComparable") public abstract class AbstractBlueFringePTAState, SP, TP> extends AbstractBasePTAState implements Comparable { diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/config/ProcessingOrder.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/config/ProcessingOrder.java index a4bfbe74c..1e2729ffa 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/config/ProcessingOrder.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/config/ProcessingOrder.java @@ -32,6 +32,7 @@ * * @see DefaultProcessingOrders */ +@FunctionalInterface public interface ProcessingOrder { /** diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/visualization/PTAVisualizationHelper.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/visualization/PTAVisualizationHelper.java index 7a8ca0e64..9ffa8a89e 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/visualization/PTAVisualizationHelper.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/visualization/PTAVisualizationHelper.java @@ -36,8 +36,8 @@ public boolean getEdgeProperties(S src, Map properties) { super.getEdgeProperties(src, edge, tgt, properties); - final I input = edge.getInput(); - properties.put(EdgeAttrs.LABEL, input + " / " + automaton.getTransitionProperty(edge.getTransition())); + final I input = edge.input(); + properties.put(EdgeAttrs.LABEL, input + " / " + automaton.getTransitionProperty(edge.transition())); return true; } diff --git a/commons/settings/src/main/java/de/learnlib/setting/LearnLibSettingsSource.java b/commons/settings/src/main/java/de/learnlib/setting/LearnLibSettingsSource.java index d97e3ee01..166aa0b51 100644 --- a/commons/settings/src/main/java/de/learnlib/setting/LearnLibSettingsSource.java +++ b/commons/settings/src/main/java/de/learnlib/setting/LearnLibSettingsSource.java @@ -17,4 +17,5 @@ import net.automatalib.common.util.setting.SettingsSource; +@FunctionalInterface public interface LearnLibSettingsSource extends SettingsSource {} diff --git a/drivers/basic/src/main/java/de/learnlib/driver/reflect/Error.java b/drivers/basic/src/main/java/de/learnlib/driver/reflect/Error.java index fe80cab2d..54a1ca6fe 100644 --- a/drivers/basic/src/main/java/de/learnlib/driver/reflect/Error.java +++ b/drivers/basic/src/main/java/de/learnlib/driver/reflect/Error.java @@ -39,15 +39,7 @@ public int hashCode() { @Override public boolean equals(@Nullable Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof Error)) { - return false; - } - - final Error other = (Error) obj; - return Objects.equals(this.id, other.id); + return this == obj || obj instanceof Error other && Objects.equals(this.id, other.id); } @Override diff --git a/drivers/basic/src/main/java/de/learnlib/driver/reflect/InstanceConstructor.java b/drivers/basic/src/main/java/de/learnlib/driver/reflect/InstanceConstructor.java index bf347708b..b9beaf9af 100644 --- a/drivers/basic/src/main/java/de/learnlib/driver/reflect/InstanceConstructor.java +++ b/drivers/basic/src/main/java/de/learnlib/driver/reflect/InstanceConstructor.java @@ -31,7 +31,6 @@ final class InstanceConstructor implements ContextHandler { this.params = params; } - @SuppressWarnings("PMD.PreserveStackTrace") @Override public Object createContext() { try { diff --git a/drivers/basic/src/main/java/de/learnlib/driver/reflect/MethodInput.java b/drivers/basic/src/main/java/de/learnlib/driver/reflect/MethodInput.java index 9c220ea27..d35beda8b 100644 --- a/drivers/basic/src/main/java/de/learnlib/driver/reflect/MethodInput.java +++ b/drivers/basic/src/main/java/de/learnlib/driver/reflect/MethodInput.java @@ -36,7 +36,6 @@ public MethodInput(String displayName, Method method, Object[] parameters) { this.parameters = parameters; } - @SuppressWarnings("PMD.PreserveStackTrace") @Override public MethodOutput execute(Object context) { try { diff --git a/drivers/basic/src/main/java/de/learnlib/driver/reflect/ReturnValue.java b/drivers/basic/src/main/java/de/learnlib/driver/reflect/ReturnValue.java index 6ba36534e..2fb55346d 100644 --- a/drivers/basic/src/main/java/de/learnlib/driver/reflect/ReturnValue.java +++ b/drivers/basic/src/main/java/de/learnlib/driver/reflect/ReturnValue.java @@ -40,15 +40,7 @@ public int hashCode() { @Override public boolean equals(@Nullable Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof ReturnValue)) { - return false; - } - - final ReturnValue other = (ReturnValue) obj; - return Objects.equals(this.ret, other.ret); + return this == obj || obj instanceof ReturnValue other && Objects.equals(this.ret, other.ret); } @Override diff --git a/drivers/mapper/src/test/java/de/learnlib/mapper/SULMapperCompositionTest.java b/drivers/mapper/src/test/java/de/learnlib/mapper/SULMapperCompositionTest.java index d1370c630..ba3725909 100644 --- a/drivers/mapper/src/test/java/de/learnlib/mapper/SULMapperCompositionTest.java +++ b/drivers/mapper/src/test/java/de/learnlib/mapper/SULMapperCompositionTest.java @@ -126,16 +126,12 @@ public void post() {} @Override public Character step(Character in) { - switch (in) { - case OUTER_EXCEPTION_TRIGGER_CHAR: - throw new OuterWrappedException(new IllegalArgumentException()); - case INNER_EXCEPTION_TRIGGER_CHAR: - throw new InnerUnwrappedException(); - case NESTED_EXCEPTION_TRIGGER_CHAR: - throw new NestedUnwrappedException(); - default: - return in; - } + return switch (in) { + case OUTER_EXCEPTION_TRIGGER_CHAR -> throw new OuterWrappedException(new IllegalArgumentException()); + case INNER_EXCEPTION_TRIGGER_CHAR -> throw new InnerUnwrappedException(); + case NESTED_EXCEPTION_TRIGGER_CHAR -> throw new NestedUnwrappedException(); + default -> in; + }; } } diff --git a/examples/pom.xml b/examples/pom.xml index b69ee71f8..1afeacbc7 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -193,12 +193,35 @@ limitations under the License. org.apache.maven.plugins maven-surefire-plugin + + + + org.apache.maven.surefire + surefire-testng + ${surefire-plugin.version} + + - com.github.caciocavallosilano.cacio.ctc.CTCToolkit - com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment false + + @{argLine} + --add-exports=java.desktop/java.awt=ALL-UNNAMED + --add-exports=java.desktop/java.awt.peer=ALL-UNNAMED + --add-exports=java.desktop/sun.awt.image=ALL-UNNAMED + --add-exports=java.desktop/sun.java2d=ALL-UNNAMED + --add-exports=java.desktop/java.awt.dnd.peer=ALL-UNNAMED + --add-exports=java.desktop/sun.awt=ALL-UNNAMED + --add-exports=java.desktop/sun.awt.event=ALL-UNNAMED + --add-exports=java.desktop/sun.awt.datatransfer=ALL-UNNAMED + --add-exports=java.base/sun.security.action=ALL-UNNAMED + --add-opens=java.base/java.util=ALL-UNNAMED + --add-opens=java.desktop/java.awt=ALL-UNNAMED + --add-opens=java.desktop/sun.java2d=ALL-UNNAMED + --add-opens=java.base/java.lang.reflect=ALL-UNNAMED + diff --git a/examples/src/main/java/de/learnlib/example/Example3.java b/examples/src/main/java/de/learnlib/example/Example3.java index acae7bc26..c73da80a8 100644 --- a/examples/src/main/java/de/learnlib/example/Example3.java +++ b/examples/src/main/java/de/learnlib/example/Example3.java @@ -161,16 +161,14 @@ public static void main(String[] args) { } private @Nullable String exec(BoundedStringQueue s, String input) { - switch (input) { - case OFFER_1: - case OFFER_2: + return switch (input) { + case OFFER_1, OFFER_2 -> { s.offer(input); - return "void"; - case POLL: - return s.poll(); - default: - throw new IllegalArgumentException("unknown input symbol"); - } + yield "void"; + } + case POLL -> s.poll(); + default -> throw new IllegalArgumentException("unknown input symbol"); + }; } /** diff --git a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java index c3588db6a..c0c127b74 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java +++ b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java @@ -127,14 +127,11 @@ public String getAbstractSymbol(Event c) { @Override public Event getRepresentative(String a) { - switch (a) { - case "recv": - return new Recv(); - case "msg": - return new Msg<>(0, "d"); - default: - throw new IllegalArgumentException("Unknown abstract: " + a); - } + return switch (a) { + case "recv" -> new Recv(); + case "msg" -> new Msg<>(0, "d"); + default -> throw new IllegalArgumentException("Unknown abstract: " + a); + }; } @Override diff --git a/examples/src/main/java/de/learnlib/example/aaar/Event.java b/examples/src/main/java/de/learnlib/example/aaar/Event.java index 31b239ba9..c04946c9c 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/Event.java +++ b/examples/src/main/java/de/learnlib/example/aaar/Event.java @@ -38,12 +38,8 @@ public String toString() { @Override public boolean equals(@Nullable Object o) { - if (!(o instanceof Msg)) { - return false; - } - final Msg that = (Msg) o; - - return this.seq == that.seq && Objects.equals(this.data, that.data); + return this == o || + o instanceof Msg that && this.seq == that.seq && Objects.equals(this.data, that.data); } @Override diff --git a/examples/src/main/java/de/learnlib/example/aaar/Protocol.java b/examples/src/main/java/de/learnlib/example/aaar/Protocol.java index bc6fc19cd..097a24ac5 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/Protocol.java +++ b/examples/src/main/java/de/learnlib/example/aaar/Protocol.java @@ -41,15 +41,12 @@ private void reset() { } private String handleEvent(Event event) { - if (event instanceof Msg) { - Msg msg = (Msg) event; - + if (event instanceof Msg msg) { if (buffer == null && msg.seq % 2 == seqExp % 2) { buffer = msg.data; seqExp++; return "ind"; } - return "-"; } else if (event instanceof Recv) { if (buffer == null) { diff --git a/examples/src/test/java/de/learnlib/example/ExamplesTest.java b/examples/src/test/java/de/learnlib/example/ExamplesTest.java index 92324bbeb..f1491d23d 100644 --- a/examples/src/test/java/de/learnlib/example/ExamplesTest.java +++ b/examples/src/test/java/de/learnlib/example/ExamplesTest.java @@ -25,6 +25,7 @@ import javax.swing.SwingUtilities; +import com.github.caciocavallosilano.cacio.ctc.junit.CacioExtension; import de.learnlib.example.aaar.AlternatingBitExampleExplicit; import de.learnlib.example.aaar.AlternatingBitExampleGeneric; import net.automatalib.modelchecker.ltsmin.LTSminUtil; @@ -40,6 +41,9 @@ public class ExamplesTest { @BeforeClass public void setupAutoClose() { if (isJVMCompatible()) { + // hack: the static initializer of this class does the magic we want, so only invoke it on compatible JVMs + new CacioExtension(); + // As soon as we observe an event that indicates a new window, close it to prevent blocking the tests. Toolkit.getDefaultToolkit().addAWTEventListener(event -> { final WindowEvent windowEvent = (WindowEvent) event; @@ -173,12 +177,13 @@ public void testExample3() throws InvocationTargetException, InterruptedExceptio } private static boolean isJVMCompatible() { - return Runtime.version().feature() == 11; + final int feature = Runtime.version().feature(); + return feature == 17 || feature == 21; } private static void requireJVMCompatibility() { - if (Runtime.version().feature() != 11) { - throw new SkipException("The headless AWT environment currently only works with Java 11 or <=8"); + if (!isJVMCompatible()) { + throw new SkipException("The headless AWT environment only works with specific JVM versions"); } } diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/LearningCache.java b/filters/cache/src/main/java/de/learnlib/filter/cache/LearningCache.java index cf6a862a9..9f6b13244 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/LearningCache.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/LearningCache.java @@ -40,6 +40,7 @@ * @param * output symbol type */ +@FunctionalInterface public interface LearningCache { /** @@ -59,6 +60,7 @@ public interface LearningCache { * @param * input symbol type */ + @FunctionalInterface interface DFALearningCache extends LearningCache, I, Boolean> {} /** @@ -69,6 +71,7 @@ interface DFALearningCache extends LearningCache, I, Boolean> {} * @param * output symbol type */ + @FunctionalInterface interface MealyLearningCache extends LearningCache, I, Word> {} /** @@ -79,5 +82,6 @@ interface MealyLearningCache extends LearningCache * output symbol type */ + @FunctionalInterface interface MooreLearningCache extends LearningCache, I, Word> {} } diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/AdaptiveQueryCache.java b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/AdaptiveQueryCache.java index 1c1c94490..4fdc24465 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/AdaptiveQueryCache.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/AdaptiveQueryCache.java @@ -276,15 +276,14 @@ public Response processOutput(O out) { final Response response = delegate.processOutput(out); - switch (response) { - case FINISHED: + return switch (response) { + case FINISHED -> { isFinished = true; - return Response.FINISHED; - case RESET: - return Response.FINISHED; - default: - return response; - } + yield Response.FINISHED; + } + case RESET -> Response.FINISHED; + case SYMBOL -> response; + }; } } diff --git a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/BoundedDeque.java b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/BoundedDeque.java index 7a147e2ae..475b1e3f9 100644 --- a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/BoundedDeque.java +++ b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/BoundedDeque.java @@ -100,14 +100,11 @@ public BoundedDeque(int capacity, AccessPolicy accessPolicy, EvictPolicy evictPo * @return the evicted element, may be {@code null} if the queue was empty */ private @Nullable E evict() { - switch (evictPolicy) { - case EVICT_OLDEST: - return deque.pollFirst(); - case EVICT_NEWEST: - return deque.pollLast(); - default: - throw new IllegalStateException("Illegal evict policy: " + evictPolicy); - } + return switch (evictPolicy) { + case EVICT_OLDEST -> deque.pollFirst(); + case EVICT_NEWEST -> deque.pollLast(); + default -> throw new IllegalStateException("Illegal evict policy: " + evictPolicy); + }; } /** @@ -117,14 +114,10 @@ public BoundedDeque(int capacity, AccessPolicy accessPolicy, EvictPolicy evictPo * @return the evicted element, may be {@code null} if the queue was empty */ public @Nullable E retrieve() { - switch (accessPolicy) { - case LIFO: - return deque.pollLast(); - case FIFO: - return deque.pollFirst(); - default: - throw new IllegalStateException("Illegal evict policy: " + evictPolicy); - } + return switch (accessPolicy) { + case LIFO -> deque.pollLast(); + case FIFO -> deque.pollFirst(); + }; } /** @@ -134,14 +127,10 @@ public BoundedDeque(int capacity, AccessPolicy accessPolicy, EvictPolicy evictPo * @return the top-most element of the container */ public @Nullable E peek() { - switch (accessPolicy) { - case LIFO: - return deque.peekLast(); - case FIFO: - return deque.peekFirst(); - default: - throw new IllegalStateException("Illegal evict policy: " + evictPolicy); - } + return switch (accessPolicy) { + case LIFO -> deque.peekLast(); + case FIFO -> deque.peekFirst(); + }; } /** diff --git a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/SystemStateHandler.java b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/SystemStateHandler.java index d3e48d6ef..7db0f174f 100644 --- a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/SystemStateHandler.java +++ b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/SystemStateHandler.java @@ -31,6 +31,7 @@ * @param * system state class */ +@FunctionalInterface public interface SystemStateHandler { /** diff --git a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWMethodEQOracle.java b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWMethodEQOracle.java index a8e201797..7cba476b0 100644 --- a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWMethodEQOracle.java +++ b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWMethodEQOracle.java @@ -186,6 +186,7 @@ public RandomWMethodEQOracle(MembershipOracle sulOracle, @Override public Stream> generateTestWords(A hypothesis, Collection inputs) { + // explicitly assign type to (redundant) variable, otherwise javac complains UniversalDeterministicAutomaton aut = hypothesis; return doGenerateTestWords(aut, inputs); } diff --git a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWpMethodEQOracle.java b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWpMethodEQOracle.java index f6310b642..2b525f98a 100644 --- a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWpMethodEQOracle.java +++ b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWpMethodEQOracle.java @@ -187,6 +187,7 @@ public RandomWpMethodEQOracle(MembershipOracle sulOracle, @Override public Stream> generateTestWords(A hypothesis, Collection inputs) { + // explicitly assign type to (redundant) variable, otherwise javac complains UniversalDeterministicAutomaton aut = hypothesis; return doGenerateTestWords(aut, inputs); } diff --git a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractDynamicBatchProcessorBuilder.java b/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractDynamicBatchProcessorBuilder.java index f951cbb5f..97c9b3d10 100644 --- a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractDynamicBatchProcessorBuilder.java +++ b/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractDynamicBatchProcessorBuilder.java @@ -144,16 +144,10 @@ public OR create() { if (customExecutor != null) { executor = customExecutor; } else { - switch (poolPolicy) { - case FIXED: - executor = Executors.newFixedThreadPool(size); - break; - case CACHED: - executor = new ScalingThreadPoolExecutor(0, size, DEFAULT_KEEP_ALIVE_TIME, TimeUnit.SECONDS); - break; - default: - throw new IllegalStateException("Unknown pool policy: " + poolPolicy); - } + executor = switch (poolPolicy) { + case FIXED -> Executors.newFixedThreadPool(size); + case CACHED -> new ScalingThreadPoolExecutor(0, size, DEFAULT_KEEP_ALIVE_TIME, TimeUnit.SECONDS); + }; } return buildOracle(supplier, batchSize, executor); diff --git a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessorBuilder.java b/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessorBuilder.java index 9c675df33..734a927ca 100644 --- a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessorBuilder.java +++ b/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessorBuilder.java @@ -142,16 +142,10 @@ public OR create() { if (customExecutor != null) { executor = customExecutor; } else { - switch (poolPolicy) { - case FIXED: - executor = Executors.newFixedThreadPool(size); - break; - case CACHED: - executor = new ScalingThreadPoolExecutor(0, size, DEFAULT_KEEP_ALIVE_TIME, TimeUnit.SECONDS); - break; - default: - throw new IllegalStateException("Unknown pool policy: " + poolPolicy); - } + executor = switch (poolPolicy) { + case FIXED -> Executors.newFixedThreadPool(size); + case CACHED -> new ScalingThreadPoolExecutor(0, size, DEFAULT_KEEP_ALIVE_TIME, TimeUnit.SECONDS); + }; } return buildOracle(instances, minBatchSize, executor); diff --git a/pom.xml b/pom.xml index 6245bdfce..be377bbef 100644 --- a/pom.xml +++ b/pom.xml @@ -213,9 +213,9 @@ limitations under the License. UTF-8 UTF-8 - 11 - 11 - 11 + 17 + 17 + 17 @@ -235,32 +235,32 @@ limitations under the License. 3.8.0 3.1.3 3.9.0 - 0.8.12 + 0.8.13 3.4.2 3.11.2 1.0.0 - 3.26.0 + 3.28.0 3.1.0 3.3.1 3.3.0 3.21.0 3.3.1 - 4.8.6.6 + 4.9.8.1 3.5.2 1.3.0 0.13.0-SNAPSHOT 0.1.1 - 1.11.1 + 1.18 3.48.3 10.21.1 - 1.7.0 + 1.10.0 0.9.0 2.3.1 1.5.15 1.11 - 5.14.2 + 5.20.0 2.0.16 7.10.2 @@ -1217,15 +1217,6 @@ limitations under the License. - - jdk17-compat - - 17 - - - 1.17.3 - - examples diff --git a/test-support/learner-it-support/src/main/java/de/learnlib/testsupport/it/learner/PassiveLearnerVariantList.java b/test-support/learner-it-support/src/main/java/de/learnlib/testsupport/it/learner/PassiveLearnerVariantList.java index d47f156b6..67c894dd2 100644 --- a/test-support/learner-it-support/src/main/java/de/learnlib/testsupport/it/learner/PassiveLearnerVariantList.java +++ b/test-support/learner-it-support/src/main/java/de/learnlib/testsupport/it/learner/PassiveLearnerVariantList.java @@ -22,6 +22,7 @@ import net.automatalib.automaton.transducer.SubsequentialTransducer; import net.automatalib.word.Word; +@FunctionalInterface public interface PassiveLearnerVariantList { /** @@ -37,12 +38,16 @@ public interface PassiveLearnerVariantList { */ void addLearnerVariant(String name, PassiveLearningAlgorithm learner); + @FunctionalInterface interface DFALearnerVariantList extends PassiveLearnerVariantList, I, Boolean> {} + @FunctionalInterface interface MealyLearnerVariantList extends PassiveLearnerVariantList, I, Word> {} + @FunctionalInterface interface MooreLearnerVariantList extends PassiveLearnerVariantList, I, Word> {} + @FunctionalInterface interface SSTLearnerVariantList extends PassiveLearnerVariantList, I, Word> {} } diff --git a/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/PassiveLearningExample.java b/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/PassiveLearningExample.java index 08e3dfc91..6dab3bb83 100644 --- a/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/PassiveLearningExample.java +++ b/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/PassiveLearningExample.java @@ -20,15 +20,20 @@ import de.learnlib.query.DefaultQuery; import net.automatalib.word.Word; +@FunctionalInterface public interface PassiveLearningExample { Collection> getSamples(); + @FunctionalInterface interface DFAPassiveLearningExample extends PassiveLearningExample {} + @FunctionalInterface interface MealyPassiveLearningExample extends PassiveLearningExample> {} + @FunctionalInterface interface MoorePassiveLearningExample extends PassiveLearningExample> {} + @FunctionalInterface interface SSTPassiveLearningExample extends PassiveLearningExample> {} } diff --git a/test-support/test-support/src/main/java/de/learnlib/testsupport/AbstractBFOracleTest.java b/test-support/test-support/src/main/java/de/learnlib/testsupport/AbstractBFOracleTest.java index 0b7a187c8..8d6bacf32 100644 --- a/test-support/test-support/src/main/java/de/learnlib/testsupport/AbstractBFOracleTest.java +++ b/test-support/test-support/src/main/java/de/learnlib/testsupport/AbstractBFOracleTest.java @@ -47,7 +47,6 @@ public void setUp() { } @AfterMethod - @SuppressWarnings("PMD.SignatureDeclareThrowsException") public void tearDown() throws Exception { this.mock.close(); }