From 2ad2a74edc4f12d9d09ef3f321a85576021f2db4 Mon Sep 17 00:00:00 2001 From: Markus Frohme Date: Fri, 3 Jan 2025 17:33:50 +0100 Subject: [PATCH 01/10] adjust to AutomataLib refactorings --- .../learnlib/datastructure/pta/AbstractBasePTAState.java | 4 ++-- .../java/de/learnlib/datastructure/pta/RedBlueMerge.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBasePTAState.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBasePTAState.java index f59d4c7490..8d376ca955 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBasePTAState.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/AbstractBasePTAState.java @@ -41,7 +41,7 @@ public SP getStateProperty() { } public S copy() { - return copy((transProperties != null) ? transProperties.clone() : null); + return copy((transProperties != null) ? new ArrayStorage<>(transProperties) : null); } public S copy(@Nullable ArrayStorage newTPs) { @@ -50,7 +50,7 @@ public S copy(@Nullable ArrayStorage newTPs) { S copy = (S) clone(); copy.transProperties = newTPs; if (successors != null) { - copy.successors = successors.clone(); + copy.successors = new ArrayStorage<>(successors); } return copy; } catch (CloneNotSupportedException ex) { diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java index 5927506e74..492bb6f6d4 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java @@ -122,7 +122,7 @@ public boolean merge() { newTPs = mergedTPs; } } else { - newTPs = rSuccTPs.clone(); + newTPs = new ArrayStorage<>(rSuccTPs); } } @@ -252,7 +252,7 @@ private void updateRedTransition(S redSrc, int input, S tgt, @Nullable TP transP if (redSrc.successors == null) { newSuccs = new ArrayStorage<>(alphabetSize); } else { - newSuccs = redSrc.successors.clone(); + newSuccs = new ArrayStorage<>(redSrc.successors); } succMod.set(id, newSuccs); } @@ -263,7 +263,7 @@ private void updateRedTransition(S redSrc, int input, S tgt, @Nullable TP transP if (redSrc.transProperties == null) { newTransProps = new ArrayStorage<>(alphabetSize); } else { - newTransProps = redSrc.transProperties.clone(); + newTransProps = new ArrayStorage<>(redSrc.transProperties); } transPropMod.set(id, newTransProps); } @@ -332,7 +332,7 @@ private boolean mergeRedStateProperty(S qr, S qb) { return null; } } else { - tps1OrCopy = tps1.clone(); + tps1OrCopy = new ArrayStorage<>(tps1); tps1OrCopy.set(i++, tp2); break; } From f332d31980dc3fad61be25bd870e76d33e08189f Mon Sep 17 00:00:00 2001 From: Markus Frohme Date: Fri, 3 Jan 2025 18:18:56 +0100 Subject: [PATCH 02/10] bump basic depdency versions --- pom.xml | 82 ++++++++++++++++++++++++++++++-------------- test-support/pom.xml | 31 +++++++++++++++++ 2 files changed, 87 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index dbd73c307e..7239e0f78b 100644 --- a/pom.xml +++ b/pom.xml @@ -217,33 +217,33 @@ limitations under the License. 3.1.0 - 3.2.1 - 3.6.0 + 3.3.1 + 3.7.1 3.3.0 - 3.3.2 - 3.11.0 + 3.4.0 + 3.11.0 4.3.0 - 3.6.0 - 3.1.1 - 3.4.1 - 3.1.2 - 3.1.0 - 3.4.5 - 3.1.1 - 3.6.0 - 0.8.8 - 3.3.0 - 3.6.0 + 3.8.1 + 3.1.3 + 3.5.0 + ${surefire-plugin.version} + 3.2.7 + 3.8.0 + 3.1.3 + 3.9.0 + 0.8.12 + 3.4.2 + 3.11.2 1.0.0 3.14.0 - 3.0.1 + 3.1.0 3.3.1 - 3.2.1 - 3.12.1 - 3.3.0 + 3.3.0 + 3.21.0 + 3.3.1 4.7.3.6 - 3.2.2 - 1.2.0 + 3.5.2 + 1.3.0 0.12.0-SNAPSHOT @@ -251,13 +251,14 @@ limitations under the License. 1.11.1 3.40.0 9.3 - 0.5.1 + 1.7.0 + 0.9.0 2.3.1 - 1.5.13 + 1.5.15 1.11 - 5.6.0 - 2.0.9 - 7.9.0 + 5.14.2 + 2.0.16 + 7.10.2 http://learnlib.github.io/automatalib/maven-site/${automatalib.version}/apidocs/ @@ -1012,6 +1013,35 @@ limitations under the License. + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-bytecode-version + verify + + enforce + + + + + ${maven.compiler.target} + test,runtime + + + true + + + + + + org.codehaus.mojo + extra-enforcer-rules + ${extra-enforcer-rules.version} + + + org.apache.maven.plugins maven-dependency-plugin diff --git a/test-support/pom.xml b/test-support/pom.xml index 3e82458671..82c662dbee 100644 --- a/test-support/pom.xml +++ b/test-support/pom.xml @@ -51,4 +51,35 @@ limitations under the License. + + + + code-analysis + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-bytecode-version + + + + + ${maven.compiler.testTarget} + + + true + + + + + + + + From 279f5bc58e52ee4e2e2831d1751a06373adaf7b9 Mon Sep 17 00:00:00 2001 From: Markus Frohme Date: Fri, 3 Jan 2025 20:51:53 +0100 Subject: [PATCH 03/10] bump checkstyle + cleanups --- .../algorithm/dhc/mealy/MealyDHCTest.java | 2 +- .../algorithm/kv/dfa/KearnsVaziraniDFA.java | 4 +-- .../kv/mealy/KearnsVaziraniMealy.java | 4 +-- .../vpa/hypothesis/AbstractHypTrans.java | 2 ++ .../vpa/hypothesis/ContextPair.java | 2 ++ .../vpa/hypothesis/DTNode.java | 2 ++ .../observationpack/vpa/hypothesis/DTree.java | 2 ++ .../vpa/hypothesis/HypIntTrans.java | 2 ++ .../vpa/hypothesis/HypLoc.java | 2 ++ .../vpa/hypothesis/HypRetTrans.java | 2 ++ .../vpa/hypothesis/OneSEVPAHypothesis.java | 2 ++ .../vpa/hypothesis/TransList.java | 2 ++ .../algorithm/procedural/sba/SBALearner.java | 2 +- .../algorithm/procedural/spa/SPALearner.java | 2 +- .../procedural/spmm/SPMMLearner.java | 2 +- .../algorithm/procedural/sba/it/SBAIT.java | 6 ++-- .../algorithm/procedural/spa/it/SPAIT.java | 11 ++++---- .../algorithm/procedural/spmm/it/SPMMIT.java | 2 +- .../algorithm/ttt/vpa/NonDetState.java | 7 +---- .../ttt/vpa/NondetStackContents.java | 3 +- .../ttt/vpa/OutputInconsistency.java | 4 --- .../learnlib/algorithm/ostia/OSTIATest.java | 2 ++ .../algorithm/rpni/EDSMScoreTest.java | 6 ++-- .../de/learnlib/oracle/AutomatonOracle.java | 27 +++++++++--------- .../de/learnlib/oracle/QueryAnswerer.java | 2 ++ .../java/de/learnlib/query/DefaultQuery.java | 3 -- .../projects/basic/archetype.properties | 6 ++-- .../projects/complete/archetype.properties | 6 ++-- .../automatalib-learnlib-checkstyle.xml | 21 ++++++++++++-- .../discriminationtree/model/BooleanMap.java | 2 +- .../pta/MergedAutomatonTest.java | 6 ++-- commons/settings/learnlib.properties | 4 +-- .../src/test/resources/automatalib.properties | 2 +- .../java/de/learnlib/util/Experiment.java | 28 +++++++++++++++++-- .../mapper/SULMapperCompositionTest.java | 2 +- .../aaar/AlternatingBitExampleExplicit.java | 4 +-- .../aaar/AlternatingBitExampleGeneric.java | 2 +- .../de/learnlib/example/aaar/Protocol.java | 2 +- .../filter/cache/mealy/MasterQuery.java | 3 -- .../filter/cache/moore/MasterQuery.java | 3 -- .../cache/AbstractParallelCacheTest.java | 6 ++-- .../reuse/test/DomainKnowledgeTest.java | 2 +- .../filter/reuse/test/LearningTest.java | 2 +- .../filter/reuse/test/QuiescenceTest.java | 4 +-- .../statistic/oracle/HistogramOracle.java | 5 ++-- .../oracle/CounterAdaptiveOracleTest.java | 4 +-- .../equivalence/AbstractEQOracleTest.java | 3 ++ .../equivalence/SampleSetEQOracleTest.java | 2 +- .../TestWordEQOracleBatchTest.java | 8 +++--- .../mealy/RandomWalkEQOracleTest.java | 4 +-- .../membership/SimulatorOmegaOracle.java | 2 +- pom.xml | 4 +-- 52 files changed, 145 insertions(+), 99 deletions(-) diff --git a/algorithms/active/dhc/src/test/java/de/learnlib/algorithm/dhc/mealy/MealyDHCTest.java b/algorithms/active/dhc/src/test/java/de/learnlib/algorithm/dhc/mealy/MealyDHCTest.java index 99423003cc..3d1230a9d9 100644 --- a/algorithms/active/dhc/src/test/java/de/learnlib/algorithm/dhc/mealy/MealyDHCTest.java +++ b/algorithms/active/dhc/src/test/java/de/learnlib/algorithm/dhc/mealy/MealyDHCTest.java @@ -69,7 +69,7 @@ public void testMealyDHCGrid() { dhc.startLearning(); MealyMachine hypo = dhc.getHypothesisModel(); - Assert.assertEquals(hypo.size(), (xsize * ysize), "Mismatch in size of learned hypothesis"); + Assert.assertEquals(hypo.size(), xsize * ysize, "Mismatch in size of learned hypothesis"); } 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 9f28ffc897..ae852f5bcf 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 @@ -188,7 +188,7 @@ private void updateTransitions(List transList, long encodedTrans = transList.get(i); int sourceState = (int) (encodedTrans >> Integer.SIZE); - int transIdx = (int) (encodedTrans); + int transIdx = (int) encodedTrans; StateInfo sourceInfo = stateInfos.get(sourceState); I symbol = alphabet.getSymbol(transIdx); @@ -202,7 +202,7 @@ private void updateTransitions(List transList, long encodedTrans = transList.get(i); int sourceState = (int) (encodedTrans >> Integer.SIZE); - int transIdx = (int) (encodedTrans); + int transIdx = (int) encodedTrans; setTransition(sourceState, transIdx, succs.get(i)); } 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 1f3d72d3a9..ffd3101daf 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 @@ -200,7 +200,7 @@ private void updateTransitions(List transList, long encodedTrans = transList.get(i); int sourceState = (int) (encodedTrans >> Integer.SIZE); - int transIdx = (int) (encodedTrans); + int transIdx = (int) encodedTrans; StateInfo> sourceInfo = stateInfos.get(sourceState); I symbol = alphabet.getSymbol(transIdx); @@ -214,7 +214,7 @@ private void updateTransitions(List transList, long encodedTrans = transList.get(i); int sourceState = (int) (encodedTrans >> Integer.SIZE); - int transIdx = (int) (encodedTrans); + int transIdx = (int) encodedTrans; CompactTransition trans = hypothesis.getTransition(sourceState, transIdx); assert trans != null; diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/AbstractHypTrans.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/AbstractHypTrans.java index a749c3dd59..d33c1b4004 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/AbstractHypTrans.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/AbstractHypTrans.java @@ -20,6 +20,8 @@ import net.automatalib.word.Word; /** + * Abstract hypothesis transition. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/ContextPair.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/ContextPair.java index 114628a46c..87857a2fc2 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/ContextPair.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/ContextPair.java @@ -18,6 +18,8 @@ import net.automatalib.word.Word; /** + * A context pair of prefix and suffix to discriminate a hypothesis state. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTNode.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTNode.java index c0330cd9d2..f07e178d89 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTNode.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTNode.java @@ -24,6 +24,8 @@ import de.learnlib.datastructure.list.IntrusiveListEntry; /** + * Specific discrimination tree node implementation. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTree.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTree.java index 34de15132b..6c10398db6 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTree.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/DTree.java @@ -24,6 +24,8 @@ import net.automatalib.word.Word; /** + * Specific discrimination tree implementation. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypIntTrans.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypIntTrans.java index e00b04bc13..a924d4f47c 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypIntTrans.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypIntTrans.java @@ -16,6 +16,8 @@ package de.learnlib.algorithm.observationpack.vpa.hypothesis; /** + * Internal transition. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypLoc.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypLoc.java index 7edfbe6309..192129e40a 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypLoc.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypLoc.java @@ -25,6 +25,8 @@ import net.automatalib.word.Word; /** + * Hypothesis location. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypRetTrans.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypRetTrans.java index 0994dca602..c2feea7a05 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypRetTrans.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/HypRetTrans.java @@ -16,6 +16,8 @@ package de.learnlib.algorithm.observationpack.vpa.hypothesis; /** + * Return transition. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/OneSEVPAHypothesis.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/OneSEVPAHypothesis.java index 49120d9ece..4a59b96712 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/OneSEVPAHypothesis.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/OneSEVPAHypothesis.java @@ -26,6 +26,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; /** + * Hypothesis model. + * * @param * input symbol type */ diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/TransList.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/TransList.java index 2df3eae858..87f730b24b 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/TransList.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/hypothesis/TransList.java @@ -19,6 +19,8 @@ import de.learnlib.datastructure.list.IntrusiveListEntry; /** + * A list of transitions. + * * @param * input symbol type */ diff --git a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/sba/SBALearner.java b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/sba/SBALearner.java index 3a0fdbbbe4..d3b78a7f7c 100644 --- a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/sba/SBALearner.java +++ b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/sba/SBALearner.java @@ -81,7 +81,7 @@ public SBALearner(ProceduralInputAlphabet alphabet, LearnerConstructor, Boolean> learnerConstructor) { this(alphabet, oracle, - (i) -> learnerConstructor, + i -> learnerConstructor, AcexAnalyzers.BINARY_SEARCH_BWD, new OptimizingATManager<>(alphabet)); } diff --git a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java index 93a26f32ea..b4612bcdc7 100644 --- a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java +++ b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java @@ -77,7 +77,7 @@ public SPALearner(ProceduralInputAlphabet alphabet, LearnerConstructor learnerConstructor) { this(alphabet, oracle, - (i) -> learnerConstructor, + i -> learnerConstructor, AcexAnalyzers.BINARY_SEARCH_FWD, new OptimizingATRManager<>(alphabet)); } diff --git a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spmm/SPMMLearner.java b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spmm/SPMMLearner.java index 3a96f4e628..10f1042e56 100644 --- a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spmm/SPMMLearner.java +++ b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spmm/SPMMLearner.java @@ -83,7 +83,7 @@ public SPMMLearner(ProceduralInputAlphabet alphabet, this(alphabet, errorOutput, oracle, - (i) -> learnerConstructor, + i -> learnerConstructor, new OptimizingATManager<>(alphabet, errorOutput)); } diff --git a/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/sba/it/SBAIT.java b/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/sba/it/SBAIT.java index 9f3735f9b5..d22982bf97 100644 --- a/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/sba/it/SBAIT.java +++ b/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/sba/it/SBAIT.java @@ -68,7 +68,9 @@ private static class Builder { private final SBALearnerVariantList variants; private final List, ATManager>> atProviders; - Builder(ProceduralInputAlphabet alphabet, MembershipOracle mqOracle, SBALearnerVariantList variants) { + Builder(ProceduralInputAlphabet alphabet, + MembershipOracle mqOracle, + SBALearnerVariantList variants) { this.alphabet = alphabet; this.mqOracle = mqOracle; this.variants = variants; @@ -81,7 +83,7 @@ > & SupportsGrowingAlphabet, ATManager> atProvider : atProviders) { final SBALearner learner = - new SBALearner<>(alphabet, mqOracle, (i) -> provider, analyzer, atProvider.apply(alphabet)); + new SBALearner<>(alphabet, mqOracle, i -> provider, analyzer, atProvider.apply(alphabet)); final String name = String.format("adapter=%s,analyzer=%s,manager=%s", provider, analyzer, atProvider); variants.addLearnerVariant(name, learner); diff --git a/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spa/it/SPAIT.java b/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spa/it/SPAIT.java index 5ea07fcf36..d3d17905e2 100644 --- a/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spa/it/SPAIT.java +++ b/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spa/it/SPAIT.java @@ -67,7 +67,9 @@ private static class Builder { private final SPALearnerVariantList variants; private final List, ATRManager>> atrProviders; - Builder(ProceduralInputAlphabet alphabet, MembershipOracle mqOracle, SPALearnerVariantList variants) { + Builder(ProceduralInputAlphabet alphabet, + MembershipOracle mqOracle, + SPALearnerVariantList variants) { this.alphabet = alphabet; this.mqOracle = mqOracle; this.variants = variants; @@ -79,11 +81,8 @@ & SupportsGrowingAlphabet & AccessSequenceTransforme for (AbstractNamedAcexAnalyzer analyzer : AcexAnalyzers.getAllAnalyzers()) { for (Function, ATRManager> atrProvider : atrProviders) { - final SPALearner learner = new SPALearner<>(alphabet, - mqOracle, - (i) -> provider, - analyzer, - atrProvider.apply(alphabet)); + final SPALearner learner = + new SPALearner<>(alphabet, mqOracle, i -> provider, analyzer, atrProvider.apply(alphabet)); final String name = String.format("adapter=%s,analyzer=%s,manager=%s", provider, analyzer, atrProvider); variants.addLearnerVariant(name, learner); diff --git a/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spmm/it/SPMMIT.java b/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spmm/it/SPMMIT.java index cdb8813702..d15157cbbf 100644 --- a/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spmm/it/SPMMIT.java +++ b/algorithms/active/procedural/src/test/java/de/learnlib/algorithm/procedural/spmm/it/SPMMIT.java @@ -89,7 +89,7 @@ , O> & SupportsGrowingAlphabet learner = new SPMMLearner<>(alphabet, errorOutput, mqOracle, - (i) -> provider, + i -> provider, atProvider.apply(alphabet, errorOutput)); final String name = String.format("adapter=%s,manager=%s", provider, atProvider); variants.addLearnerVariant(name, learner); diff --git a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NonDetState.java b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NonDetState.java index fab23de983..b9f189c375 100644 --- a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NonDetState.java +++ b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NonDetState.java @@ -20,10 +20,6 @@ import net.automatalib.automaton.vpa.State; -/** - * @param - * location type - */ final class NonDetState { private final NondetStackContents stack; @@ -44,9 +40,8 @@ public State determinize() { return new State<>(locations.iterator().next(), NondetStackContents.toDet(stack)); } - @SuppressWarnings("PMD.UselessParentheses") // to make it explicit which binary operator has higher precedence public boolean isNonDet() { - return locations.size() > 1 || (stack != null && stack.isTrueNondet()); + return stack != null && stack.isTrueNondet() || locations.size() > 1; } public NondetStackContents getStack() { diff --git a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NondetStackContents.java b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NondetStackContents.java index be12cdb6d7..80be8a3b66 100644 --- a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NondetStackContents.java +++ b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/NondetStackContents.java @@ -29,11 +29,10 @@ final class NondetStackContents { private final boolean isTrueNondet; - @SuppressWarnings("PMD.UselessParentheses") // to make it explicit which binary operator has higher precedence NondetStackContents(Set syms, NondetStackContents rest) { this.syms = syms; this.rest = rest; - this.isTrueNondet = syms.size() > 1 || (rest != null && rest.isTrueNondet); + this.isTrueNondet = rest != null && rest.isTrueNondet || syms.size() > 1; } public static NondetStackContents push(Set syms, NondetStackContents rest) { diff --git a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/OutputInconsistency.java b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/OutputInconsistency.java index 892e2832de..ea1a1d9d01 100644 --- a/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/OutputInconsistency.java +++ b/algorithms/active/ttt-vpa/src/main/java/de/learnlib/algorithm/ttt/vpa/OutputInconsistency.java @@ -18,10 +18,6 @@ import de.learnlib.algorithm.observationpack.vpa.hypothesis.ContextPair; import de.learnlib.algorithm.observationpack.vpa.hypothesis.HypLoc; -/** - * @param - * input symbol type - */ final class OutputInconsistency { public final HypLoc location; diff --git a/algorithms/passive/ostia/src/test/java/de/learnlib/algorithm/ostia/OSTIATest.java b/algorithms/passive/ostia/src/test/java/de/learnlib/algorithm/ostia/OSTIATest.java index 2261814900..1936a8692a 100644 --- a/algorithms/passive/ostia/src/test/java/de/learnlib/algorithm/ostia/OSTIATest.java +++ b/algorithms/passive/ostia/src/test/java/de/learnlib/algorithm/ostia/OSTIATest.java @@ -60,6 +60,8 @@ public static Object[][] sizes() { /** * Returns the examples from Section 18.3.4 of Colin de la Higuera's book "Grammatical Inference" with a's encoded * as 0 and b's encoded as 1. + * + * @return the encoded traces */ public List> getExampleSamples() { return Arrays.asList(Pair.of(IntSeq.of(0), IntSeq.of(1)), diff --git a/algorithms/passive/rpni/src/test/java/de/learnlib/algorithm/rpni/EDSMScoreTest.java b/algorithms/passive/rpni/src/test/java/de/learnlib/algorithm/rpni/EDSMScoreTest.java index c5a7a64c36..1c13100d59 100644 --- a/algorithms/passive/rpni/src/test/java/de/learnlib/algorithm/rpni/EDSMScoreTest.java +++ b/algorithms/passive/rpni/src/test/java/de/learnlib/algorithm/rpni/EDSMScoreTest.java @@ -129,12 +129,12 @@ private BlueFringePTA initializePTA() { final BlueFringePTAState qA = pta.getState(Word.fromLetter(0)); final BlueFringePTAState qAA = pta.getState(Word.fromSymbols(0, 0)); - pta.init((q) -> {}); - pta.promote(qA, (q) -> {}); + pta.init(q -> {}); + pta.promote(qA, q -> {}); final RedBlueMerge, Boolean, Void> merge = pta.tryMerge(qEpsilon, qAA); Assert.assertNotNull(merge); - merge.apply(pta, (q) -> {}); + merge.apply(pta, q -> {}); return pta; } diff --git a/api/src/main/java/de/learnlib/oracle/AutomatonOracle.java b/api/src/main/java/de/learnlib/oracle/AutomatonOracle.java index 9b01a708a4..33038eb30f 100644 --- a/api/src/main/java/de/learnlib/oracle/AutomatonOracle.java +++ b/api/src/main/java/de/learnlib/oracle/AutomatonOracle.java @@ -43,11 +43,11 @@ public interface AutomatonOracle, I, D * Returns whether the given input and output is a counter example for the given hypothesis. * * @param hypothesis - * the hypothesis + * the hypothesis * @param inputs - * the input sequence + * the input sequence * @param output - * the output corresponding to the input. + * the output corresponding to the input. * * @return whether the given input and output is a counter example. */ @@ -79,15 +79,16 @@ public interface AutomatonOracle, I, D void pre(); /** - * Returns the multiplier used to compute the number of queries this automaton oracle should perform to - * decide whether a given hypothesis is a counter example. + * Returns the multiplier used to compute the number of queries this automaton oracle should perform to decide + * whether a given hypothesis is a counter example. * * @return the multiplier */ double getMultiplier(); /** - * @see #getMultiplier() + * Sets the multiplier value. See {@link #getMultiplier()}. + * * @param multiplier * the multiplier */ @@ -97,9 +98,9 @@ public interface AutomatonOracle, I, D * Processes the given input. Implementations could use membership oracles to process the query. * * @param hypothesis - * the hypothesis. + * the hypothesis. * @param input - * the input to process. + * the input to process. * * @return the processed query. */ @@ -109,11 +110,11 @@ public interface AutomatonOracle, I, D * Adds words to a datastructure. The key part of the implementation is that undefined inputs will be skipped. * * @param hypothesis - * the automaton to add words for. + * the automaton to add words for. * @param inputs - * the input alphabet. + * the input alphabet. * @param prefix - * the current prefix to extend. + * the current prefix to extend. */ default void addWords(A hypothesis, Collection inputs, Word prefix) { for (I i : inputs) { @@ -174,9 +175,9 @@ default void addWords(A hypothesis, Collection inputs, Word pref * {@code hypothesis.size() * getMultiplier()}. * * @param hypothesis - * the hypothesis automaton. + * the hypothesis automaton. * @param inputs - * the input alphabet. + * the input alphabet. * * @return the counter example, or {@code null} if a counter example does not exist */ diff --git a/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java b/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java index 9c25e859c4..1b215437f3 100644 --- a/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java +++ b/api/src/main/java/de/learnlib/oracle/QueryAnswerer.java @@ -18,6 +18,8 @@ import net.automatalib.word.Word; /** + * A simple interface for answering {@link Word}-based queries. + * * @param * input symbol type * @param diff --git a/api/src/main/java/de/learnlib/query/DefaultQuery.java b/api/src/main/java/de/learnlib/query/DefaultQuery.java index c428d8100e..9bef09971f 100644 --- a/api/src/main/java/de/learnlib/query/DefaultQuery.java +++ b/api/src/main/java/de/learnlib/query/DefaultQuery.java @@ -71,9 +71,6 @@ public void answer(D output) { this.output = output; } - /** - * @see AbstractQuery#toStringWithAnswer(Object) - */ @Override public String toString() { return toStringWithAnswer(output); diff --git a/archetypes/basic/src/test/resources-template/projects/basic/archetype.properties b/archetypes/basic/src/test/resources-template/projects/basic/archetype.properties index a090bf3ed9..22e2f495b3 100644 --- a/archetypes/basic/src/test/resources-template/projects/basic/archetype.properties +++ b/archetypes/basic/src/test/resources-template/projects/basic/archetype.properties @@ -1,8 +1,8 @@ -package=it.pkg -version=0.1-SNAPSHOT -groupId=archetype.it artifactId=basic +groupId=archetype.it learnlibVersion=${project.version} +package=it.pkg +version=0.1-SNAPSHOT diff --git a/archetypes/complete/src/test/resources-template/projects/complete/archetype.properties b/archetypes/complete/src/test/resources-template/projects/complete/archetype.properties index acb03c4291..a101658283 100644 --- a/archetypes/complete/src/test/resources-template/projects/complete/archetype.properties +++ b/archetypes/complete/src/test/resources-template/projects/complete/archetype.properties @@ -1,8 +1,8 @@ -package=it.pkg -version=0.1-SNAPSHOT -groupId=archetype.it artifactId=complete +groupId=archetype.it learnlibVersion=${project.version} +package=it.pkg +version=0.1-SNAPSHOT diff --git a/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml b/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml index 7b210760bf..b9f8cdaabc 100644 --- a/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml +++ b/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml @@ -46,12 +46,14 @@ limitations under the License. + + @@ -81,10 +83,12 @@ limitations under the License. + + @@ -107,6 +111,8 @@ limitations under the License. + + @@ -115,6 +121,7 @@ limitations under the License. + @@ -138,12 +145,18 @@ limitations under the License. + + + + + + @@ -152,6 +165,7 @@ limitations under the License. + @@ -178,15 +192,15 @@ limitations under the License. + + + - - - @@ -196,6 +210,7 @@ limitations under the License. + 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 6e7c1eb05e..58db65d0d1 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 @@ -147,7 +147,7 @@ public Set> entrySet() { return entries; } - private static class BooleanSet extends AbstractSet { + private static final class BooleanSet extends AbstractSet { private static final List VALUES = Arrays.asList(false, true); diff --git a/commons/datastructures/src/test/java/de/learnlib/datastructure/pta/MergedAutomatonTest.java b/commons/datastructures/src/test/java/de/learnlib/datastructure/pta/MergedAutomatonTest.java index 5a564c50c9..d2c1475978 100644 --- a/commons/datastructures/src/test/java/de/learnlib/datastructure/pta/MergedAutomatonTest.java +++ b/commons/datastructures/src/test/java/de/learnlib/datastructure/pta/MergedAutomatonTest.java @@ -68,9 +68,9 @@ public void testMerge() { final BlueFringePTAState q6 = pta.getState(Word.fromSymbols(0, 0, 0)); // fast-forward algorithm - pta.init((q) -> {}); - pta.promote(q2, (q) -> {}); - pta.promote(q3, (q) -> {}); + pta.init(q -> {}); + pta.promote(q2, q -> {}); + pta.promote(q3, q -> {}); final RedBlueMerge, Boolean, Void> merge = pta.tryMerge(q3, q4); Assert.assertNotNull(merge); diff --git a/commons/settings/learnlib.properties b/commons/settings/learnlib.properties index e3d84a874d..d0d11f21f1 100644 --- a/commons/settings/learnlib.properties +++ b/commons/settings/learnlib.properties @@ -1,7 +1,7 @@ #This file is explicitly not part of test/resources to check whether the local file reader works correctly +automatalib.word.delim.left=delim_left_override +automatalib.word.delim.right=delim_right learnlib.parallel.batch_size.dynamic=1 learnlib.parallel.batch_size.static=2 learnlib.parallel.pool_policy=CACHED learnlib.parallel.pool_size=3 -automatalib.word.delim.right=delim_right -automatalib.word.delim.left=delim_left_override diff --git a/commons/settings/src/test/resources/automatalib.properties b/commons/settings/src/test/resources/automatalib.properties index b8ddff9c88..f5628d2a40 100644 --- a/commons/settings/src/test/resources/automatalib.properties +++ b/commons/settings/src/test/resources/automatalib.properties @@ -1,2 +1,2 @@ -automatalib.word.empty=empty_rep automatalib.word.delim.left=delim_left +automatalib.word.empty=empty_rep diff --git a/commons/util/src/main/java/de/learnlib/util/Experiment.java b/commons/util/src/main/java/de/learnlib/util/Experiment.java index 28ee4eb4f5..96a2fbf74e 100644 --- a/commons/util/src/main/java/de/learnlib/util/Experiment.java +++ b/commons/util/src/main/java/de/learnlib/util/Experiment.java @@ -31,9 +31,10 @@ import org.slf4j.LoggerFactory; /** - * runs a learning experiment. + * Runs a learning experiment. * - * @param the automaton type + * @param + * the automaton type */ public class Experiment { @@ -53,6 +54,14 @@ public Experiment(LearningAlgorithm learningAlgorithm, this.impl = new ExperimentImpl<>(learningAlgorithm, equivalenceAlgorithm, inputs); } + /** + * Run the experiment, once. + * + * @return the final hypothesis + * + * @throws IllegalStateException + * if invoked more than once + */ public A run() { if (this.finalHypothesis != null) { throw new IllegalStateException("Experiment has already been run"); @@ -62,6 +71,14 @@ public A run() { return finalHypothesis; } + /** + * Returns the final hypothesis model. + * + * @return the final hypothesis model + * + * @throws IllegalStateException + * if the experiment has not been run yet + */ public A getFinalHypothesis() { if (finalHypothesis == null) { throw new IllegalStateException("Experiment has not yet been run"); @@ -83,6 +100,8 @@ private void profileStop(String taskname) { } /** + * Decides whether intermediate hypothesis models should be logged. + * * @param logModels * flag whether models should be logged */ @@ -91,6 +110,8 @@ public void setLogModels(boolean logModels) { } /** + * Decides whether the experiment runtime should be profiled. + * * @param profile * flag whether learning process should be profiled */ @@ -99,6 +120,8 @@ public void setProfile(boolean profile) { } /** + * Returns the counter for the number of refinement rounds the experiment took. + * * @return the rounds */ public Counter getRounds() { @@ -162,6 +185,7 @@ public A run() { } public static class DFAExperiment extends Experiment> { + public DFAExperiment(LearningAlgorithm, I, Boolean> learningAlgorithm, EquivalenceOracle, I, Boolean> equivalenceAlgorithm, Alphabet inputs) { 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 9c6cf3045e..3baa37dc3e 100644 --- a/drivers/mapper/src/test/java/de/learnlib/mapper/SULMapperCompositionTest.java +++ b/drivers/mapper/src/test/java/de/learnlib/mapper/SULMapperCompositionTest.java @@ -116,7 +116,7 @@ public void testComposition() { Assert.assertThrows(mappedSUL::fork); } - private static class MockSUL implements SUL { + private static final class MockSUL implements SUL { @Override public void pre() {} 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 b421cf09fa..b780fd0682 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java +++ b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java @@ -112,7 +112,7 @@ private static void printInfo(ExplicitAAARLearnerMealy { + private static final class InitialAbstraction implements ExplicitInitialAbstraction { @Override public String getAbstractSymbol(Event c) { @@ -143,7 +143,7 @@ public Collection getInitialAbstracts() { } } - private static class Incrementor implements Function { + private static final class Incrementor implements Function { private int cnt; diff --git a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java index 4231fe7931..7d2d557c75 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java +++ b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java @@ -99,7 +99,7 @@ private static void printInfo(GenericAAARLearnerMealy { + private static final class EventAbstractor implements Function { private int cnt; 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 d9d25c6954..04c1ec1991 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/Protocol.java +++ b/examples/src/main/java/de/learnlib/example/aaar/Protocol.java @@ -44,7 +44,7 @@ private String handleEvent(Event event) { if (event instanceof Msg) { Msg msg = (Msg) event; - if (buffer == null && (msg.seq % 2 == seqExp % 2)) { + if (buffer == null && msg.seq % 2 == seqExp % 2) { buffer = msg.data; seqExp++; return "ind"; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MasterQuery.java b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MasterQuery.java index 5ece9e5d04..511e3d0588 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MasterQuery.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MasterQuery.java @@ -106,9 +106,6 @@ private void answerSlave(Query> slave) { slave.answer(answer.subWord(start, end)); } - /** - * @see AbstractQuery#toStringWithAnswer(Object) - */ @Override public String toString() { return toStringWithAnswer(answer); diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MasterQuery.java b/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MasterQuery.java index e5ecd816e0..42d40c7aa1 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MasterQuery.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MasterQuery.java @@ -106,9 +106,6 @@ private void answerSlave(Query> slave) { slave.answer(answer.subWord(start, end + 1)); } - /** - * @see AbstractQuery#toStringWithAnswer(Object) - */ @Override public String toString() { return toStringWithAnswer(answer); diff --git a/filters/cache/src/test/java/de/learnlib/filter/cache/AbstractParallelCacheTest.java b/filters/cache/src/test/java/de/learnlib/filter/cache/AbstractParallelCacheTest.java index 63023f079d..62fe153875 100644 --- a/filters/cache/src/test/java/de/learnlib/filter/cache/AbstractParallelCacheTest.java +++ b/filters/cache/src/test/java/de/learnlib/filter/cache/AbstractParallelCacheTest.java @@ -75,9 +75,9 @@ public void teardown() { public void testConcurrentMembershipQueries() { Assert.assertEquals(getNumberOfQueries(), 0); - final int numQueries = ((int) IntStream.rangeClosed(0, MAXIMUM_LENGTH_OF_QUERIES) - .mapToDouble(i -> Math.pow(alphabet.size(), i)) - .sum()); + final int numQueries = (int) IntStream.rangeClosed(0, MAXIMUM_LENGTH_OF_QUERIES) + .mapToDouble(i -> Math.pow(alphabet.size(), i)) + .sum(); final List> queries = new ArrayList<>(numQueries); diff --git a/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/DomainKnowledgeTest.java b/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/DomainKnowledgeTest.java index d74374203c..a01d6ddbbc 100644 --- a/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/DomainKnowledgeTest.java +++ b/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/DomainKnowledgeTest.java @@ -111,7 +111,7 @@ public void testReuseNodePrefixWhileReusing() { Assert.assertEquals(output.size(), 7); } - private static class NullReuseCapableFactory implements Supplier> { + private static final class NullReuseCapableFactory implements Supplier> { @Override public ReuseCapableOracle get() { diff --git a/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/LearningTest.java b/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/LearningTest.java index dcc32d6af2..bd69406fbd 100644 --- a/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/LearningTest.java +++ b/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/LearningTest.java @@ -66,7 +66,7 @@ public void simpleTest() throws IOException { Assert.assertTrue(sb.toString().startsWith("digraph g")); } - private static class TestOracleFactory implements Supplier> { + private static final class TestOracleFactory implements Supplier> { @Override public ReuseCapableOracle get() { diff --git a/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/QuiescenceTest.java b/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/QuiescenceTest.java index 6aa29250a0..0ed8568c0c 100644 --- a/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/QuiescenceTest.java +++ b/filters/reuse/src/test/java/de/learnlib/filter/reuse/test/QuiescenceTest.java @@ -52,7 +52,7 @@ public void simpleTest() { learner.startLearning(); } - private static class TestOracleFactory implements Supplier> { + private static final class TestOracleFactory implements Supplier> { @Override public ReuseCapableOracle get() { @@ -61,7 +61,7 @@ public ReuseCapableOracle get() { } - static class TestOracle implements ReuseCapableOracle { + static final class TestOracle implements ReuseCapableOracle { private final int threshold = 3; diff --git a/filters/statistics/src/main/java/de/learnlib/filter/statistic/oracle/HistogramOracle.java b/filters/statistics/src/main/java/de/learnlib/filter/statistic/oracle/HistogramOracle.java index 678423167a..dfc5c695b4 100644 --- a/filters/statistics/src/main/java/de/learnlib/filter/statistic/oracle/HistogramOracle.java +++ b/filters/statistics/src/main/java/de/learnlib/filter/statistic/oracle/HistogramOracle.java @@ -76,6 +76,8 @@ public class HistogramOracle implements StatisticOracle { private final MembershipOracle delegate; /** + * Default constructor. + * * @param next * real oracle * @param name @@ -94,9 +96,6 @@ public final void processQueries(Collection> queries) { this.delegate.processQueries(queries); } - /** - * @return the data set collected by this oracle. - */ @Override public final HistogramDataSet getStatisticalData() { return this.dataSet; diff --git a/filters/statistics/src/test/java/de/learnlib/filter/statistic/oracle/CounterAdaptiveOracleTest.java b/filters/statistics/src/test/java/de/learnlib/filter/statistic/oracle/CounterAdaptiveOracleTest.java index 245b1251bb..b91308a814 100644 --- a/filters/statistics/src/test/java/de/learnlib/filter/statistic/oracle/CounterAdaptiveOracleTest.java +++ b/filters/statistics/src/test/java/de/learnlib/filter/statistic/oracle/CounterAdaptiveOracleTest.java @@ -94,7 +94,7 @@ private Collection>> generateQueries(int numQueri /** * We can't mock this implementation because queries actually need to get delegated. */ - private static class DummyOracle implements AdaptiveMembershipOracle { + private static final class DummyOracle implements AdaptiveMembershipOracle { @Override public void processQueries(Collection> adaptiveQueries) { @@ -109,7 +109,7 @@ public void processQueries(Collection { diff --git a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/AbstractEQOracleTest.java b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/AbstractEQOracleTest.java index 8e68dbf0b5..6951e27fdd 100644 --- a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/AbstractEQOracleTest.java +++ b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/AbstractEQOracleTest.java @@ -60,6 +60,9 @@ public void testGeneratedEQQueries() { /** * The check method to be invoked for every query generated by the tested equivalence oracle. + * + * @param query + * the query to check */ protected abstract void checkGeneratedQuery(Word query); diff --git a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/SampleSetEQOracleTest.java b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/SampleSetEQOracleTest.java index 1c91c327c0..c3aceb9866 100644 --- a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/SampleSetEQOracleTest.java +++ b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/SampleSetEQOracleTest.java @@ -54,7 +54,7 @@ public void setUp() { this.oracle.add(generateTestWord(alphabet), Boolean.TRUE); this.oracle.add(generateTestWord(alphabet), Boolean.TRUE); // check if unsuccessful queries will be removed - this.oracle.findCounterExample(((prefix, suffix) -> Boolean.TRUE), ALPHABET); + this.oracle.findCounterExample((prefix, suffix) -> Boolean.TRUE, ALPHABET); this.expectedTestWords = Arrays.asList(generateTestWord(alphabet), generateTestWord(alphabet), generateTestWord(alphabet)); diff --git a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/TestWordEQOracleBatchTest.java b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/TestWordEQOracleBatchTest.java index f2a66ba1b8..bbebb8f211 100644 --- a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/TestWordEQOracleBatchTest.java +++ b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/TestWordEQOracleBatchTest.java @@ -51,7 +51,7 @@ public void testBatchMode() { Assert.assertEquals(hyp.getQueryCounter(), THRESHOLD); } - private static class DummyHypothesis implements Output { + private static final class DummyHypothesis implements Output { private int queryCounter; @@ -67,7 +67,7 @@ int getQueryCounter() { } } - private static class DummyMQOracle implements DFAMembershipOracle { + private static final class DummyMQOracle implements DFAMembershipOracle { private int queryCounter; @@ -81,7 +81,7 @@ public void processQueries(Collection> queries) { } } - private static class DummyEQOracle extends AbstractTestWordEQOracle, I, Boolean> { + private static final class DummyEQOracle extends AbstractTestWordEQOracle, I, Boolean> { private int generatedWordsCounter; @@ -96,7 +96,7 @@ int getGeneratedWordsCounter() { @Override protected Stream> generateTestWords(Output hypothesis, Collection inputs) { final I sym = inputs.iterator().next(); - return Stream.generate(() -> Word.fromLetter(sym)).peek((w) -> generatedWordsCounter++).limit(MAX_QUERIES); + return Stream.generate(() -> Word.fromLetter(sym)).peek(w-> generatedWordsCounter++).limit(MAX_QUERIES); } } diff --git a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/mealy/RandomWalkEQOracleTest.java b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/mealy/RandomWalkEQOracleTest.java index c4b9dec966..7b0ba9f2f9 100644 --- a/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/mealy/RandomWalkEQOracleTest.java +++ b/oracles/equivalence-oracles/src/test/java/de/learnlib/oracle/equivalence/mealy/RandomWalkEQOracleTest.java @@ -53,7 +53,7 @@ public void testOracle() { Assert.assertTrue(dummySUL.isCalledPost()); } - private static class DummySUL implements SUL { + private static final class DummySUL implements SUL { private boolean calledPre; private boolean calledPost; @@ -94,7 +94,7 @@ public boolean isCalledPost() { } } - private static class DummyMealy extends CompactMealy { + private static final class DummyMealy extends CompactMealy { DummyMealy(Alphabet alphabet) { super(alphabet); diff --git a/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/SimulatorOmegaOracle.java b/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/SimulatorOmegaOracle.java index 3ddf31d4a1..306705c340 100644 --- a/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/SimulatorOmegaOracle.java +++ b/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/SimulatorOmegaOracle.java @@ -55,7 +55,7 @@ public class SimulatorOmegaOracle implements SingleQuery private final SimpleDTS simpleDTS; /** - * @see #getMembershipOracle() + * The oracle to answer queries. */ private final SimulatorOracle simulatorOracle; diff --git a/pom.xml b/pom.xml index 7239e0f78b..f16c1b4149 100644 --- a/pom.xml +++ b/pom.xml @@ -219,7 +219,7 @@ limitations under the License. 3.1.0 3.3.1 3.7.1 - 3.3.0 + 3.6.0 3.4.0 3.11.0 4.3.0 @@ -250,7 +250,7 @@ limitations under the License. 0.1.1 1.11.1 3.40.0 - 9.3 + 10.21.1 1.7.0 0.9.0 2.3.1 From b9c4d9b28c743b3ab9b9f244138ac1669abda843 Mon Sep 17 00:00:00 2001 From: Markus Frohme Date: Sat, 4 Jan 2025 17:12:06 +0100 Subject: [PATCH 04/10] bump spotbugs + cleanups --- .../learnlib-spotbugs-exclusions.xml | 46 +++++++------------ .../datastructure/pta/PTATransition.java | 9 +--- .../datastructure/pta/RedBlueMerge.java | 25 ++++++---- .../datastructure/pta/wrapper/DFAWrapper.java | 1 - .../pta/wrapper/MealyWrapper.java | 1 - .../pta/wrapper/MooreWrapper.java | 1 - .../cache/sul/StateLocalInputSULCache.java | 5 +- .../learnlib/filter/reuse/tree/ReuseEdge.java | 31 +++++-------- .../equivalence/AbstractTestWordEQOracle.java | 2 - .../vpa/RandomWellMatchedWordsEQOracle.java | 2 +- .../AbstractDynamicBatchProcessorBuilder.java | 14 +++++- .../AbstractStaticBatchProcessor.java | 13 ++---- .../AbstractStaticBatchProcessorBuilder.java | 22 ++++++--- pom.xml | 2 +- .../ExampleRandomStateLocalInputMealy.java | 24 ++++++++-- 15 files changed, 103 insertions(+), 95 deletions(-) diff --git a/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml b/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml index 3d1b71075c..f9dc037c54 100644 --- a/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml +++ b/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml @@ -32,34 +32,22 @@ limitations under the License. We have CheckerFramework for this anyway --> + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - @@ -68,14 +56,14 @@ limitations under the License. - - - - + + + + diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/PTATransition.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/PTATransition.java index 37b0c42c0a..2e8954a4df 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/PTATransition.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/PTATransition.java @@ -15,8 +15,6 @@ */ package de.learnlib.datastructure.pta; -import java.util.Objects; - import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.nullness.qual.Nullable; @@ -25,11 +23,8 @@ public class PTATransition> { private final S source; private final int index; - public PTATransition(S source, @NonNegative int index) { - this.source = Objects.requireNonNull(source); - if (index < 0) { - throw new IllegalArgumentException(); - } + PTATransition(S source, @NonNegative int index) { + this.source = source; this.index = index; } diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java index 492bb6f6d4..e643ad2956 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java @@ -42,16 +42,12 @@ public class RedBlueMerge, SP, T private boolean merged; public RedBlueMerge(AbstractBlueFringePTA pta, S qr, S qb) { - if (!qr.isRed()) { - throw new IllegalArgumentException("Merge target must be a red state"); - } - if (!qb.isBlue()) { - throw new IllegalArgumentException("Merge source must be a blue state"); - } + this(pta, qr, qb, validateInputs(pta, qr, qb)); + } + // utility constructor to prevent finalizer attacks, see SEI CERT Rule OBJ-11 + private RedBlueMerge(AbstractBlueFringePTA pta, S qr, S qb, int numRedStates) { this.pta = pta; - - int numRedStates = pta.getNumRedStates(); this.succMod = new ArrayStorage<>(numRedStates); this.transPropMod = new ArrayStorage<>(numRedStates); this.propMod = new ArrayStorage<>(numRedStates); @@ -61,6 +57,19 @@ public RedBlueMerge(AbstractBlueFringePTA pta, S qr, S qb) { this.qb = qb; } + private static , SP, TP> int validateInputs(AbstractBlueFringePTA pta, + S qr, + S qb) { + if (!qr.isRed()) { + throw new IllegalArgumentException("Merge target must be a red state"); + } + if (!qb.isBlue()) { + throw new IllegalArgumentException("Merge source must be a blue state"); + } + + return pta.getNumRedStates(); + } + public S getRedState() { return qr; } diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/DFAWrapper.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/DFAWrapper.java index 6d4c25f4cf..b78a27f49e 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/DFAWrapper.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/DFAWrapper.java @@ -33,7 +33,6 @@ public class DFAWrapper, I> private final BasePTA pta; public DFAWrapper(Alphabet alphabet, BasePTA pta) { - assert alphabet.size() == pta.getInputAlphabet().size(); this.alphabet = alphabet; this.pta = pta; } diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MealyWrapper.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MealyWrapper.java index 7a01369e1c..716cbb6c8f 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MealyWrapper.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MealyWrapper.java @@ -32,7 +32,6 @@ public class MealyWrapper, I, O> private final BasePTA pta; public MealyWrapper(Alphabet alphabet, BasePTA pta) { - assert alphabet.size() == pta.getInputAlphabet().size(); this.alphabet = alphabet; this.pta = pta; } diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MooreWrapper.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MooreWrapper.java index f2773d6f26..31e2582e16 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MooreWrapper.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/wrapper/MooreWrapper.java @@ -32,7 +32,6 @@ public class MooreWrapper, I, O> private final BasePTA pta; public MooreWrapper(Alphabet alphabet, BasePTA pta) { - assert alphabet.size() == pta.getInputAlphabet().size(); this.alphabet = alphabet; this.pta = pta; } diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/sul/StateLocalInputSULCache.java b/filters/cache/src/main/java/de/learnlib/filter/cache/sul/StateLocalInputSULCache.java index 66886dcda6..842120c866 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/sul/StateLocalInputSULCache.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/sul/StateLocalInputSULCache.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import de.learnlib.filter.cache.sul.StateLocalInputSULCache.StateLocalInputSULCacheState; import de.learnlib.sul.StateLocalInputSUL; @@ -82,9 +83,7 @@ static class StateLocalInputSULCacheImpl StateLocalInputSUL sul) { super(incMealy, mealyTs, sul); this.delegate = sul; - S init = mealyTs.getInitialState(); - assert init != null; - this.initialState = init; + this.initialState = Objects.requireNonNull(mealyTs.getInitialState()); this.enabledInputCache = enabledInputCache; this.inputsTrace = new ArrayList<>(); } diff --git a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseEdge.java b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseEdge.java index 0c846ed42e..969d671ad8 100644 --- a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseEdge.java +++ b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseEdge.java @@ -47,15 +47,6 @@ public class ReuseEdge { * in case of quiescence maybe {@code null}. */ public ReuseEdge(ReuseNode source, ReuseNode target, I input, O output) { - if (source == null) { - throw new IllegalArgumentException("Source not allowed to be null."); - } - if (target == null) { - throw new IllegalArgumentException("Target not allowed to be null."); - } - if (input == null) { - throw new IllegalArgumentException("Input not allowed to be null."); - } this.source = source; this.target = target; this.input = input; @@ -65,41 +56,41 @@ public ReuseEdge(ReuseNode source, ReuseNode target, I input, /** * The source node from this edge. * - * @return source, never {@code null}. + * @return the source */ - public final ReuseNode getSource() { + public ReuseNode getSource() { return source; } /** * The target node from this edge. * - * @return target, never {@code null}. + * @return the target */ - public final ReuseNode getTarget() { + public ReuseNode getTarget() { return target; } /** - * The respective input on this edge, never {@code null}. + * The respective input on this edge. * - * @return input, not {@code null} + * @return the input */ - public final I getInput() { + public I getInput() { return input; } /** - * The respective output on this edge. In case of quiescence the output is {@code null}. + * The respective output on this edge. * - * @return output + * @return the output */ - public final O getOutput() { + public O getOutput() { return output; } @Override - public final String toString() { + public String toString() { return source + " -> " + target + " i/o " + input + "/" + output; } } diff --git a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/AbstractTestWordEQOracle.java b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/AbstractTestWordEQOracle.java index 6dfea3ba78..f19334f27a 100644 --- a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/AbstractTestWordEQOracle.java +++ b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/AbstractTestWordEQOracle.java @@ -57,8 +57,6 @@ public AbstractTestWordEQOracle(MembershipOracle membershipOracle) { } public AbstractTestWordEQOracle(MembershipOracle membershipOracle, int batchSize) { - assert batchSize > 0; - this.membershipOracle = membershipOracle; this.batchSize = batchSize; } diff --git a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java index ccf24bcc25..928bfdd79f 100644 --- a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java +++ b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java @@ -32,7 +32,7 @@ * @param * input symbol type */ -public class RandomWellMatchedWordsEQOracle extends AbstractTestWordEQOracle, I, Boolean> { +public final class RandomWellMatchedWordsEQOracle extends AbstractTestWordEQOracle, I, Boolean> { private final Random random; 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 94c7338057..0be473d24d 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 @@ -54,11 +54,21 @@ public AbstractDynamicBatchProcessorBuilder(Supplier oracleSupplier } public AbstractDynamicBatchProcessorBuilder(Collection oracles) { + this(validateInputs(oracles), oracles); + } + + // utility constructor to prevent finalizer attacks, see SEI CERT Rule OBJ-11 + @SuppressWarnings("PMD.UnusedFormalParameter") + private AbstractDynamicBatchProcessorBuilder(boolean valid, Collection oracles) { + this.oracles = oracles; + this.oracleSupplier = null; + } + + private static boolean validateInputs(Collection oracles) { if (oracles.isEmpty()) { throw new IllegalArgumentException("No oracles specified"); } - this.oracles = oracles; - this.oracleSupplier = null; + return true; } public AbstractDynamicBatchProcessorBuilder withCustomExecutor(ExecutorService executor) { diff --git a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessor.java b/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessor.java index cbadb89272..e440f93479 100644 --- a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessor.java +++ b/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/AbstractStaticBatchProcessor.java @@ -73,15 +73,10 @@ public AbstractStaticBatchProcessor(Collection oracles, this.oracles = new ArrayStorage<>(oracles); - switch (policy) { - case FIXED: - this.executor = Executors.newFixedThreadPool(this.oracles.size() - 1); - break; - case CACHED: - this.executor = Executors.newCachedThreadPool(); - break; - default: - throw new IllegalArgumentException("Illegal pool policy: " + policy); + if (policy == PoolPolicy.FIXED) { + this.executor = Executors.newFixedThreadPool(this.oracles.size() - 1); + } else { // default is cached + this.executor = Executors.newCachedThreadPool(); } this.minBatchSize = minBatchSize; } 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 06febc3490..9eec04c533 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 @@ -43,17 +43,27 @@ public abstract class AbstractStaticBatchProcessorBuilder oracleSupplier) { + this.oracles = null; + this.oracleSupplier = oracleSupplier; + } + public AbstractStaticBatchProcessorBuilder(Collection oracles) { - if (oracles.isEmpty()) { - throw new IllegalArgumentException("No oracles specified"); - } + this(validateInputs(oracles), oracles); + } + + // utility constructor to prevent finalizer attacks, see SEI CERT Rule OBJ-11 + @SuppressWarnings("PMD.UnusedFormalParameter") + private AbstractStaticBatchProcessorBuilder(boolean valid, Collection oracles) { this.oracles = oracles; this.oracleSupplier = null; } - public AbstractStaticBatchProcessorBuilder(Supplier oracleSupplier) { - this.oracles = null; - this.oracleSupplier = oracleSupplier; + private static boolean validateInputs(Collection oracles) { + if (oracles.isEmpty()) { + throw new IllegalArgumentException("No oracles specified"); + } + return true; } public AbstractStaticBatchProcessorBuilder withMinBatchSize(@NonNegative int minBatchSize) { diff --git a/pom.xml b/pom.xml index f16c1b4149..7268222951 100644 --- a/pom.xml +++ b/pom.xml @@ -241,7 +241,7 @@ limitations under the License. 3.3.0 3.21.0 3.3.1 - 4.7.3.6 + 4.8.6.6 3.5.2 1.3.0 diff --git a/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/mealy/ExampleRandomStateLocalInputMealy.java b/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/mealy/ExampleRandomStateLocalInputMealy.java index f8d1f745ac..78e68ba916 100644 --- a/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/mealy/ExampleRandomStateLocalInputMealy.java +++ b/test-support/learning-examples/src/main/java/de/learnlib/testsupport/example/mealy/ExampleRandomStateLocalInputMealy.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Objects; import java.util.Random; @@ -46,13 +47,17 @@ public ExampleRandomStateLocalInputMealy(Random random, int size, O undefinedOutput, O... outputs) { - if (Arrays.asList(outputs).contains(undefinedOutput)) { - throw new IllegalArgumentException("The special undefined input should not be contained in regular outputs"); - } + this(random, alphabet, size, undefinedOutput, validateOutputs(undefinedOutput, outputs)); + } + private ExampleRandomStateLocalInputMealy(Random random, + Alphabet alphabet, + int size, + O undefinedOutput, + List outputs) { this.alphabet = alphabet; this.undefinedOutput = undefinedOutput; - CompactMealy source = RandomAutomata.randomMealy(random, size, alphabet, Arrays.asList(outputs)); + CompactMealy source = RandomAutomata.randomMealy(random, size, alphabet, outputs); final int alphabetSize = alphabet.size(); @@ -112,6 +117,17 @@ public O getUndefinedOutput() { return this.undefinedOutput; } + @SafeVarargs + private static List validateOutputs(O undefinedOutput, O... outputs) { + final List result = Arrays.asList(outputs); + + if (result.contains(undefinedOutput)) { + throw new IllegalArgumentException("The special undefined input should not be contained in regular outputs"); + } + + return result; + } + private static class MockedSLIMealy implements StateLocalInputMealyMachine { private final MealyMachine delegate; From 78ab22b45af3fbe9f7339c8410b3d1fe7c6b4c0d Mon Sep 17 00:00:00 2001 From: Markus Frohme Date: Sat, 4 Jan 2025 18:57:16 +0100 Subject: [PATCH 05/10] bump pmd + cleanups --- CHANGELOG.md | 1 + .../algorithm/aaar/AbstractAAARLearner.java | 8 +-- .../algorithm/adt/ads/DefensiveADS.java | 6 +- .../algorithm/adt/learner/ADTLearner.java | 4 +- .../adt/learner/ADTVisualizationTest.java | 32 +++++------ .../algorithm/kv/dfa/KearnsVaziraniDFA.java | 4 +- .../kv/mealy/KearnsVaziraniMealy.java | 4 +- .../algorithm/lstar/AbstractLStar.java | 5 +- .../algorithm/nlstar/ObservationTable.java | 2 - .../vpa/AbstractVPALearner.java | 4 +- .../observationpack/AbstractOPLearner.java | 4 +- .../observationpack/DTVisualizationTest.java | 42 +++++++------- .../algorithm/procedural/spa/SPALearner.java | 8 +-- .../ttt/base/AbstractTTTLearner.java | 5 +- .../ttt/dfa/PrefixTTTLearnerDFA.java | 4 +- .../algorithm/ttt/TTTVisualizationTest.java | 39 +++++++------ .../main/resources/learnlib-pmd-ruleset.xml | 55 ++++++++++++------- .../learnlib/acex/AcexAnalysisAlgorithms.java | 12 ++-- .../discriminationtree/BinaryDTree.java | 12 ++-- .../datastructure/pta/RedBlueMerge.java | 1 + .../de/learnlib/util/mealy/MealyUtil.java | 3 +- .../learnlib/driver/reflect/MethodInput.java | 3 +- .../aaar/AlternatingBitExampleExplicit.java | 4 +- .../aaar/AlternatingBitExampleGeneric.java | 2 +- .../cache/dfa/DFACacheConsistencyTest.java | 1 + .../filter/cache/dfa/DFACacheOracle.java | 6 +- .../dfa/DFAHashCacheConsistencyTest.java | 1 + .../learnlib/filter/cache/dfa/ProxyQuery.java | 8 +-- .../ThreadSafeDFACacheConsistencyTest.java | 1 + .../mealy/MealyCacheConsistencyTest.java | 1 + .../ThreadSafeMealyCacheConsistencyTest.java | 1 + .../moore/MooreCacheConsistencyTest.java | 1 + .../ThreadSafeMooreCacheConsistencyTest.java | 1 + .../learnlib/filter/reuse/tree/ReuseTree.java | 8 +-- .../filter/statistic/HistogramDataSet.java | 2 +- .../equivalence/RandomWordsEQOracle.java | 2 +- .../oracle/equivalence/SampleSetEQOracle.java | 6 +- .../vpa/RandomWellMatchedWordsEQOracle.java | 2 +- .../membership/AbstractSULOmegaOracle.java | 18 +++--- .../AbstractDynamicBatchProcessorBuilder.java | 20 ++++--- .../oracle/property/PropertyOracleChain.java | 6 +- pom.xml | 2 +- src/site/site.xml | 35 ++++++++---- test-support/test-support/pom.xml | 4 -- .../AbstractGrowingAlphabetTest.java | 4 +- ...ationTest.java => VisualizationUtils.java} | 43 ++++++--------- .../src/main/java/module-info.java | 1 - 47 files changed, 238 insertions(+), 200 deletions(-) rename test-support/test-support/src/main/java/de/learnlib/testsupport/{AbstractVisualizationTest.java => VisualizationUtils.java} (54%) diff --git a/CHANGELOG.md b/CHANGELOG.md index da424cc6d1..9f5274a3e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * The `OTUtils` class no longer provides the `displayHTMLInBrowser` methods in order to not depend on `java.desktop`. If you relied on this functionality, use the `writeHTMLToFile` methods instead and call `Desktop.getDesktop().open(file.toURI())` yourself. * The classes in the `learnlib-learning-examples` artifact have their package renamed to `de.learnlib.testsupport.example`. * Some other refactorings include: + * The `AbstractVisualizationTest` has been refactored into the `VisualizationUtils` factory. * The `learnlib-datastructure-ot`, `learnlib-datastructure-dt`, `learnlib-datastructure-list`, and `learnlib-datastructure-pta` artifacts have been merged into a new `learnlib-datastructures` artifact. * The `learnlib-oml` artifact (including its packages and class names) has been renamed to `learnlib-lambda`. * Various counters (especially `*Counter*SUL`s) have been streamlined. In most cases there now exists a single counter that tracks multiple properties. diff --git a/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/AbstractAAARLearner.java b/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/AbstractAAARLearner.java index 064624050e..eb10e2524a 100644 --- a/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/AbstractAAARLearner.java +++ b/algorithms/active/aaar/src/main/java/de/learnlib/algorithm/aaar/AbstractAAARLearner.java @@ -116,15 +116,15 @@ public boolean refineHypothesis(DefaultQuery query) { final D outOld = oracle.answerQuery(testOld); final D outNew = oracle.answerQuery(testNew); - if (!Objects.equals(outOld, outNew)) { // add new abstraction + if (Objects.equals(outOld, outNew)) { + prefix = prefix.append(r); + wb.append(r); + } else { // add new abstraction final AI newA = tree.splitLeaf(r, cur, prefix, suffix, outOld); abs.addSymbol(newA); rep.addSymbol(cur); learner.addAlphabetSymbol(cur); return true; - } else { - prefix = prefix.append(r); - wb.append(r); } } diff --git a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/ads/DefensiveADS.java b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/ads/DefensiveADS.java index 49de1d1c7d..c2f3f41495 100644 --- a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/ads/DefensiveADS.java +++ b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/ads/DefensiveADS.java @@ -194,11 +194,11 @@ private Optional> compute(Map mapping) { final O nextOutput = automaton.getOutput(current, i); final Map nextMapping; - if (!successors.containsKey(nextOutput)) { + if (successors.containsKey(nextOutput)) { + nextMapping = successors.get(nextOutput); + } else { nextMapping = new HashMap<>(); successors.put(nextOutput, nextMapping); - } else { - nextMapping = successors.get(nextOutput); } // invalid input diff --git a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/learner/ADTLearner.java b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/learner/ADTLearner.java index b20ea11c47..aaad1aa6d0 100644 --- a/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/learner/ADTLearner.java +++ b/algorithms/active/adt/src/main/java/de/learnlib/algorithm/adt/learner/ADTLearner.java @@ -162,7 +162,9 @@ public boolean refineHypothesis(DefaultQuery> ce) { final DefaultQuery> currentCE = this.openCounterExamples.poll(); this.allCounterExamples.add(currentCE); - while (this.refineHypothesisInternal(currentCE)) {} + while (this.refineHypothesisInternal(currentCE)) { + // refine exhaustively + } } // subtree replacements may reactivate old CEs diff --git a/algorithms/active/adt/src/test/java/de/learnlib/algorithm/adt/learner/ADTVisualizationTest.java b/algorithms/active/adt/src/test/java/de/learnlib/algorithm/adt/learner/ADTVisualizationTest.java index eac086b5a4..ae1fbbd639 100644 --- a/algorithms/active/adt/src/test/java/de/learnlib/algorithm/adt/learner/ADTVisualizationTest.java +++ b/algorithms/active/adt/src/test/java/de/learnlib/algorithm/adt/learner/ADTVisualizationTest.java @@ -16,36 +16,36 @@ package de.learnlib.algorithm.adt.learner; import java.io.IOException; +import java.io.InputStream; import java.io.StringWriter; import de.learnlib.oracle.membership.SULAdaptiveOracle; -import de.learnlib.sul.SUL; -import de.learnlib.testsupport.AbstractVisualizationTest; +import de.learnlib.testsupport.VisualizationUtils; import de.learnlib.testsupport.example.mealy.ExampleCoffeeMachine.Input; -import net.automatalib.alphabet.Alphabet; +import net.automatalib.common.util.IOUtil; import net.automatalib.serialization.dot.GraphDOT; -import org.checkerframework.checker.initialization.qual.UnderInitialization; import org.testng.Assert; import org.testng.annotations.Test; -public class ADTVisualizationTest extends AbstractVisualizationTest> { +public class ADTVisualizationTest { - @Override - protected ADTLearner getLearnerBuilder(@UnderInitialization ADTVisualizationTest this, - Alphabet alphabet, - SUL sul) { - return new ADTLearnerBuilder().withAlphabet(alphabet) - .withOracle(new SULAdaptiveOracle<>(sul)) - .create(); + private final ADTLearner learner; + + public ADTVisualizationTest() { + this.learner = + VisualizationUtils.runExperiment((alphabet, sul) -> new ADTLearnerBuilder().withAlphabet( + alphabet).withOracle(new SULAdaptiveOracle<>(sul)).create()); } @Test public void testVisualization() throws IOException { - final String expectedADT = resourceAsString("/adt.dot"); + try (InputStream is = ADTVisualizationTest.class.getResourceAsStream("/adt.dot")) { + final String expectedADT = IOUtil.toString(IOUtil.asBufferedUTF8Reader(is)); + final StringWriter actualADT = new StringWriter(); - final StringWriter actualADT = new StringWriter(); - GraphDOT.write(super.learner.getADT().getRoot(), actualADT); + GraphDOT.write(this.learner.getADT().getRoot(), actualADT); - Assert.assertEquals(actualADT.toString(), expectedADT); + Assert.assertEquals(actualADT.toString(), expectedADT); + } } } 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 ae852f5bcf..732785b24e 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 @@ -106,7 +106,9 @@ public boolean refineHypothesis(DefaultQuery ceQuery) { return false; } if (repeatedCounterexampleEvaluation) { - while (refineHypothesisSingle(input, output)) {} + while (refineHypothesisSingle(input, output)) { + // refine exhaustively + } } return true; } 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 ffd3101daf..b62a61580d 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 @@ -97,7 +97,9 @@ public boolean refineHypothesis(DefaultQuery> ceQuery) { return false; } if (repeatedCounterexampleEvaluation) { - while (refineHypothesisSingle(input, output)) {} + while (refineHypothesisSingle(input, output)) { + // refine exhaustively + } } return true; } diff --git a/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractLStar.java b/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractLStar.java index 666faa4b6b..51d4d101f1 100644 --- a/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractLStar.java +++ b/algorithms/active/lstar/src/main/java/de/learnlib/algorithm/lstar/AbstractLStar.java @@ -216,10 +216,7 @@ public Collection> getGlobalSuffixes() { @Override public boolean addGlobalSuffixes(Collection> newGlobalSuffixes) { List>> unclosed = table.addSuffixes(newGlobalSuffixes, oracle); - if (unclosed.isEmpty()) { - return false; - } - return completeConsistentTable(unclosed, false); + return !unclosed.isEmpty() || completeConsistentTable(unclosed, false); } @Override diff --git a/algorithms/active/nlstar/src/main/java/de/learnlib/algorithm/nlstar/ObservationTable.java b/algorithms/active/nlstar/src/main/java/de/learnlib/algorithm/nlstar/ObservationTable.java index 2835ad03ee..3183ff0ea9 100644 --- a/algorithms/active/nlstar/src/main/java/de/learnlib/algorithm/nlstar/ObservationTable.java +++ b/algorithms/active/nlstar/src/main/java/de/learnlib/algorithm/nlstar/ObservationTable.java @@ -129,8 +129,6 @@ public List>> makeUpper(List> rows) { public List>> addSuffixes(List> suffixesToAdd) { List> newSuffixes = new ArrayList<>(); - // we change the suffix list afterward - @SuppressWarnings("PMD.PrematureDeclaration") int oldNumSuffixes = suffixes.size(); for (Word suffix : suffixesToAdd) { diff --git a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/AbstractVPALearner.java b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/AbstractVPALearner.java index f2f2945f2a..8becff996e 100644 --- a/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/AbstractVPALearner.java +++ b/algorithms/active/observation-pack-vpa/src/main/java/de/learnlib/algorithm/observationpack/vpa/AbstractVPALearner.java @@ -77,7 +77,9 @@ public boolean refineHypothesis(DefaultQuery ceQuery) { return false; } - while (refineHypothesisSingle(ceQuery)) {} + while (refineHypothesisSingle(ceQuery)) { + // refine exhaustively + } return true; } diff --git a/algorithms/active/observation-pack/src/main/java/de/learnlib/algorithm/observationpack/AbstractOPLearner.java b/algorithms/active/observation-pack/src/main/java/de/learnlib/algorithm/observationpack/AbstractOPLearner.java index f1a57c682d..e8dc1ebe8e 100644 --- a/algorithms/active/observation-pack/src/main/java/de/learnlib/algorithm/observationpack/AbstractOPLearner.java +++ b/algorithms/active/observation-pack/src/main/java/de/learnlib/algorithm/observationpack/AbstractOPLearner.java @@ -85,7 +85,9 @@ public boolean refineHypothesis(DefaultQuery ceQuery) { return false; } if (repeatedCounterexampleEvaluation) { - while (refineHypothesisSingle(ceQuery)) {} + while (refineHypothesisSingle(ceQuery)) { + // refine exhaustively + } } return true; } diff --git a/algorithms/active/observation-pack/src/test/java/de/learnlib/algorithm/observationpack/DTVisualizationTest.java b/algorithms/active/observation-pack/src/test/java/de/learnlib/algorithm/observationpack/DTVisualizationTest.java index 9273eedf37..c95a0103d8 100644 --- a/algorithms/active/observation-pack/src/test/java/de/learnlib/algorithm/observationpack/DTVisualizationTest.java +++ b/algorithms/active/observation-pack/src/test/java/de/learnlib/algorithm/observationpack/DTVisualizationTest.java @@ -16,48 +16,50 @@ package de.learnlib.algorithm.observationpack; import java.io.IOException; +import java.io.InputStream; import java.io.StringWriter; import de.learnlib.algorithm.observationpack.mealy.OPLearnerMealy; import de.learnlib.algorithm.observationpack.mealy.OPLearnerMealyBuilder; import de.learnlib.oracle.membership.SULOracle; -import de.learnlib.sul.SUL; -import de.learnlib.testsupport.AbstractVisualizationTest; +import de.learnlib.testsupport.VisualizationUtils; import de.learnlib.testsupport.example.mealy.ExampleCoffeeMachine.Input; -import net.automatalib.alphabet.Alphabet; +import net.automatalib.common.util.IOUtil; import net.automatalib.serialization.dot.GraphDOT; -import org.checkerframework.checker.initialization.qual.UnderInitialization; import org.testng.Assert; import org.testng.annotations.Test; -public class DTVisualizationTest extends AbstractVisualizationTest> { +public class DTVisualizationTest { - @Override - protected OPLearnerMealy getLearnerBuilder(@UnderInitialization DTVisualizationTest this, - Alphabet alphabet, - SUL sul) { - return new OPLearnerMealyBuilder().withAlphabet(alphabet) - .withOracle(new SULOracle<>(sul)) - .create(); + private final OPLearnerMealy learner; + + public DTVisualizationTest() { + this.learner = + VisualizationUtils.runExperiment((alphabet, sul) -> new OPLearnerMealyBuilder().withAlphabet( + alphabet).withOracle(new SULOracle<>(sul)).create()); } @Test public void testVisualizeHyp() throws IOException { - final String expectedHyp = resourceAsString("/hyp.dot"); + try (InputStream is = DTVisualizationTest.class.getResourceAsStream("/hyp.dot")) { + final String expectedHyp = IOUtil.toString(IOUtil.asBufferedUTF8Reader(is)); - final StringWriter actualHyp = new StringWriter(); - GraphDOT.write(super.learner.getHypothesisDS(), actualHyp); + final StringWriter actualHyp = new StringWriter(); + GraphDOT.write(this.learner.getHypothesisDS(), actualHyp); - Assert.assertEquals(actualHyp.toString(), expectedHyp); + Assert.assertEquals(actualHyp.toString(), expectedHyp); + } } @Test public void testVisualizeDT() throws IOException { - final String expectedDT = resourceAsString("/dt.dot"); + try (InputStream is = DTVisualizationTest.class.getResourceAsStream("/dt.dot")) { + final String expectedDT = IOUtil.toString(IOUtil.asBufferedUTF8Reader(is)); - final StringWriter actualDT = new StringWriter(); - GraphDOT.write(super.learner.getDiscriminationTree(), actualDT); + final StringWriter actualDT = new StringWriter(); + GraphDOT.write(this.learner.getDiscriminationTree(), actualDT); - Assert.assertEquals(actualDT.toString(), expectedDT); + Assert.assertEquals(actualDT.toString(), expectedDT); + } } } diff --git a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java index b4612bcdc7..cb21409f2b 100644 --- a/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java +++ b/algorithms/active/procedural/src/main/java/de/learnlib/algorithm/procedural/spa/SPALearner.java @@ -206,11 +206,11 @@ private boolean extractUsefulInformationFromCounterExample(DefaultQuery input, Map> return refinement; } - private class Acex extends AbstractBaseCounterexample { + private final class Acex extends AbstractBaseCounterexample { private final Word input; private final Predicate> oracle; diff --git a/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/base/AbstractTTTLearner.java b/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/base/AbstractTTTLearner.java index c76b57d402..dc96beb474 100644 --- a/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/base/AbstractTTTLearner.java +++ b/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/base/AbstractTTTLearner.java @@ -59,7 +59,6 @@ * @param * output domain type */ -@SuppressWarnings("PMD.ExcessiveClassLength") public abstract class AbstractTTTLearner implements LearningAlgorithm, SupportsGrowingAlphabet, Resumable> { @@ -175,7 +174,9 @@ public boolean refineHypothesis(DefaultQuery ceQuery) { return false; } - while (refineHypothesisSingle(ceQuery)) {} + while (refineHypothesisSingle(ceQuery)) { + // refine exhaustively + } return true; } diff --git a/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/dfa/PrefixTTTLearnerDFA.java b/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/dfa/PrefixTTTLearnerDFA.java index 72bc9a4678..4d89a5dc05 100644 --- a/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/dfa/PrefixTTTLearnerDFA.java +++ b/algorithms/active/ttt/src/main/java/de/learnlib/algorithm/ttt/dfa/PrefixTTTLearnerDFA.java @@ -43,7 +43,9 @@ public boolean refineHypothesis(DefaultQuery ceQuery) { return false; } - while (refineHypothesisSingle(ceQuery)) {} + while (refineHypothesisSingle(ceQuery)) { + // refine exhaustively + } return true; } diff --git a/algorithms/active/ttt/src/test/java/de/learnlib/algorithm/ttt/TTTVisualizationTest.java b/algorithms/active/ttt/src/test/java/de/learnlib/algorithm/ttt/TTTVisualizationTest.java index e14b0e7a37..e2d78095a1 100644 --- a/algorithms/active/ttt/src/test/java/de/learnlib/algorithm/ttt/TTTVisualizationTest.java +++ b/algorithms/active/ttt/src/test/java/de/learnlib/algorithm/ttt/TTTVisualizationTest.java @@ -16,45 +16,50 @@ package de.learnlib.algorithm.ttt; import java.io.IOException; +import java.io.InputStream; import java.io.StringWriter; import de.learnlib.algorithm.ttt.mealy.TTTLearnerMealy; import de.learnlib.algorithm.ttt.mealy.TTTLearnerMealyBuilder; import de.learnlib.oracle.membership.SULOracle; -import de.learnlib.sul.SUL; -import de.learnlib.testsupport.AbstractVisualizationTest; +import de.learnlib.testsupport.VisualizationUtils; import de.learnlib.testsupport.example.mealy.ExampleCoffeeMachine.Input; -import net.automatalib.alphabet.Alphabet; +import net.automatalib.common.util.IOUtil; import net.automatalib.serialization.dot.GraphDOT; import org.testng.Assert; import org.testng.annotations.Test; -public class TTTVisualizationTest extends AbstractVisualizationTest> { +public class TTTVisualizationTest { - @Override - protected TTTLearnerMealy getLearnerBuilder(Alphabet alphabet, SUL sul) { - return new TTTLearnerMealyBuilder().withAlphabet(alphabet) - .withOracle(new SULOracle<>(sul)) - .create(); + private final TTTLearnerMealy learner; + + public TTTVisualizationTest() { + this.learner = + VisualizationUtils.runExperiment((alphabet, sul) -> new TTTLearnerMealyBuilder().withAlphabet( + alphabet).withOracle(new SULOracle<>(sul)).create()); } @Test public void testVisualizeHyp() throws IOException { - final String expectedHyp = resourceAsString("/hyp.dot"); + try (InputStream is = TTTVisualizationTest.class.getResourceAsStream("/hyp.dot")) { + final String expectedHyp = IOUtil.toString(IOUtil.asBufferedUTF8Reader(is)); - final StringWriter actualHyp = new StringWriter(); - GraphDOT.write(super.learner.getHypothesisDS(), actualHyp); + final StringWriter actualHyp = new StringWriter(); + GraphDOT.write(this.learner.getHypothesisDS(), actualHyp); - Assert.assertEquals(actualHyp.toString(), expectedHyp); + Assert.assertEquals(actualHyp.toString(), expectedHyp); + } } @Test public void testVisualizeDT() throws IOException { - final String expectedDT = resourceAsString("/dt.dot"); + try (InputStream is = TTTVisualizationTest.class.getResourceAsStream("/dt.dot")) { + final String expectedDT = IOUtil.toString(IOUtil.asBufferedUTF8Reader(is)); - final StringWriter actualDT = new StringWriter(); - GraphDOT.write(super.learner.getDiscriminationTree(), actualDT); + final StringWriter actualDT = new StringWriter(); + GraphDOT.write(this.learner.getDiscriminationTree(), actualDT); - Assert.assertEquals(actualDT.toString(), expectedDT); + Assert.assertEquals(actualDT.toString(), expectedDT); + } } } diff --git a/build-config/src/main/resources/learnlib-pmd-ruleset.xml b/build-config/src/main/resources/learnlib-pmd-ruleset.xml index f155b6abee..2b94dd1781 100644 --- a/build-config/src/main/resources/learnlib-pmd-ruleset.xml +++ b/build-config/src/main/resources/learnlib-pmd-ruleset.xml @@ -15,30 +15,27 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - LearnLib PMD ruleset + + - + + - - - - - - - - - + + + @@ -46,8 +43,6 @@ limitations under the License. - - @@ -60,14 +55,16 @@ limitations under the License. + + + - @@ -86,14 +83,10 @@ limitations under the License. - - - + - - @@ -107,4 +100,26 @@ limitations under the License. - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalysisAlgorithms.java b/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalysisAlgorithms.java index 6ac6055f55..3781a1449f 100644 --- a/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalysisAlgorithms.java +++ b/commons/counterexamples/src/main/java/de/learnlib/acex/AcexAnalysisAlgorithms.java @@ -141,11 +141,11 @@ public static int binarySearchRight(AbstractCounterexample acex, int low, while (highIter - lowIter > 1) { int mid = lowIter + (highIter - lowIter) / 2; E effMid = acex.effect(mid); - if (!acex.checkEffects(effMid, effHigh)) { - lowIter = mid; - } else { + if (acex.checkEffects(effMid, effHigh)) { highIter = mid; effHigh = effMid; + } else { + lowIter = mid; } } @@ -186,11 +186,11 @@ public static int binarySearchLeft(AbstractCounterexample acex, int low, while (highIter - lowIter > 1) { int mid = lowIter + (highIter - lowIter) / 2; E effMid = acex.effect(mid); - if (!acex.checkEffects(effLow, effMid)) { - highIter = mid; - } else { + if (acex.checkEffects(effLow, effMid)) { lowIter = mid; effLow = effMid; + } else { + highIter = mid; } } diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTree.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTree.java index dea6b21325..d9f49a94f5 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTree.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTree.java @@ -34,14 +34,14 @@ public BinaryDTree(MembershipOracle oracle) { } public BinaryDTree(MembershipOracle oracle, boolean epsilonRoot) { - this(null, oracle); - if (epsilonRoot) { - getRoot().split(Word.epsilon(), false, true); - } + this(new BinaryDTNode<>(null), oracle, epsilonRoot); } - public BinaryDTree(D rootData, MembershipOracle oracle) { - super(new BinaryDTNode<>(rootData), oracle); + public BinaryDTree(BinaryDTNode root, MembershipOracle oracle, boolean epsilonRoot) { + super(root, oracle); + if (epsilonRoot) { + root.split(Word.epsilon(), false, true); + } } } diff --git a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java index e643ad2956..5c8ad36300 100644 --- a/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java +++ b/commons/datastructures/src/main/java/de/learnlib/datastructure/pta/RedBlueMerge.java @@ -326,6 +326,7 @@ private boolean mergeRedStateProperty(S qr, S qb) { * can be merged, a new {@link ArrayStorage} containing the result of the merge is returned.
  • otherwise * (i.e., if no merge is possible), {@code null} is returned. */ + @SuppressWarnings("PMD.ReturnEmptyCollectionRatherThanNull") // null is semantically different from an empty list private @Nullable ArrayStorage mergeTransProperties(ArrayStorage tps1, ArrayStorage tps2) { int len = tps1.size(); int i; diff --git a/commons/util/src/main/java/de/learnlib/util/mealy/MealyUtil.java b/commons/util/src/main/java/de/learnlib/util/mealy/MealyUtil.java index 30e8247f2d..291b7e6f7f 100644 --- a/commons/util/src/main/java/de/learnlib/util/mealy/MealyUtil.java +++ b/commons/util/src/main/java/de/learnlib/util/mealy/MealyUtil.java @@ -120,8 +120,7 @@ private static int doFindMismatch(MealyMachine hypothes } public static MembershipOracle wrapWordOracle(MembershipOracle> oracle) { - // explicit type specification is required by checker-framework - return new SymbolOracleWrapper(oracle); + return new SymbolOracleWrapper<>(oracle); } } 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 df3510d7bf..e232c06a72 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 @@ -20,7 +20,6 @@ import de.learnlib.exception.SULException; import de.learnlib.sul.ContextExecutableInput; -import org.checkerframework.checker.nullness.qual.Nullable; /** * An input symbol that represents a call to a method with a specific set of parameters. @@ -45,7 +44,7 @@ public MethodOutput execute(Object context) { if (Void.TYPE.equals(this.method.getReturnType())) { return VoidOutput.INSTANCE; } else { - return new ReturnValue<@Nullable Object>(ret); + return new ReturnValue<>(ret); } } catch (IllegalAccessException | IllegalArgumentException e) { throw new SULException(e); 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 b780fd0682..69295d71e9 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java +++ b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleExplicit.java @@ -112,7 +112,7 @@ private static void printInfo(ExplicitAAARLearnerMealy { + static final class InitialAbstraction implements ExplicitInitialAbstraction { @Override public String getAbstractSymbol(Event c) { @@ -143,7 +143,7 @@ public Collection getInitialAbstracts() { } } - private static final class Incrementor implements Function { + static final class Incrementor implements Function { private int cnt; diff --git a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java index 7d2d557c75..4c0dc145d9 100644 --- a/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java +++ b/examples/src/main/java/de/learnlib/example/aaar/AlternatingBitExampleGeneric.java @@ -99,7 +99,7 @@ private static void printInfo(GenericAAARLearnerMealy { + static final class EventAbstractor implements Function { private int cnt; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheConsistencyTest.java b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheConsistencyTest.java index 29115cdddc..5703302466 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheConsistencyTest.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheConsistencyTest.java @@ -32,6 +32,7 @@ * @param * input symbol class */ +@SuppressWarnings("PMD.TestClassWithoutTestCases") // not a traditional test class final class DFACacheConsistencyTest implements DFAEquivalenceOracle { private final IncrementalDFABuilder incDfa; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheOracle.java b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheOracle.java index 357edae100..621812da4d 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheOracle.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFACacheOracle.java @@ -118,14 +118,14 @@ Pair>, Collection>> queryCache(Collec for (Query q : queries) { final Word input = q.getInput(); final Acceptance acc = incDfa.lookup(input); - if (acc != Acceptance.DONT_KNOW) { - q.answer(acc.toBoolean()); - } else { + if (acc == Acceptance.DONT_KNOW) { if (cache.add(input)) { // never seen before unanswered.add(new ProxyQuery<>(q)); } else { duplicates.add(q); } + } else { + q.answer(acc.toBoolean()); } } diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFAHashCacheConsistencyTest.java b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFAHashCacheConsistencyTest.java index d9c578cc73..1696ee11b2 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFAHashCacheConsistencyTest.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/DFAHashCacheConsistencyTest.java @@ -24,6 +24,7 @@ import net.automatalib.word.Word; import org.checkerframework.checker.nullness.qual.Nullable; +@SuppressWarnings("PMD.TestClassWithoutTestCases") // not a traditional test class final class DFAHashCacheConsistencyTest implements DFAEquivalenceOracle { private final Map, Boolean> cache; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ProxyQuery.java b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ProxyQuery.java index 2f05696e2f..7fc8b9a618 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ProxyQuery.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ProxyQuery.java @@ -60,12 +60,8 @@ public String toString() { return origQuery.toString(); } - /** - * Retrieves the answer that this oracle received. - * - * @return the answer that was received - */ - public Boolean getAnswer() { + @SuppressWarnings("PMD.BooleanGetMethodName") // answer doesn't really describe the state of the object + Boolean getAnswer() { return answer; } diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ThreadSafeDFACacheConsistencyTest.java b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ThreadSafeDFACacheConsistencyTest.java index f27be90062..06a0d1ec50 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ThreadSafeDFACacheConsistencyTest.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/dfa/ThreadSafeDFACacheConsistencyTest.java @@ -29,6 +29,7 @@ * @param * input symbol type */ +@SuppressWarnings("PMD.TestClassWithoutTestCases") // not a traditional test class final class ThreadSafeDFACacheConsistencyTest implements DFAEquivalenceOracle { private final DFAEquivalenceOracle delegate; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MealyCacheConsistencyTest.java b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MealyCacheConsistencyTest.java index fa3f803e8f..b0d1772b6a 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MealyCacheConsistencyTest.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/MealyCacheConsistencyTest.java @@ -33,6 +33,7 @@ * @param * output symbol class */ +@SuppressWarnings("PMD.TestClassWithoutTestCases") // not a traditional test class public class MealyCacheConsistencyTest implements MealyEquivalenceOracle { private final IncrementalMealyBuilder incMealy; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/ThreadSafeMealyCacheConsistencyTest.java b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/ThreadSafeMealyCacheConsistencyTest.java index 389d972357..df0b4bf5c8 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/ThreadSafeMealyCacheConsistencyTest.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/mealy/ThreadSafeMealyCacheConsistencyTest.java @@ -32,6 +32,7 @@ * @param * output symbol type */ +@SuppressWarnings("PMD.TestClassWithoutTestCases") // not a traditional test class public final class ThreadSafeMealyCacheConsistencyTest implements MealyEquivalenceOracle { private final MealyEquivalenceOracle delegate; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MooreCacheConsistencyTest.java b/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MooreCacheConsistencyTest.java index 2962b99f53..57cd7f3407 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MooreCacheConsistencyTest.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/moore/MooreCacheConsistencyTest.java @@ -34,6 +34,7 @@ * @param * output symbol class */ +@SuppressWarnings("PMD.TestClassWithoutTestCases") // not a traditional test class public class MooreCacheConsistencyTest implements MooreEquivalenceOracle { private final IncrementalMooreBuilder incMoore; diff --git a/filters/cache/src/main/java/de/learnlib/filter/cache/moore/ThreadSafeMooreCacheConsistencyTest.java b/filters/cache/src/main/java/de/learnlib/filter/cache/moore/ThreadSafeMooreCacheConsistencyTest.java index 5b1b1ffba7..29944a8bf8 100644 --- a/filters/cache/src/main/java/de/learnlib/filter/cache/moore/ThreadSafeMooreCacheConsistencyTest.java +++ b/filters/cache/src/main/java/de/learnlib/filter/cache/moore/ThreadSafeMooreCacheConsistencyTest.java @@ -32,6 +32,7 @@ * @param * output symbol type */ +@SuppressWarnings("PMD.TestClassWithoutTestCases") // not a traditional test class public final class ThreadSafeMooreCacheConsistencyTest implements MooreEquivalenceOracle { private final MooreEquivalenceOracle delegate; diff --git a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseTree.java b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseTree.java index afd760ccd7..908289e937 100644 --- a/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseTree.java +++ b/filters/reuse/src/main/java/de/learnlib/filter/reuse/tree/ReuseTree.java @@ -215,11 +215,9 @@ private void disposeSystemStates(ReuseNode node) { node.clearSystemStates(); for (ReuseEdge edge : node.getEdges()) { - if (edge != null) { - if (!edge.getTarget().equals(node)) { - // only for non-reflexive edges, there are no circles in a tree - disposeSystemStates(edge.getTarget()); - } + if (edge != null && !edge.getTarget().equals(node)) { + // only for non-reflexive edges, there are no circles in a tree + disposeSystemStates(edge.getTarget()); } } } diff --git a/filters/statistics/src/main/java/de/learnlib/filter/statistic/HistogramDataSet.java b/filters/statistics/src/main/java/de/learnlib/filter/statistic/HistogramDataSet.java index 15c36ce879..e2bbecced7 100644 --- a/filters/statistics/src/main/java/de/learnlib/filter/statistic/HistogramDataSet.java +++ b/filters/statistics/src/main/java/de/learnlib/filter/statistic/HistogramDataSet.java @@ -45,7 +45,7 @@ public void addDataPoint(Long value) { histogram.put(value, i + 1); sum += value; size++; - mean = mean + ((((double) value) - mean) / size); + mean = mean + ((value - mean) / size); } public SortedMap getHistogram() { diff --git a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWordsEQOracle.java b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWordsEQOracle.java index dfab5cfeac..31711f0537 100644 --- a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWordsEQOracle.java +++ b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/RandomWordsEQOracle.java @@ -112,7 +112,7 @@ protected Stream> generateTestWords(A hypothesis, Collection generateTestWord(List symbolList, int numSyms) { - final int length = minLength + random.nextInt((maxLength - minLength) + 1); + final int length = minLength + random.nextInt(maxLength - minLength + 1); final WordBuilder result = new WordBuilder<>(length); for (int j = 0; j < length; ++j) { diff --git a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/SampleSetEQOracle.java b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/SampleSetEQOracle.java index ff2438e603..245f3176bb 100644 --- a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/SampleSetEQOracle.java +++ b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/SampleSetEQOracle.java @@ -63,10 +63,10 @@ public class SampleSetEQOracle implements EquivalenceOracle(); - } else { + if (removeUnsuccessful) { testQueries = new LinkedList<>(); // for O(1) removal of elements + } else { + testQueries = new ArrayList<>(); } } diff --git a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java index 928bfdd79f..5f3765b678 100644 --- a/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java +++ b/oracles/equivalence-oracles/src/main/java/de/learnlib/oracle/equivalence/vpa/RandomWellMatchedWordsEQOracle.java @@ -80,7 +80,7 @@ protected Stream> generateTestWords(Output hypothesis, Colle @SuppressWarnings("unchecked") final VPAlphabet alphabet = (VPAlphabet) inputs; - final int lengthRange = (maxLength - minLength) + 1; + final int lengthRange = maxLength - minLength + 1; return Stream.generate(() -> generateWellMatched(alphabet, minLength + random.nextInt(lengthRange))) .limit(maxTests); } diff --git a/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/AbstractSULOmegaOracle.java b/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/AbstractSULOmegaOracle.java index 913ab05c73..91810ba4a7 100644 --- a/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/AbstractSULOmegaOracle.java +++ b/oracles/membership-oracles/src/main/java/de/learnlib/oracle/membership/AbstractSULOmegaOracle.java @@ -140,16 +140,16 @@ public MealyMembershipOracle getMembershipOracle() { boolean deepCopies) { final AbstractSULOmegaOracle abstractSulOmegaOracle; if (deepCopies) { - if (!sul.deepCopies()) { - throw new IllegalArgumentException("SUL can not make deep copies of states."); - } else { + if (sul.deepCopies()) { abstractSulOmegaOracle = new DeepCopySULOmegaOracle<>(sul); + } else { + throw new IllegalArgumentException("SUL can not make deep copies of states."); } } else { - if (!sul.canFork()) { - throw new IllegalArgumentException("SUL must be forkable."); - } else { + if (sul.canFork()) { abstractSulOmegaOracle = new ShallowCopySULOmegaOracle<>(sul); + } else { + throw new IllegalArgumentException("SUL must be forkable."); } } @@ -239,9 +239,7 @@ protected Integer getQueryState(ObservableSUL sul) { */ @Override public boolean isSameState(Word input1, Integer s1, Word input2, Integer s2) { - if (!s1.equals(s2)) { - return false; - } else { + if (s1.equals(s2)) { // in this case the hash codes are equal, now we must check if we accidentally had a hash-collision. final ObservableSUL sul1 = getSul(); final ObservableSUL sul2 = forkedSUL; @@ -264,6 +262,8 @@ public boolean isSameState(Word input1, Integer s1, Word input2, Integer s } finally { sul2.post(); } + } else { + return false; } } } 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 0be473d24d..43e4168cea 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 @@ -19,6 +19,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; import de.learnlib.oracle.BatchProcessor; @@ -91,7 +93,6 @@ public AbstractDynamicBatchProcessorBuilder withPoolPolicy(PoolPolicy return this; } - @SuppressWarnings("PMD.CloseResource") // false positive on JDK21 builds public OR create() { final Supplier supplier; @@ -125,23 +126,28 @@ public OR create() { static class StaticOracleProvider

    > implements Supplier

    { private final P[] oracles; + private final Lock lock; private int idx; - StaticOracleProvider(P[] oracles) { - this.oracles = oracles; - } - @SuppressWarnings("unchecked") StaticOracleProvider(Collection oracles) { - this.oracles = oracles.toArray((P[]) new BatchProcessor[oracles.size()]); + this(oracles.toArray((P[]) new BatchProcessor[oracles.size()])); + } + + StaticOracleProvider(P[] oracles) { + this.oracles = oracles; + this.lock = new ReentrantLock(); } @Override public P get() { - synchronized (this) { + try { + lock.lock(); if (idx < oracles.length) { return oracles[idx++]; } + } finally { + lock.unlock(); } throw new IllegalStateException( diff --git a/oracles/property-oracles/src/main/java/de/learnlib/oracle/property/PropertyOracleChain.java b/oracles/property-oracles/src/main/java/de/learnlib/oracle/property/PropertyOracleChain.java index f67edf3954..e682d65765 100644 --- a/oracles/property-oracles/src/main/java/de/learnlib/oracle/property/PropertyOracleChain.java +++ b/oracles/property-oracles/src/main/java/de/learnlib/oracle/property/PropertyOracleChain.java @@ -90,10 +90,10 @@ public PropertyOracleChain(PropertyOracle... oracles) { public PropertyOracleChain(Collection> oracles) { this.oracles = new ArrayList<>(oracles); - if (!this.oracles.isEmpty()) { - property = this.oracles.get(0).getProperty(); - } else { + if (this.oracles.isEmpty()) { property = null; + } else { + property = this.oracles.get(0).getProperty(); } } diff --git a/pom.xml b/pom.xml index 7268222951..f7161b85f7 100644 --- a/pom.xml +++ b/pom.xml @@ -235,7 +235,7 @@ limitations under the License. 3.4.2 3.11.2 1.0.0 - 3.14.0 + 3.26.0 3.1.0 3.3.1 3.3.0 diff --git a/src/site/site.xml b/src/site/site.xml index 33c45d22a4..8d211d8fea 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -1,18 +1,33 @@ - + + + + org.apache.maven.skins maven-fluido-skin - 1.12.0 + 2.0.1 - - ${this.name} - ${this.url} - + @@ -26,4 +41,4 @@