+ * output domain type
+ *
+ * @author frohme
+ */
+public interface ParallelOmegaOracle extends ThreadPool, OmegaMembershipOracle {}
diff --git a/api/src/main/java/de/learnlib/api/oracle/parallelism/ParallelOracle.java b/api/src/main/java/de/learnlib/api/oracle/parallelism/ParallelOracle.java
new file mode 100644
index 0000000000..98fc74874f
--- /dev/null
+++ b/api/src/main/java/de/learnlib/api/oracle/parallelism/ParallelOracle.java
@@ -0,0 +1,34 @@
+/* Copyright (C) 2013-2020 TU Dortmund
+ * This file is part of LearnLib, http://www.learnlib.de/.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.
+ */
+package de.learnlib.api.oracle.parallelism;
+
+import de.learnlib.api.oracle.MembershipOracle;
+
+/**
+ * Basic interface for {@link MembershipOracle}s that can process queries in parallel.
+ *
+ * Parallel oracles usually use one or more dedicated worker threads in which the processing of queries is performed.
+ * Since these do not have a defined life span, they must be terminated explicitly using {@link #shutdown()} or {@link
+ * #shutdownNow()}.
+ *
+ * @param
+ * input symbol type
+ * @param
+ * output domain type
+ *
+ * @author Malte Isberner
+ */
+public interface ParallelOracle extends ThreadPool, MembershipOracle {}
diff --git a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/ParallelOracle.java b/api/src/main/java/de/learnlib/api/oracle/parallelism/ThreadPool.java
similarity index 74%
rename from oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/ParallelOracle.java
rename to api/src/main/java/de/learnlib/api/oracle/parallelism/ThreadPool.java
index f91481654b..7357b942a0 100644
--- a/oracles/parallelism/src/main/java/de/learnlib/oracle/parallelism/ParallelOracle.java
+++ b/api/src/main/java/de/learnlib/api/oracle/parallelism/ThreadPool.java
@@ -13,28 +13,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package de.learnlib.oracle.parallelism;
+package de.learnlib.api.oracle.parallelism;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import de.learnlib.api.oracle.MembershipOracle;
-
/**
- * Basic interface for {@link MembershipOracle}s that can process queries in parallel.
- *
- * Parallel oracles usually use one or more dedicated worker threads in which the processing of queries is performed.
- * Since these do not have a defined life span, they must be terminated explicitly using {@link #shutdown()} or {@link
- * #shutdownNow()}.
- *
- * @param
- * input symbol type
- * @param
- * output domain type
+ * A markup interface for a component that manages a pool of threads that may want to be shut down after usage.
*
* @author Malte Isberner
+ * @author frohme
+ * @see ExecutorService
*/
-public interface ParallelOracle extends MembershipOracle {
+public interface ThreadPool {
/**
* Shuts down all worker threads, but waits for any queued queries to be processed.
@@ -58,7 +49,7 @@ public interface ParallelOracle extends MembershipOracle {
enum PoolPolicy {
/**
* Maintain a fixed thread pool. The threads will be started immediately, and will terminate only if {@link
- * ParallelOracle#shutdown()} or {@link ParallelOracle#shutdownNow()} are called.
+ * ThreadPool#shutdown()} or {@link ThreadPool#shutdownNow()} are called.
*
* @see Executors#newFixedThreadPool(int)
*/
diff --git a/api/src/main/java/de/learnlib/api/query/OmegaQuery.java b/api/src/main/java/de/learnlib/api/query/OmegaQuery.java
index 566777c621..ffe46bb228 100644
--- a/api/src/main/java/de/learnlib/api/query/OmegaQuery.java
+++ b/api/src/main/java/de/learnlib/api/query/OmegaQuery.java
@@ -49,7 +49,7 @@ public class OmegaQuery {
private final Word loop;
private final int repeat;
- private D output;
+ private @Nullable D output;
private int periodicity;
public OmegaQuery(Word prefix, Word loop, int repeat) {
@@ -58,7 +58,7 @@ public OmegaQuery(Word prefix, Word loop, int repeat) {
this.repeat = repeat;
}
- public void answer(D output, int periodicity) {
+ public void answer(@Nullable D output, int periodicity) {
this.output = output;
this.periodicity = periodicity;
}
@@ -75,7 +75,7 @@ public int getRepeat() {
return repeat;
}
- public D getOutput() {
+ public @Nullable D getOutput() {
return output;
}
@@ -87,7 +87,7 @@ public boolean isUltimatelyPeriodic() {
return periodicity > 0;
}
- public DefaultQuery asDefaultQuery() {
+ public DefaultQuery asDefaultQuery() {
final WordBuilder wb = new WordBuilder<>(prefix.length() + loop.length() * periodicity);
wb.append(prefix);
wb.repeatAppend(periodicity, loop);
diff --git a/api/src/main/java/de/learnlib/api/query/Query.java b/api/src/main/java/de/learnlib/api/query/Query.java
index 6292e51d29..7590b2b0ec 100644
--- a/api/src/main/java/de/learnlib/api/query/Query.java
+++ b/api/src/main/java/de/learnlib/api/query/Query.java
@@ -75,7 +75,8 @@ public abstract class Query {
* throwing an exception.
*
* @param output
- * the output, i.e., the response to the query
+ * the output, i.e., the directly observable response to the query's suffix (cf. {@link Query main
+ * documentation})
*/
public abstract void answer(D output);
diff --git a/archetypes/basic/pom.xml b/archetypes/basic/pom.xml
index caeedce7a1..9bb9e77c64 100644
--- a/archetypes/basic/pom.xml
+++ b/archetypes/basic/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib.archetypes
learnlib-archetypes-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/archetypes/complete/pom.xml b/archetypes/complete/pom.xml
index 2564ff8dd1..545c25dc25 100644
--- a/archetypes/complete/pom.xml
+++ b/archetypes/complete/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib.archetypes
learnlib-archetypes-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/archetypes/pom.xml b/archetypes/pom.xml
index 3425565441..839f018e3e 100644
--- a/archetypes/pom.xml
+++ b/archetypes/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-build-parent
- 0.15.0
+ 0.16.0
../build-parent/pom.xml
diff --git a/build-parent/pom.xml b/build-parent/pom.xml
index 66b560264e..2f6d6dadbb 100644
--- a/build-parent/pom.xml
+++ b/build-parent/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-parent
- 0.15.0
+ 0.16.0
../pom.xml
@@ -148,37 +148,6 @@ limitations under the License.
-
-
- org.apache.maven.plugins
- maven-dependency-plugin
-
-
- unpack-pmd
- verify
-
- unpack
-
-
- de.learnlib:learnlib-build-config:${project.version}
- learnlib-pmd-exclusions.properties
- ${project.build.directory}/pmd/
-
-
-
-
org.apache.maven.plugins
maven-pmd-plugin
@@ -189,12 +158,6 @@ limitations under the License.
check
-
-
-
- ${project.build.directory}/pmd/learnlib-pmd-exclusions.properties
-
-
@@ -216,17 +179,11 @@ limitations under the License.
cf
+
- org.checkerframework
- checker
- ${checkerframework.version}
- provided
-
-
- org.checkerframework
- jdk8
- ${checkerframework.version}
- provided
+ com.google.code.findbugs
+ jsr305
+ ${jsr305.version}
com.google.errorprone
@@ -259,21 +216,35 @@ limitations under the License.
${learnlib.java9OrNewer}
true
- only
true
${project.build.directory}/checkerframework
+
+
+ org.checkerframework
+ checker
+ ${checkerframework.version}
+
+
org.checkerframework.checker.nullness.NullnessChecker
-J-Xbootclasspath/p:${com.google.errorprone:javac:jar}
- -Xbootclasspath/p:${org.checkerframework:jdk8:jar}
-
- -AonlyDefs=^de\.learnlib
- -AskipUses=.*
+ -AskipDefs=^de.learnlib.algorithms.adt.*|\
+ ^de.learnlib.algorithms.discriminationtree.*.vpda.*|\
+ ^de.learnlib.algorithms.ttt.*|\
+ ^de.learnlib.datastructure.discriminationtree.*|\
+
+ -AskipUses=^de.learnlib.algorithms.adt.*|\
+ ^de.learnlib.algorithms.ttt.*|\
+ ^de.learnlib.datastructure.discriminationtree.*|\
+ ^java.lang.ThreadLocal|\
+ ^net.automatalib.*|\
+ ^org.testng.*|\
+
-AsuppressWarnings=uninitialized
-AassumeAssertionsAreEnabled
-
+ -Astubs=jdk8.astub:collection-object-parameters-may-be-null.astub
@@ -286,20 +257,24 @@ limitations under the License.
${learnlib.java9OrNewer}
true
- only
true
${project.build.directory}/checkerframework
+
+
+ org.checkerframework
+ checker
+ ${checkerframework.version}
+
+
org.checkerframework.checker.nullness.NullnessChecker
-J-Xbootclasspath/p:${com.google.errorprone:javac:jar}
- -Xbootclasspath/p:${org.checkerframework:jdk8:jar}
-AonlyDefs=^de\.learnlib
-AskipUses=.*
-AsuppressWarnings=uninitialized
-AassumeAssertionsAreEnabled
- -Alint=redundantNullComparison
diff --git a/build-tools/annotation-processor/pom.xml b/build-tools/annotation-processor/pom.xml
index 00ba228923..883f44b6b2 100644
--- a/build-tools/annotation-processor/pom.xml
+++ b/build-tools/annotation-processor/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-build-parent
- 0.15.0
+ 0.16.0
../../build-parent/pom.xml
@@ -72,4 +72,16 @@ limitations under the License.
+
+
+
+ cf
+
+
+ org.checkerframework
+ checker-qual
+
+
+
+
diff --git a/build-tools/build-config/pom.xml b/build-tools/build-config/pom.xml
index 188a9d33e7..5991b36b89 100644
--- a/build-tools/build-config/pom.xml
+++ b/build-tools/build-config/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-build-tools-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/build-tools/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml b/build-tools/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml
index be4e2f7299..3214f49a19 100644
--- a/build-tools/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml
+++ b/build-tools/build-config/src/main/resources/automatalib-learnlib-checkstyle.xml
@@ -130,9 +130,9 @@ limitations under the License.
-
+
+ value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, INSTANCE_INIT"/>
diff --git a/build-tools/build-config/src/main/resources/learnlib-pmd-exclusions.properties b/build-tools/build-config/src/main/resources/learnlib-pmd-exclusions.properties
deleted file mode 100644
index 590d7b196e..0000000000
--- a/build-tools/build-config/src/main/resources/learnlib-pmd-exclusions.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-# Copyright (C) 2013-2020 TU Dortmund
-# This file is part of LearnLib, http://www.learnlib.de/.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# 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.
-
-
-# expected behavior, we simply want to ignore it and re-start searching
-de.learnlib.algorithms.adt.config.model.extender.DefaultExtender=EmptyCatchBlock
-
-# we want to establish the contract of a (insertion-) stable set
-de.learnlib.algorithms.dhc.mealy.MealyDHC=LooseCoupling
-de.learnlib.algorithms.dhc.mealy.MealyDHCState=LooseCoupling
-
-# ignore exception
-de.learnlib.algorithms.ttt.base.AbstractTTTLearner=EmptyCatchBlock,ExcessiveClassLength
-
-# RuntimeExceptions are the type of exceptions we allow to handle, therefore we should throw them
-de.learnlib.drivers.reflect.ConcreteMethodInput=AvoidThrowingRawExceptionTypes,PreserveStackTrace
-de.learnlib.drivers.reflect.SimplePOJODataMapper=AvoidThrowingRawExceptionTypes,PreserveStackTrace
-
-# fine for exampels
-de.learnlib.examples.Example1=SystemPrintln
-de.learnlib.examples.Example2=SystemPrintln
-de.learnlib.examples.Example3=SystemPrintln
-de.learnlib.examples.sli.Example1=SystemPrintln
-de.learnlib.examples.sli.Example2=SystemPrintln
-
-# we want to allow mapping generic RuntimeExceptions
-de.learnlib.mapper.MappedSUL=AvoidCatchingGenericException
-de.learnlib.mapper.SULMapperComposition=AvoidCatchingGenericException
diff --git a/build-tools/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml b/build-tools/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml
index 66cf819917..4e483b788e 100644
--- a/build-tools/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml
+++ b/build-tools/build-config/src/main/resources/learnlib-spotbugs-exclusions.xml
@@ -35,15 +35,78 @@ limitations under the License.
-
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/build-tools/pom.xml b/build-tools/pom.xml
index d82e56468e..bb9e2c956a 100644
--- a/build-tools/pom.xml
+++ b/build-tools/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/commons/acex/pom.xml b/commons/acex/pom.xml
index 28b271fd4a..4b0faecaa5 100644
--- a/commons/acex/pom.xml
+++ b/commons/acex/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-commons-parent
- 0.15.0
+ 0.16.0
../pom.xml
@@ -37,6 +37,11 @@ limitations under the License.
automata-commons-smartcollections
+
+ org.checkerframework
+ checker-qual
+
+
org.testng
diff --git a/commons/acex/src/main/java/de/learnlib/acex/impl/AbstractBaseCounterexample.java b/commons/acex/src/main/java/de/learnlib/acex/impl/AbstractBaseCounterexample.java
index f6236122dc..e0980fe2f9 100644
--- a/commons/acex/src/main/java/de/learnlib/acex/impl/AbstractBaseCounterexample.java
+++ b/commons/acex/src/main/java/de/learnlib/acex/impl/AbstractBaseCounterexample.java
@@ -17,6 +17,7 @@
import de.learnlib.acex.AbstractCounterexample;
import net.automatalib.commons.smartcollections.ArrayStorage;
+import org.checkerframework.checker.initialization.qual.UnknownInitialization;
public abstract class AbstractBaseCounterexample implements AbstractCounterexample {
@@ -54,7 +55,9 @@ public E effect(int index) {
protected abstract E computeEffect(int index);
- public void setEffect(int index, E effect) {
+ public void setEffect(@UnknownInitialization(AbstractBaseCounterexample.class) AbstractBaseCounterexample this,
+ int index,
+ E effect) {
values.set(index, effect);
}
diff --git a/commons/counterexamples/pom.xml b/commons/counterexamples/pom.xml
index 1eefd649b4..c408af7bc7 100644
--- a/commons/counterexamples/pom.xml
+++ b/commons/counterexamples/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-commons-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/commons/pom.xml b/commons/pom.xml
index 10e501011b..b5772ebc40 100644
--- a/commons/pom.xml
+++ b/commons/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-build-parent
- 0.15.0
+ 0.16.0
../build-parent/pom.xml
diff --git a/commons/settings/pom.xml b/commons/settings/pom.xml
index e28a675ab2..716e911c7d 100644
--- a/commons/settings/pom.xml
+++ b/commons/settings/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-commons-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/commons/settings/src/main/java/de/learnlib/setting/LearnLibProperty.java b/commons/settings/src/main/java/de/learnlib/setting/LearnLibProperty.java
index 47324dc577..5335506336 100644
--- a/commons/settings/src/main/java/de/learnlib/setting/LearnLibProperty.java
+++ b/commons/settings/src/main/java/de/learnlib/setting/LearnLibProperty.java
@@ -50,15 +50,7 @@ public enum LearnLibProperty {
*
* Size of thread pools for parallel oracles.
*/
- PARALLEL_POOL_SIZE("parallel.pool_size"),
-
- /**
- * {@code learnlib.queries.parallel.threshold}.
- *
- * If batch sizes exceed the specified threshold, they will be processed in parallel.
- * (Note: This only covers processing of batches. They are still answered sequentially.)
- */
- PARALLEL_QUERIES_THRESHOLD("queries.parallel.threshold");
+ PARALLEL_POOL_SIZE("parallel.pool_size");
private final String key;
diff --git a/commons/settings/src/test/java/de/learnlib/setting/LearnLibSettingsTest.java b/commons/settings/src/test/java/de/learnlib/setting/LearnLibSettingsTest.java
index cc680b3bfe..64cb7000e2 100644
--- a/commons/settings/src/test/java/de/learnlib/setting/LearnLibSettingsTest.java
+++ b/commons/settings/src/test/java/de/learnlib/setting/LearnLibSettingsTest.java
@@ -53,9 +53,6 @@ public void testProperties() {
case PARALLEL_POOL_SIZE:
Assert.assertEquals(3, settings.getInt(LearnLibProperty.PARALLEL_POOL_SIZE, 0));
break;
- case PARALLEL_QUERIES_THRESHOLD:
- Assert.assertEquals(100, settings.getInt(LearnLibProperty.PARALLEL_QUERIES_THRESHOLD, 0));
- break;
default:
throw new IllegalStateException("Unhandled property " + p);
}
diff --git a/commons/settings/src/test/resources/learnlib.properties b/commons/settings/src/test/resources/learnlib.properties
index cf8c485426..d1c21da905 100644
--- a/commons/settings/src/test/resources/learnlib.properties
+++ b/commons/settings/src/test/resources/learnlib.properties
@@ -1,5 +1,4 @@
learnlib.parallel.batch_size.dynamic=1
learnlib.parallel.batch_size.static=2
learnlib.parallel.pool_policy=CACHED
-learnlib.parallel.pool_size=3
-learnlib.queries.parallel.threshold=100
\ No newline at end of file
+learnlib.parallel.pool_size=3
\ No newline at end of file
diff --git a/commons/util/pom.xml b/commons/util/pom.xml
index 2b80c0abbe..a92c0ea70b 100644
--- a/commons/util/pom.xml
+++ b/commons/util/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-commons-parent
- 0.15.0
+ 0.16.0
../pom.xml
@@ -36,10 +36,6 @@ limitations under the License.
de.learnlib
learnlib-api
-
- de.learnlib
- learnlib-settings
-
de.learnlib
learnlib-statistics
diff --git a/commons/util/src/main/java/de/learnlib/util/MQUtil.java b/commons/util/src/main/java/de/learnlib/util/MQUtil.java
index 9a5b21349b..e3b496503f 100644
--- a/commons/util/src/main/java/de/learnlib/util/MQUtil.java
+++ b/commons/util/src/main/java/de/learnlib/util/MQUtil.java
@@ -24,21 +24,13 @@
import de.learnlib.api.query.DefaultQuery;
import de.learnlib.api.query.OmegaQuery;
import de.learnlib.api.query.Query;
-import de.learnlib.setting.LearnLibProperty;
-import de.learnlib.setting.LearnLibSettings;
import net.automatalib.automata.concepts.SuffixOutput;
import net.automatalib.commons.util.Pair;
import net.automatalib.words.Word;
+import org.checkerframework.checker.nullness.qual.Nullable;
public final class MQUtil {
- public static final int PARALLEL_THRESHOLD;
-
- static {
- LearnLibSettings settings = LearnLibSettings.getInstance();
- PARALLEL_THRESHOLD = settings.getInt(LearnLibProperty.PARALLEL_QUERIES_THRESHOLD, -1);
- }
-
private MQUtil() {
// prevent instantiation
}
@@ -60,24 +52,6 @@ public static DefaultQuery query(MembershipOracle oracle, Wor
return query(oracle, Word.epsilon(), queryWord);
}
- public static void answerQueriesAuto(QueryAnswerer answerer,
- Collection extends Query> queries) {
- if (PARALLEL_THRESHOLD < 0 || queries.size() < PARALLEL_THRESHOLD) {
- answerQueries(answerer, queries);
- } else {
- answerQueriesParallel(answerer, queries);
- }
- }
-
- public static void answerOmegaQueriesAuto(OmegaQueryAnswerer answerer,
- Collection extends OmegaQuery> queries) {
- if (PARALLEL_THRESHOLD < 0 || queries.size() < PARALLEL_THRESHOLD) {
- answerOmegaQueries(answerer, queries);
- } else {
- answerOmegaQueriesParallel(answerer, queries);
- }
- }
-
public static void answerQueries(QueryAnswerer answerer, Collection extends Query> queries) {
for (Query query : queries) {
Word prefix = query.getPrefix();
@@ -93,32 +67,11 @@ public static void answerOmegaQueries(OmegaQueryAnswerer answ
final Word prefix = query.getPrefix();
final Word loop = query.getLoop();
final int repeat = query.getRepeat();
- Pair answer = answerer.answerQuery(prefix, loop, repeat);
+ Pair<@Nullable D, Integer> answer = answerer.answerQuery(prefix, loop, repeat);
query.answer(answer.getFirst(), answer.getSecond());
}
}
- public static void answerQueriesParallel(QueryAnswerer answerer,
- Collection extends Query> queries) {
- queries.parallelStream().forEach(q -> {
- Word prefix = q.getPrefix();
- Word suffix = q.getSuffix();
- D answer = answerer.answerQuery(prefix, suffix);
- q.answer(answer);
- });
- }
-
- public static void answerOmegaQueriesParallel(OmegaQueryAnswerer answerer,
- Collection extends OmegaQuery> queries) {
- queries.parallelStream().forEach(q -> {
- final Word prefix = q.getPrefix();
- final Word loop = q.getLoop();
- final int repeat = q.getRepeat();
- Pair answer = answerer.answerQuery(prefix, loop, repeat);
- q.answer(answer.getFirst(), answer.getSecond());
- });
- }
-
public static boolean isCounterexample(DefaultQuery query, SuffixOutput hyp) {
D qryOut = query.getOutput();
D hypOut = hyp.computeSuffixOutput(query.getPrefix(), query.getSuffix());
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 e298c88994..a2f8508c9f 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
@@ -122,7 +122,7 @@ private static int doFindMismatch(MealyMachine hypothes
return new MealyLearnerWrapper<>(learner);
}
- public static MembershipOracle wrapWordOracle(MembershipOracle> oracle) {
+ public static MembershipOracle wrapWordOracle(MembershipOracle> oracle) {
return new SymbolOracleWrapper<>(oracle);
}
diff --git a/commons/util/src/main/java/de/learnlib/util/mealy/SymbolOracleWrapper.java b/commons/util/src/main/java/de/learnlib/util/mealy/SymbolOracleWrapper.java
index a18ac63e3f..9fe28eee8f 100644
--- a/commons/util/src/main/java/de/learnlib/util/mealy/SymbolOracleWrapper.java
+++ b/commons/util/src/main/java/de/learnlib/util/mealy/SymbolOracleWrapper.java
@@ -22,6 +22,7 @@
import de.learnlib.api.oracle.MembershipOracle;
import de.learnlib.api.query.Query;
import net.automatalib.words.Word;
+import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Word-to-Symbol-Oracle adapter.
@@ -36,7 +37,7 @@
*
* @author Malte Isberner
*/
-final class SymbolOracleWrapper implements MembershipOracle {
+final class SymbolOracleWrapper implements MembershipOracle {
private final MembershipOracle> wordOracle;
@@ -51,9 +52,9 @@ final class SymbolOracleWrapper implements MembershipOracle {
}
@Override
- public void processQueries(Collection extends Query> queries) {
+ public void processQueries(Collection extends Query> queries) {
List> lsQueries = new ArrayList<>(queries.size());
- for (Query qry : queries) {
+ for (Query qry : queries) {
lsQueries.add(new LastSymbolQuery<>(qry));
}
@@ -62,9 +63,9 @@ public void processQueries(Collection extends Query> queries) {
private static final class LastSymbolQuery extends Query> {
- private final Query originalQuery;
+ private final Query originalQuery;
- LastSymbolQuery(Query originalQuery) {
+ LastSymbolQuery(Query originalQuery) {
this.originalQuery = originalQuery;
}
diff --git a/datastructures/discrimination-tree/pom.xml b/datastructures/discrimination-tree/pom.xml
index cc2767e3d6..3d10ff9dcb 100644
--- a/datastructures/discrimination-tree/pom.xml
+++ b/datastructures/discrimination-tree/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-datastructures-parent
- 0.15.0
+ 0.16.0
../pom.xml
@@ -64,11 +64,6 @@ limitations under the License.
automata-util
-
- org.checkerframework
- checker-qual
-
-
de.learnlib.testsupport
diff --git a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTNode.java b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTNode.java
index 5c9b8acdb8..a0c6469f19 100644
--- a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTNode.java
+++ b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/BinaryDTNode.java
@@ -20,7 +20,6 @@
import de.learnlib.datastructure.discriminationtree.model.AbstractWordBasedDTNode;
import de.learnlib.datastructure.discriminationtree.model.BooleanMap;
-import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Binary discrimination tree node specialization.
@@ -38,7 +37,7 @@ public BinaryDTNode(D data) {
super(data);
}
- public BinaryDTNode(BinaryDTNode parent, Boolean parentOutcome, @Nullable D data) {
+ public BinaryDTNode(BinaryDTNode parent, Boolean parentOutcome, D data) {
super(parent, parentOutcome, data);
}
@@ -48,7 +47,7 @@ protected Map> createChildMap()
}
@Override
- protected BinaryDTNode createChild(Boolean outcome, @Nullable D data) {
+ protected BinaryDTNode createChild(Boolean outcome, D data) {
return new BinaryDTNode<>(this, outcome, data);
}
}
diff --git a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/MultiDTNode.java b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/MultiDTNode.java
index 5d89a7a0cc..8fa0d3b64c 100644
--- a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/MultiDTNode.java
+++ b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/MultiDTNode.java
@@ -19,7 +19,6 @@
import java.util.Map;
import de.learnlib.datastructure.discriminationtree.model.AbstractWordBasedDTNode;
-import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Generic n-ary discrimination tree node specialization.
@@ -39,7 +38,7 @@ public MultiDTNode(D data) {
super(data);
}
- public MultiDTNode(MultiDTNode parent, O parentOutcome, @Nullable D data) {
+ public MultiDTNode(MultiDTNode parent, O parentOutcome, D data) {
super(parent, parentOutcome, data);
}
@@ -49,7 +48,7 @@ protected Map> createChildMap() {
}
@Override
- protected MultiDTNode createChild(O outcome, @Nullable D data) {
+ protected MultiDTNode createChild(O outcome, D data) {
return new MultiDTNode<>(this, outcome, data);
}
}
diff --git a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractDTNode.java b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractDTNode.java
index acc3dc35a9..90dda6e82b 100644
--- a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractDTNode.java
+++ b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractDTNode.java
@@ -20,10 +20,6 @@
import java.util.Map;
import java.util.Objects;
-import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.checker.nullness.qual.RequiresNonNull;
-
/**
* An abstract super class (DAO) for aggregating several information stored in a node of an discrimination tree.
*
@@ -40,18 +36,18 @@
*/
public abstract class AbstractDTNode> implements Serializable {
- protected final @Nullable N parent;
- protected final @Nullable O parentOutcome;
+ protected final N parent;
+ protected final O parentOutcome;
protected final int depth;
- protected @Nullable Map children;
+ protected Map children;
protected DSCR discriminator;
- protected @Nullable D data;
+ protected D data;
public AbstractDTNode(D data) {
this(null, null, data);
}
- protected AbstractDTNode(N parent, O parentOutcome, @Nullable D data) {
+ protected AbstractDTNode(N parent, O parentOutcome, D data) {
this.parent = parent;
this.parentOutcome = parentOutcome;
this.depth = (parent != null) ? parent.depth + 1 : 0;
@@ -78,8 +74,7 @@ public SplitResult split(DSCR discriminator, O oldOut, O newOut) {
return this.split(discriminator, oldOut, newOut, null);
}
- @EnsuresNonNull("children")
- public SplitResult split(DSCR discriminator, O oldOut, O newOut, @Nullable D newData) {
+ public SplitResult split(DSCR discriminator, O oldOut, O newOut, D newData) {
assert this.isLeaf();
assert !Objects.equals(oldOut, newOut);
@@ -100,20 +95,19 @@ public boolean isLeaf() {
protected abstract Map createChildMap();
- @RequiresNonNull("children")
- protected N addChild(O outcome, @Nullable D data) {
+ protected N addChild(O outcome, D data) {
final N child = createChild(outcome, data);
children.put(outcome, child);
return child;
}
- protected abstract N createChild(O outcome, @Nullable D data);
+ protected abstract N createChild(O outcome, D data);
public N child(O out) {
return child(out, null);
}
- public N child(O out, @Nullable D defaultData) {
+ public N child(O out, D defaultData) {
assert !isLeaf();
N result = getChild(out);
@@ -123,17 +117,14 @@ public N child(O out, @Nullable D defaultData) {
return result;
}
- @RequiresNonNull("children")
public N getChild(O out) {
return children.get(out);
}
- @RequiresNonNull("children")
public Collection getChildren() {
return children.values();
}
- @RequiresNonNull("children")
public Collection> getChildEntries() {
return children.entrySet();
}
@@ -156,7 +147,7 @@ public void setData(D data) {
this.data = data;
}
- public @Nullable O subtreeLabel(N descendant) {
+ public O subtreeLabel(N descendant) {
N curr = descendant;
while (curr.depth > this.depth + 1) {
@@ -170,7 +161,7 @@ public void setData(D data) {
return curr.getParentOutcome();
}
- public @Nullable O getParentOutcome() {
+ public O getParentOutcome() {
return parentOutcome;
}
diff --git a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractTemporaryIntrusiveDTNode.java b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractTemporaryIntrusiveDTNode.java
index 5b99fbdb4e..0f407b0c27 100644
--- a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractTemporaryIntrusiveDTNode.java
+++ b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractTemporaryIntrusiveDTNode.java
@@ -20,8 +20,6 @@
import de.learnlib.datastructure.discriminationtree.SplitData;
import de.learnlib.datastructure.list.IntrusiveList;
import de.learnlib.datastructure.list.IntrusiveListElem;
-import org.checkerframework.checker.nullness.qual.Nullable;
-import org.checkerframework.checker.nullness.qual.RequiresNonNull;
/**
* An extension of the {@link AbstractDTNode} that adds the concept of temporary splitters as well as linking
@@ -46,8 +44,8 @@ public abstract class AbstractTemporaryIntrusiveDTNode splitData;
- protected @Nullable IntrusiveListElem prevElement;
- protected @Nullable N nextElement;
+ protected IntrusiveListElem prevElement;
+ protected N nextElement;
// LEAF NODE DATA
private boolean temp;
@@ -56,7 +54,6 @@ public AbstractTemporaryIntrusiveDTNode(N parent, O parentOutcome, D data) {
super(parent, parentOutcome, data);
}
- @RequiresNonNull("children")
public void setChild(O label, N newChild) {
assert newChild.parent == this;
assert Objects.equals(newChild.getParentOutcome(), label);
@@ -80,7 +77,6 @@ public void setSplitData(SplitData splitData) {
this.splitData = splitData;
}
- @RequiresNonNull("children")
public N anyChild() {
assert isInner();
return children.values().iterator().next();
@@ -106,20 +102,20 @@ public void removeFromBlockList() {
}
@Override
- public @Nullable N getNextElement() {
+ public N getNextElement() {
return nextElement;
}
@Override
- public void setNextElement(@Nullable N nextBlock) {
+ public void setNextElement(N nextBlock) {
this.nextElement = nextBlock;
}
- public @Nullable IntrusiveListElem getPrevElement() {
+ public IntrusiveListElem getPrevElement() {
return prevElement;
}
- public void setPrevElement(@Nullable IntrusiveListElem prevElement) {
+ public void setPrevElement(IntrusiveListElem prevElement) {
this.prevElement = prevElement;
}
}
diff --git a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractWordBasedDTNode.java b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractWordBasedDTNode.java
index d524ed235a..af37a08b53 100644
--- a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractWordBasedDTNode.java
+++ b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/AbstractWordBasedDTNode.java
@@ -16,7 +16,6 @@
package de.learnlib.datastructure.discriminationtree.model;
import net.automatalib.words.Word;
-import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Convenient class for word-based discrimination tree nodes that already binds certain generics.
@@ -37,7 +36,7 @@ public AbstractWordBasedDTNode(D data) {
super(data);
}
- public AbstractWordBasedDTNode(AbstractWordBasedDTNode parent, O parentOutcome, @Nullable D data) {
+ public AbstractWordBasedDTNode(AbstractWordBasedDTNode parent, O parentOutcome, D data) {
super(parent, parentOutcome, data);
}
}
diff --git a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java
index 2b33275154..46f08e31ff 100644
--- a/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java
+++ b/datastructures/discrimination-tree/src/main/java/de/learnlib/datastructure/discriminationtree/model/BooleanMap.java
@@ -27,8 +27,6 @@
import java.util.Objects;
import java.util.Set;
-import org.checkerframework.checker.nullness.qual.Nullable;
-
/**
* Primitive implementation for boolean maps.
*
@@ -70,7 +68,7 @@ public boolean containsKey(Object key) {
}
@Override
- public @Nullable V get(Object key) {
+ public V get(Object key) {
if (key == null || key.getClass() != Boolean.class) {
return null;
}
@@ -107,7 +105,7 @@ public V put(boolean key, V value) {
}
@Override
- public @Nullable V remove(Object key) {
+ public V remove(Object key) {
if (key == null || key.getClass() != Boolean.class) {
return null;
}
@@ -211,12 +209,11 @@ public boolean equals(Object o) {
if (this == o) {
return true;
}
- if (!(o instanceof de.learnlib.datastructure.discriminationtree.model.BooleanMap.Entry)) {
+ if (!(o instanceof BooleanMap.Entry)) {
return false;
}
- final de.learnlib.datastructure.discriminationtree.model.BooleanMap.Entry that =
- (de.learnlib.datastructure.discriminationtree.model.BooleanMap.Entry) o;
+ final BooleanMap.Entry that = (BooleanMap.Entry) o;
return Objects.equals(key, that.key);
}
}
diff --git a/datastructures/list/pom.xml b/datastructures/list/pom.xml
index 0e7a3118a6..1e5b574d8b 100644
--- a/datastructures/list/pom.xml
+++ b/datastructures/list/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-datastructures-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveList.java b/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveList.java
index 1c4cbf5487..acc7e57bc3 100644
--- a/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveList.java
+++ b/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveList.java
@@ -18,6 +18,8 @@
import java.util.Iterator;
import com.google.common.collect.AbstractIterator;
+import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
+import org.checkerframework.checker.nullness.qual.Nullable;
/**
* The head of the intrusive linked list for storing incoming transitions of a DT node.
@@ -29,6 +31,7 @@
*/
public class IntrusiveList> extends IntrusiveListElemImpl implements Iterable {
+ @EnsuresNonNullIf(expression = "next", result = false)
public boolean isEmpty() {
return next == null;
}
@@ -38,7 +41,7 @@ public boolean isEmpty() {
*
* @return any block from the list, or {@code null} if the list is empty.
*/
- public T choose() {
+ public @Nullable T choose() {
return next;
}
@@ -60,9 +63,9 @@ public Iterator iterator() {
private class ListIterator extends AbstractIterator {
- private T cursor;
+ private @Nullable T cursor;
- ListIterator(T start) {
+ ListIterator(@Nullable T start) {
this.cursor = start;
}
diff --git a/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveListElemImpl.java b/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveListElemImpl.java
index 8512a0da0c..27f0c8f267 100644
--- a/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveListElemImpl.java
+++ b/datastructures/list/src/main/java/de/learnlib/datastructure/list/IntrusiveListElemImpl.java
@@ -17,6 +17,8 @@
import java.io.Serializable;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
/**
* An element in an {@link IntrusiveList}.
*
@@ -27,15 +29,15 @@
*/
public class IntrusiveListElemImpl implements IntrusiveListElem, Serializable {
- protected T next;
+ protected @Nullable T next;
@Override
- public T getNextElement() {
+ public @Nullable T getNextElement() {
return next;
}
@Override
- public void setNextElement(T next) {
+ public void setNextElement(@Nullable T next) {
this.next = next;
}
}
diff --git a/datastructures/observation-table/pom.xml b/datastructures/observation-table/pom.xml
index 948e60a424..5fb1fcb26f 100644
--- a/datastructures/observation-table/pom.xml
+++ b/datastructures/observation-table/pom.xml
@@ -21,7 +21,7 @@ limitations under the License.
de.learnlib
learnlib-datastructures-parent
- 0.15.0
+ 0.16.0
../pom.xml
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/GenericObservationTable.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/GenericObservationTable.java
index 54e9026669..994cbdd1ae 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/GenericObservationTable.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/GenericObservationTable.java
@@ -31,6 +31,7 @@
import net.automatalib.words.Alphabet;
import net.automatalib.words.Word;
import net.automatalib.words.impl.Alphabets;
+import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Observation table class.
@@ -63,13 +64,13 @@
*/
public final class GenericObservationTable implements MutableObservationTable, Serializable {
- private static final Integer NO_ENTRY = null; // TODO: replace with primitive specialization
+ private static final int NO_ENTRY = -1;
private final List> shortPrefixRows = new ArrayList<>();
// private static final int NO_ENTRY = -1;
private final List> longPrefixRows = new ArrayList<>();
private final List> allRows = new ArrayList<>();
private final List> allRowContents = new ArrayList<>();
- private final List> canonicalRows = new ArrayList<>();
+ private final List<@Nullable RowImpl> canonicalRows = new ArrayList<>();
// private final TObjectIntMap> rowContentIds = new TObjectIntHashMap<>(10, 0.75f, NO_ENTRY);
private final Map, Integer> rowContentIds = new HashMap<>(); // TODO: replace with primitive specialization
private final Map, RowImpl> rowMap = new HashMap<>();
@@ -237,10 +238,9 @@ private static void fetchResults(Iterator> queryIt, Li
}
private boolean processContents(RowImpl row, List rowContents, boolean makeCanonical) {
- Integer contentId; // TODO: replace with primitive specialization
- // int contentId;
+ int contentId;
boolean added = false;
- contentId = rowContentIds.get(rowContents);
+ contentId = rowContentIds.getOrDefault(rowContents, NO_ENTRY);
if (contentId == NO_ENTRY) {
contentId = numberOfDistinctRows();
rowContentIds.put(rowContents, contentId);
@@ -511,10 +511,12 @@ public void setInputAlphabet(Alphabet alphabet) {
@Override
public Word transformAccessSequence(Word word) {
Row current = shortPrefixRows.get(0);
+ assert current != null;
for (I sym : word) {
current = getRowSuccessor(current, sym);
current = canonicalRows.get(current.getRowContentId());
+ assert current != null;
}
return current.getLabel();
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/Inconsistency.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/Inconsistency.java
index 9f3f635cef..7ba253b2f7 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/Inconsistency.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/Inconsistency.java
@@ -15,8 +15,6 @@
*/
package de.learnlib.datastructure.observationtable;
-import org.checkerframework.checker.nullness.qual.Nullable;
-
/**
* A description of an inconsistency in an {@link GenericObservationTable}. An inconsistency consists of two short
* prefixes u, u' with identical contents, and an input symbol a, such that the
@@ -62,7 +60,7 @@ public Row getSecondRow() {
*
* @return the symbol
*/
- public @Nullable I getSymbol() {
+ public I getSymbol() {
return symbol;
}
}
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/OTUtils.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/OTUtils.java
index f2ebe8cc5d..860450ed44 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/OTUtils.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/OTUtils.java
@@ -20,6 +20,7 @@
import java.io.File;
import java.io.IOException;
import java.io.Writer;
+import java.util.Objects;
import java.util.function.Function;
import de.learnlib.datastructure.observationtable.reader.ObservationTableReader;
@@ -65,7 +66,7 @@ public static ObservationTable fromString(String source,
}
public static void writeHTMLToFile(ObservationTable table, File file) throws IOException {
- writeHTMLToFile(table, file, Object::toString, Object::toString);
+ writeHTMLToFile(table, file, Objects::toString, Objects::toString);
}
public static void writeHTMLToFile(ObservationTable table,
@@ -86,7 +87,7 @@ public static void writeHTMLToFile(ObservationTable table,
* Object#toString()} to render words and outputs of the observation table.
*/
public static void displayHTMLInBrowser(ObservationTable table) throws IOException {
- displayHTMLInBrowser(table, Object::toString, Object::toString);
+ displayHTMLInBrowser(table, Objects::toString, Objects::toString);
}
/**
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/ObservationTable.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/ObservationTable.java
index 3e555d35ab..2b203609fd 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/ObservationTable.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/ObservationTable.java
@@ -117,7 +117,18 @@ default Collection> getLongPrefixes() {
Collection> getLongPrefixRows();
- @Nullable Row getRow(int idx);
+ /**
+ * Returns the specified row of the observation table.
+ *
+ * @param idx
+ * the index of the row
+ *
+ * @return the row
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code idx} is less than 0 or greater than {@code number of rows - 1}.
+ */
+ Row getRow(int idx);
default @Nullable Row getRow(Word prefix) {
for (Row row : getAllRows()) {
@@ -279,7 +290,6 @@ default boolean isConsistent() {
return (findInconsistency() == null);
}
-
default @Nullable Inconsistency findInconsistency() {
@SuppressWarnings("unchecked")
final Row[] canonicalRows = (Row[]) new Row>[numberOfDistinctRows()];
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SimpleObservationTable.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SimpleObservationTable.java
index 7f5bcbda70..d972eafd88 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SimpleObservationTable.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SimpleObservationTable.java
@@ -37,7 +37,7 @@
* @param
* The output domain type.
*/
-public class SimpleObservationTable implements ObservationTable {
+public class SimpleObservationTable implements ObservationTable {
final List extends Word> suffixes;
@@ -57,8 +57,8 @@ public Collection> getLongPrefixRows() {
@Override
- public @Nullable Row getRow(int idx) {
- return null;
+ public Row getRow(int idx) {
+ throw new IndexOutOfBoundsException("This OT contains no data");
}
@Override
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SuffixASCIIReader.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SuffixASCIIReader.java
index 2e974946a0..f0b58ae3bc 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SuffixASCIIReader.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/reader/SuffixASCIIReader.java
@@ -18,6 +18,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import com.google.common.collect.Maps;
import de.learnlib.datastructure.observationtable.ObservationTable;
@@ -54,7 +55,7 @@ private Map generateNameToSymbolMap(Alphabet alphabet) {
Map nameToSymbol = Maps.newHashMapWithExpectedSize(alphabet.size());
for (I symbol : alphabet) {
- String symbolName = symbol.toString();
+ String symbolName = Objects.toString(symbol);
if (nameToSymbol.containsKey(symbolName)) {
throw new IllegalArgumentException(
"Symbol name '" + symbolName + "' is used more than once in alphabet");
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/AbstractObservationTableWriter.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/AbstractObservationTableWriter.java
index 361bc73d5a..42dfd7c15a 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/AbstractObservationTableWriter.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/AbstractObservationTableWriter.java
@@ -19,6 +19,7 @@
import java.util.function.Function;
import net.automatalib.words.Word;
+import org.checkerframework.checker.initialization.qual.UnknownInitialization;
public abstract class AbstractObservationTableWriter implements ObservationTableWriter {
@@ -42,7 +43,8 @@ public AbstractObservationTableWriter(Function super Word extends I>, ? exte
return Objects::toString;
}
- public void setWordToString(Function super Word extends I>, ? extends String> wordToString) {
+ public void setWordToString(@UnknownInitialization(AbstractObservationTableWriter.class) AbstractObservationTableWriter this,
+ Function super Word extends I>, ? extends String> wordToString) {
this.wordToString = safeToStringFunction(wordToString);
}
diff --git a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/SuffixASCIIWriter.java b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/SuffixASCIIWriter.java
index e1907406a8..846c1c4278 100644
--- a/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/SuffixASCIIWriter.java
+++ b/datastructures/observation-table/src/main/java/de/learnlib/datastructure/observationtable/writer/SuffixASCIIWriter.java
@@ -17,6 +17,8 @@
import java.io.IOException;
import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
import java.util.function.Function;
import de.learnlib.datastructure.observationtable.ObservationTable;
@@ -38,51 +40,34 @@ public class SuffixASCIIWriter extends AbstractObservationTableWriter, String> wordToString = new Function, String>() {
-
- @Nullable
- @Override
- public String apply(@Nullable Word extends I> is) {
- if (is == null) {
- return "";
- }
-
- boolean first = true;
-
- StringBuilder sb = new StringBuilder();
-
- for (I symbol : is) {
- if (first) {
- first = false;
- } else {
- sb.append(SYMBOL_DELIMITER);
- }
+ private static final Function super Word>, String> WORD_TO_STRING = is -> {
+ if (is == null || is.isEmpty()) {
+ return "";
+ }
- String stringRepresentation = symbol.toString();
+ final StringJoiner joiner = new StringJoiner(SYMBOL_DELIMITER);
- if (stringRepresentation.contains(SYMBOL_DELIMITER) ||
- stringRepresentation.contains(WORD_DELIMITER)) {
- throw new IllegalArgumentException(
- "Symbol '" + stringRepresentation + "' must not contain " + "delimiters '" +
- SYMBOL_DELIMITER + "' or '" + WORD_DELIMITER + '\'');
- }
+ for (@Nullable Object symbol : is) {
+ String stringRepresentation = Objects.toString(symbol);
+ if (stringRepresentation.contains(SYMBOL_DELIMITER) || stringRepresentation.contains(WORD_DELIMITER)) {
+ throw new IllegalArgumentException(
+ "Symbol '" + stringRepresentation + "' must not contain " + "delimiters '" + SYMBOL_DELIMITER +
+ "' or '" + WORD_DELIMITER + '\'');
+ }
- sb.append(symbol.toString());
- }
+ joiner.add(stringRepresentation);
+ }
- return sb.toString();
- }
- };
+ return joiner.toString();
+ };
- super.setWordToString(wordToString);
+ public SuffixASCIIWriter() {
+ super();
+ super.setWordToString(WORD_TO_STRING);
}
@Override
- public void write(ObservationTable extends I, ? extends D> table, Appendable out)
- throws IOException {
+ public void write(ObservationTable extends I, ? extends D> table, Appendable out) throws IOException {
List extends Word extends I>> suffixes = table.getSuffixes();
StringBuilder sb = new StringBuilder();
diff --git a/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/MockedObservationTable.java b/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/MockedObservationTable.java
index 3b51b8c458..b1d2541a31 100644
--- a/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/MockedObservationTable.java
+++ b/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/MockedObservationTable.java
@@ -25,7 +25,6 @@
import com.google.common.base.Preconditions;
import de.learnlib.datastructure.observationtable.reader.SimpleObservationTable;
import net.automatalib.words.Word;
-import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Mock-up observation table for testing writers.
@@ -91,8 +90,7 @@ public Collection> getLongPrefixRows() {
}
@Override
- public @Nullable RowImpl getRow(int idx) {
- Preconditions.checkPositionIndex(0, rows.size());
+ public RowImpl getRow(int idx) {
return rows.get(idx);
}
diff --git a/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriterTest.java b/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriterTest.java
index 7edef9529e..50dbfb6dcf 100644
--- a/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriterTest.java
+++ b/datastructures/observation-table/src/test/java/de/learnlib/datastructure/observationtable/writer/ObservationTableWriterTest.java
@@ -17,8 +17,8 @@
import java.io.IOException;
import java.io.StringWriter;
-import java.net.URI;
import java.net.URISyntaxException;
+import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -59,8 +59,10 @@ private static void testInternal(AbstractObservationTableWriter