diff --git a/build.gradle b/build.gradle index f8efd17..661272b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,14 +1,9 @@ -task wrapper(type: Wrapper) { - gradleVersion = '4.5' - distributionType = 'ALL' -} - buildscript { ext { springBootVersion = '1.5.9.RELEASE' } repositories { - mavenCentral() + jcenter() maven { url 'https://jitpack.io' } } dependencies { @@ -16,24 +11,33 @@ buildscript { } } +plugins { + id 'application' + id 'org.openjfx.javafxplugin' version '0.0.7' +} apply plugin: 'java' apply plugin: 'idea' apply plugin: 'eclipse' -apply plugin: 'application' apply plugin: 'org.springframework.boot' apply from: rootProject.file('gradle/codecov.gradle') +apply from: rootProject.file('gradle/jmh.gradle') + +javafx { + version = "12" + modules = [ 'javafx.controls', 'javafx.fxml' ] +} group = 'de.kintel' version = '0.0.2-SNAPSHOT' -sourceCompatibility = 1.8 +sourceCompatibility = 9 +targetCompatibility = 9 repositories { mavenCentral() maven { url 'https://jitpack.io' } } - dependencies { compile group: 'org.fusesource.jansi', name: 'jansi', version: '1.16' compile 'org.apache.commons:commons-lang3:3.7' @@ -41,7 +45,8 @@ dependencies { compile 'de.saxsys:mvvmfx:1.7.0' compile 'com.gluonhq:ignite-spring:1.0.0' compile 'com.github.lestard:Grid:0190d50d93' - compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2' + compile group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.annotation', version: '2.1.100' + compileOnly 'javax.annotation:javax.annotation-api:1.3.1' compile 'com.google.guava:guava:19.0' compile 'com.github.avianey:minimax4j:fcb7a9c77b' compile('org.springframework.boot:spring-boot-starter') diff --git a/gradle/jmh.gradle b/gradle/jmh.gradle new file mode 100644 index 0000000..cafbeb4 --- /dev/null +++ b/gradle/jmh.gradle @@ -0,0 +1,110 @@ +sourceSets { + jmh { + compileClasspath += sourceSets.test.runtimeClasspath + runtimeClasspath += sourceSets.test.runtimeClasspath + } +} + +dependencies { + jmhCompile project + jmhCompile 'org.openjdk.jmh:jmh-core:1.18' + jmhCompile 'org.openjdk.jmh:jmh-generator-annprocess:1.18' +} + +eclipse { + classpath { + plusConfigurations.add(configurations.jmhCompile) + defaultOutputDir = file('build/classes-jmh-ide') + } +} + +task ('jmhHelp', description:'Print help for the jmh task') { + doLast { + println "" + println "Usage of jmh tasks:" + println "" + + println "Only execute specific benchmark(s):" + println "\t./gradlew jmh -Pinclude=\".*MyBenchmark.*\"" + + println "" + println "Specify extra profilers:" + println "\t./gradlew jmh -Pprofilers=\"gc,stack\"" + + println "" + println "Prominent profilers (for full list call jmhProfilers task):" + println "\tcomp - JitCompilations, tune your iterations" + println "\tstack - which methods used most time" + println "\tgc - print garbage collection stats" + println "\ths_thr - thread usage" + + println "" + println "Change report format from JSON to one of [CSV, JSON, NONE, SCSV, TEXT]:" + println "\t./gradlew jmh -Pformat=csv" + + println "" + println "Specify JVM arguments:" + println "\t./gradlew jmh -PjvmArgs=\"-Dtest.cluster=local\"" + + println "" + println "Run in verification mode (execute benchmarks with minimum of fork/warmup-/benchmark-iterations):" + println "\tgw jmh -Pverify" + + println "" + println "Resources:" + println "\thttp://tutorials.jenkov.com/java-performance/jmh.html (Introduction)" + println "\thttp://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/ (Samples)" + } +} + +task jmhProfilers(type: JavaExec, description:'Lists the available profilers for the jmh task', group: 'Development') { + classpath = sourceSets.jmh.runtimeClasspath + main = 'org.openjdk.jmh.Main' + args '-lprof' +} + +task jmh(type: JavaExec, description: 'Executing JMH benchmarks') { + classpath = sourceSets.jmh.runtimeClasspath + main = 'org.openjdk.jmh.Main' + + def include = project.properties.get('include', ''); + def exclude = project.properties.get('exclude'); + def format = project.properties.get('format', 'json'); + def profilers = project.properties.get('profilers'); + def jvmArgs = project.properties.get('jvmArgs') + def verify = project.properties.get('verify'); + + def resultFile = file("build/reports/jmh/result.${format}") + + args include + if(exclude) { + args '-e', exclude + } + if(verify != null) { // execute benchmarks with the minimum amount of execution (only to check if they are working) + println "≥≥ Running in verify mode" + args '-f' , 1 + args '-wi' , 1 + args '-i' , 1 + } + args '-foe', 'true' //fail-on-error + args '-v', 'NORMAL' //verbosity [SILENT, NORMAL, EXTRA] + if(profilers) { + profilers.split(',').each { + args '-prof', it + } + } + args '-jvmArgsPrepend', '-Xmx3072m' + args '-jvmArgsPrepend', '-Xms3072m' + if(jvmArgs) { + for(jvmArg in jvmArgs.split(' ')) { + args '-jvmArgsPrepend', jvmArg + } + } + args '-rf', format + args '-rff', resultFile + + doFirst { + println "\nExecuting JMH with: $args \n" + resultFile.parentFile.mkdirs() + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a5fe1cb..87b738c 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 79e3c37..6b3851a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d..af6708f 100755 --- a/gradlew +++ b/gradlew @@ -28,7 +28,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" diff --git a/gradlew.bat b/gradlew.bat index f955316..6d57edc 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome diff --git a/src/jmh/java/de/kintel/ki/WeightingBenchmarks.java b/src/jmh/java/de/kintel/ki/WeightingBenchmarks.java new file mode 100644 index 0000000..9510325 --- /dev/null +++ b/src/jmh/java/de/kintel/ki/WeightingBenchmarks.java @@ -0,0 +1,54 @@ +package de.kintel.ki; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import com.google.common.collect.Lists; +import de.kintel.ki.algorithm.MoveClassifier; +import de.kintel.ki.algorithm.Weighting; +import de.kintel.ki.algorithm.WeightingDummyImpl; +import de.kintel.ki.algorithm.WeightingHeightAndRank; +import de.kintel.ki.model.Board; +import de.kintel.ki.model.GridFactory; +import de.kintel.ki.model.Player; +import de.kintel.ki.ruleset.RulesChecker; +import de.kintel.ki.ruleset.rules.RuleDestinationIsEmpty; +import de.kintel.ki.ruleset.rules.RuleDirection; +import de.kintel.ki.ruleset.rules.RuleDistanceAndOpponent; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; +import org.slf4j.LoggerFactory; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.NANOSECONDS; + +@BenchmarkMode({Mode.AverageTime}) +@OutputTimeUnit(NANOSECONDS) +@State(Scope.Thread) +@Warmup(iterations = 3, time = 500, timeUnit = MILLISECONDS) +@Measurement(iterations = 5, time = 200, timeUnit = MILLISECONDS) +public class WeightingBenchmarks { + + private Weighting weightingDummy; + private Weighting weightingHeightAndRank; + private Board board; + + @Setup + public void prepare() { + weightingDummy = new WeightingDummyImpl(); + weightingHeightAndRank = new WeightingHeightAndRank(new MoveClassifier(new RulesChecker(Lists.newArrayList(new RuleDirection(), new RuleDestinationIsEmpty(), new RuleDistanceAndOpponent())))); + board = new Board(7, 9, GridFactory.getLaskaInitGrid()); + Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + root.setLevel(Level.ERROR); + } + + @Benchmark + public void weightingHeightAndRank(Blackhole fox) { + fox.consume(weightingHeightAndRank.evaluate(board, Player.SCHWARZ)); + } + + @Benchmark + public void dummyWeighting(Blackhole fox) { + fox.consume(weightingDummy.evaluate(board, Player.SCHWARZ)); + } + +} diff --git a/src/main/java/de/kintel/ki/algorithm/KI.java b/src/main/java/de/kintel/ki/algorithm/KI.java index 32637a4..5b281bf 100644 --- a/src/main/java/de/kintel/ki/algorithm/KI.java +++ b/src/main/java/de/kintel/ki/algorithm/KI.java @@ -12,10 +12,10 @@ import de.kintel.ki.model.Player; import de.kintel.ki.util.BoardUtils; import fr.avianey.minimax4j.impl.ParallelNegamax; +import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; import java.io.IOException; import java.io.Serializable; import java.util.List; @@ -34,7 +34,7 @@ public class KI extends ParallelNegamax implements Serializable { private Player currentPlayer; private MoveClassifier moveClassifier; - public KI(@Nonnull MoveClassifier moveClassifier, @Nonnull MoveMaker moveMaker, @Nonnull Weighting weighting, @Nonnull Board board) { + public KI(@NonNull MoveClassifier moveClassifier, @NonNull MoveMaker moveMaker, @NonNull Weighting weighting, @NonNull Board board) { this.moveMaker = moveMaker; this.weighting = weighting; this.board = board; @@ -60,7 +60,7 @@ public boolean isOver() { * @see #next() */ @Override - public void makeMove(@Nonnull Move move) { + public void makeMove(@NonNull Move move) { logger.debug("make move " + move); moveMaker.makeMove(move, board); next(); @@ -75,7 +75,7 @@ public void makeMove(@Nonnull Move move) { * @see #previous() */ @Override - public void unmakeMove(@Nonnull Move move) { + public void unmakeMove(@NonNull Move move) { logger.debug("unmake move " + move); moveMaker.undoMove(move, board); previous(); diff --git a/src/main/java/de/kintel/ki/algorithm/MoveMaker.java b/src/main/java/de/kintel/ki/algorithm/MoveMaker.java index 77e8488..453a8b7 100644 --- a/src/main/java/de/kintel/ki/algorithm/MoveMaker.java +++ b/src/main/java/de/kintel/ki/algorithm/MoveMaker.java @@ -8,19 +8,18 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Move; - -import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.NonNull; public interface MoveMaker { /** * Make a move. * @param move the move */ - void makeMove(@Nonnull Move move, Board board); + void makeMove(@NonNull Move move, Board board); /** * Undo a move. * @param move the move */ - void undoMove(@Nonnull Move move, Board board); + void undoMove(@NonNull Move move, Board board); } diff --git a/src/main/java/de/kintel/ki/algorithm/MoveMakerGuardDecorator.java b/src/main/java/de/kintel/ki/algorithm/MoveMakerGuardDecorator.java index 9cfca61..ad707a8 100644 --- a/src/main/java/de/kintel/ki/algorithm/MoveMakerGuardDecorator.java +++ b/src/main/java/de/kintel/ki/algorithm/MoveMakerGuardDecorator.java @@ -8,6 +8,7 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Move; +import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +16,6 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; import java.util.HashMap; /** @@ -41,13 +41,13 @@ public MoveMakerGuardDecorator(@Qualifier("moveMakerBasic") MoveMaker moveMakerB } @Override - public void makeMove(@Nonnull Move move, Board board) { + public void makeMove(@NonNull Move move, Board board) { guard.put(move, board.toString()); moveMaker.makeMove(move, board); } @Override - public void undoMove(@Nonnull Move move, Board board) { + public void undoMove(@NonNull Move move, Board board) { moveMaker.undoMove(move, board); final String expected = guard.get(move); final String actual = board.toString(); diff --git a/src/main/java/de/kintel/ki/algorithm/MoveMakerImpl.java b/src/main/java/de/kintel/ki/algorithm/MoveMakerImpl.java index 304628f..941f3fc 100644 --- a/src/main/java/de/kintel/ki/algorithm/MoveMakerImpl.java +++ b/src/main/java/de/kintel/ki/algorithm/MoveMakerImpl.java @@ -7,6 +7,7 @@ package de.kintel.ki.algorithm; import de.kintel.ki.model.*; +import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -14,7 +15,6 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; import java.util.Iterator; import java.util.Optional; @@ -38,7 +38,7 @@ public MoveMakerImpl(RankMaker rankMaker) { * @param move the move */ @Override - public void makeMove(@Nonnull final Move move, Board board) { + public void makeMove(@NonNull final Move move, Board board) { doMove(move, board, false); } @@ -48,7 +48,7 @@ public void makeMove(@Nonnull final Move move, Board board) { * @param move the move */ @Override - public void undoMove(@Nonnull final Move move, Board board) { + public void undoMove(@NonNull final Move move, Board board) { doMove(move, board, true); } diff --git a/src/main/java/de/kintel/ki/algorithm/PathFinder.java b/src/main/java/de/kintel/ki/algorithm/PathFinder.java index 339665b..b9d5f32 100644 --- a/src/main/java/de/kintel/ki/algorithm/PathFinder.java +++ b/src/main/java/de/kintel/ki/algorithm/PathFinder.java @@ -6,13 +6,18 @@ package de.kintel.ki.algorithm; -import de.kintel.ki.model.*; +import de.kintel.ki.model.Board; +import de.kintel.ki.model.Coordinate2D; +import de.kintel.ki.model.Move; import de.kintel.ki.util.BoardUtils; +import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; -import java.util.*; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.LinkedList; +import java.util.List; /** * Finds path on grid. @@ -21,7 +26,7 @@ public class PathFinder { private static Logger logger = LoggerFactory.getLogger(PathFinder.class); - public static Deque find(@Nonnull final Move move, Board board) { + public static Deque find(@NonNull final Move move, Board board) { return calcPath(board, move.getSourceCoordinate(), move.getTargetCoordinate(), new ArrayDeque<>()); } @@ -35,7 +40,7 @@ public static Deque find(@Nonnull final Move move, Board board) { * @param path The path coordTo add the fields gradually * @return the path coordTo the target field */ - private static Deque calcPath(@Nonnull final Board board, @Nonnull final Coordinate2D coordFrom, @Nonnull final Coordinate2D coordTo, @Nonnull final Deque path) { + private static Deque calcPath(@NonNull final Board board, @NonNull final Coordinate2D coordFrom, @NonNull final Coordinate2D coordTo, @NonNull final Deque path) { logger.debug("Try coordTo find path coordFrom {}({}) coordTo {}({})", board.getField(coordFrom), coordFrom, board.getField(coordTo),coordTo); diff --git a/src/main/java/de/kintel/ki/algorithm/Weighting.java b/src/main/java/de/kintel/ki/algorithm/Weighting.java index a133f5c..3eb29ad 100644 --- a/src/main/java/de/kintel/ki/algorithm/Weighting.java +++ b/src/main/java/de/kintel/ki/algorithm/Weighting.java @@ -8,8 +8,7 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Player; - -import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.NonNull; public interface Weighting { /** @@ -20,7 +19,7 @@ public interface Weighting { * @see #maxEvaluateValue() * @param board the board */ - double evaluate(@Nonnull Board board, @Nonnull Player currentPlayer); + double evaluate(@NonNull Board board, @NonNull Player currentPlayer); /** * The absolute maximal value for the evaluate function. diff --git a/src/main/java/de/kintel/ki/algorithm/WeightingDummyImpl.java b/src/main/java/de/kintel/ki/algorithm/WeightingDummyImpl.java index 870f01d..06f9338 100644 --- a/src/main/java/de/kintel/ki/algorithm/WeightingDummyImpl.java +++ b/src/main/java/de/kintel/ki/algorithm/WeightingDummyImpl.java @@ -8,10 +8,10 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Player; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; import java.util.concurrent.ThreadLocalRandom; /** @@ -34,7 +34,7 @@ public class WeightingDummyImpl implements Weighting { * @param board the board */ @Override - public double evaluate(@Nonnull final Board board, @Nonnull final Player currentPlayer) { + public double evaluate(@NonNull final Board board, @NonNull final Player currentPlayer) { // Create random in interval [MIN,MAX] int eval = ThreadLocalRandom.current().nextInt(MIN, MAX + 1); return eval; diff --git a/src/main/java/de/kintel/ki/algorithm/WeightingHeightAndRank.java b/src/main/java/de/kintel/ki/algorithm/WeightingHeightAndRank.java index c253ed0..c4b01cd 100644 --- a/src/main/java/de/kintel/ki/algorithm/WeightingHeightAndRank.java +++ b/src/main/java/de/kintel/ki/algorithm/WeightingHeightAndRank.java @@ -8,11 +8,11 @@ import de.kintel.ki.model.*; import de.kintel.ki.util.BoardUtils; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; import java.util.Iterator; import java.util.List; import java.util.Optional; @@ -37,7 +37,7 @@ public WeightingHeightAndRank(MoveClassifier moveClassifier) { * @see #maxEvaluateValue() */ @Override - public double evaluate(@Nonnull Board board, @Nonnull Player currentPlayer) { + public double evaluate(@NonNull Board board, @NonNull Player currentPlayer) { Player opponentPlayer = (currentPlayer == Player.SCHWARZ) ? Player.WEISS : Player.SCHWARZ; final List coordsOccupiedBy = board.getCoordinatesOccupiedBy(currentPlayer); diff --git a/src/main/java/de/kintel/ki/algorithm/WeightingHumanHard.java b/src/main/java/de/kintel/ki/algorithm/WeightingHumanHard.java index 67b44b1..186a8b1 100644 --- a/src/main/java/de/kintel/ki/algorithm/WeightingHumanHard.java +++ b/src/main/java/de/kintel/ki/algorithm/WeightingHumanHard.java @@ -10,11 +10,11 @@ import de.kintel.ki.model.Coordinate2D; import de.kintel.ki.model.Player; import de.kintel.ki.util.BoardUtils; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; import java.util.List; @Component @@ -37,7 +37,7 @@ public WeightingHumanHard(MoveClassifier moveClassifier) { * @see #maxEvaluateValue() */ @Override - public double evaluate(@Nonnull Board board, @Nonnull Player currentPlayer) { + public double evaluate(@NonNull Board board, @NonNull Player currentPlayer) { final List fieldsOccupiedBy = board.getCoordinatesOccupiedBy(currentPlayer); Player opponentPlayer = (currentPlayer == Player.WEISS) ? Player.SCHWARZ : Player.WEISS; diff --git a/src/main/java/de/kintel/ki/algorithm/WeigtingMagicFormular.java b/src/main/java/de/kintel/ki/algorithm/WeigtingMagicFormular.java index 0e1df33..4192f5b 100644 --- a/src/main/java/de/kintel/ki/algorithm/WeigtingMagicFormular.java +++ b/src/main/java/de/kintel/ki/algorithm/WeigtingMagicFormular.java @@ -9,12 +9,11 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Player; import de.kintel.ki.util.BoardUtils; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; - @Component @Qualifier("magicFormular") public class WeigtingMagicFormular implements Weighting { @@ -35,7 +34,7 @@ public WeigtingMagicFormular(MoveClassifier moveClassifier) { * @see #maxEvaluateValue() */ @Override - public double evaluate(@Nonnull Board board, @Nonnull Player currentPlayer) { + public double evaluate(@NonNull Board board, @NonNull Player currentPlayer) { Player opponentPlayer = (currentPlayer == Player.WEISS) ? Player.SCHWARZ : Player.WEISS; //int ownMoves = BoardUtils.getPossibleMoves(board, currentPlayer, moveClassifier).size(); diff --git a/src/main/java/de/kintel/ki/cli/Test.java b/src/main/java/de/kintel/ki/cli/Test.java index 6a23c70..e036a0b 100644 --- a/src/main/java/de/kintel/ki/cli/Test.java +++ b/src/main/java/de/kintel/ki/cli/Test.java @@ -12,7 +12,6 @@ import de.kintel.ki.model.Player; import de.kintel.ki.model.Rank; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; diff --git a/src/main/java/de/kintel/ki/gui/util/ArrowHead.java b/src/main/java/de/kintel/ki/gui/util/ArrowHead.java index 0224391..456ca91 100644 --- a/src/main/java/de/kintel/ki/gui/util/ArrowHead.java +++ b/src/main/java/de/kintel/ki/gui/util/ArrowHead.java @@ -7,12 +7,7 @@ package de.kintel.ki.gui.util; import javafx.scene.paint.Color; -import javafx.scene.shape.ArcTo; -import javafx.scene.shape.ClosePath; -import javafx.scene.shape.LineTo; -import javafx.scene.shape.MoveTo; -import javafx.scene.shape.Path; -import javafx.scene.shape.StrokeType; +import javafx.scene.shape.*; import javafx.scene.transform.Rotate; /** diff --git a/src/main/java/de/kintel/ki/model/Board.java b/src/main/java/de/kintel/ki/model/Board.java index 8d916b1..4d6bf4d 100644 --- a/src/main/java/de/kintel/ki/model/Board.java +++ b/src/main/java/de/kintel/ki/model/Board.java @@ -8,10 +8,10 @@ import com.google.common.base.Preconditions; import org.apache.commons.lang3.SerializationUtils; +import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -30,7 +30,7 @@ public Board(final int height, final int width) { this(height, width, GridFactory.getLaskaInitGrid()); } - public Board(final int height, final int width, @Nonnull final Field[][] fields) { + public Board(final int height, final int width, @NonNull final Field[][] fields) { this.height = height; this.width = width; this.fields = fields; @@ -41,7 +41,7 @@ public Board(final int height, final int width, @Nonnull final Field[][] fields) * @param player the player to search for * @return all coordinates that are occupied by the specified player */ - public List getCoordinatesOccupiedBy(@Nonnull final Player player) { + public List getCoordinatesOccupiedBy(@NonNull final Player player) { final List fieldsCollector = new ArrayList<>(); for (int x = 0; x < height; x++) { @@ -84,7 +84,7 @@ public Field getField(int x, int y) { * @param coordinate2D the coordinate to retrieve * @return the field for the given coordinate. */ - public Field getField(@Nonnull final Coordinate2D coordinate2D) { + public Field getField(@NonNull final Coordinate2D coordinate2D) { return getField(coordinate2D.getX(), coordinate2D.getY()); } @@ -100,7 +100,7 @@ public Field[][] getFields() { return fields; } - public void setFields(@Nonnull final Field[][] fields) { + public void setFields(@NonNull final Field[][] fields) { this.fields = fields; } diff --git a/src/main/java/de/kintel/ki/model/Coordinate2D.java b/src/main/java/de/kintel/ki/model/Coordinate2D.java index 0d6e23c..43710fd 100644 --- a/src/main/java/de/kintel/ki/model/Coordinate2D.java +++ b/src/main/java/de/kintel/ki/model/Coordinate2D.java @@ -7,8 +7,8 @@ package de.kintel.ki.model; import com.google.common.base.Objects; +import org.eclipse.jdt.annotation.NonNull; -import javax.annotation.Nonnull; import java.io.Serializable; import java.util.Comparator; @@ -21,7 +21,7 @@ public class Coordinate2D implements Serializable { */ class DistanceToOrder implements Comparator { @Override - public int compare(@Nonnull final Coordinate2D e1, @Nonnull final Coordinate2D e2) { + public int compare(@NonNull final Coordinate2D e1, @NonNull final Coordinate2D e2) { int dist1 = distanceSquaredTo(e1); int dist2 = distanceSquaredTo(e2); return Integer.compare(dist1, dist2); @@ -50,7 +50,7 @@ public Coordinate2D(int x, int y) { * @param that the other point * @return the square of the Euclidean distance between this point and that point */ - public int distanceSquaredTo(@Nonnull final Coordinate2D that) { + public int distanceSquaredTo(@NonNull final Coordinate2D that) { int dx = this.x - that.x; int dy = this.y - that.y; return dx*dx + dy*dy; diff --git a/src/main/java/de/kintel/ki/model/Field.java b/src/main/java/de/kintel/ki/model/Field.java index 5dc5d2e..31cf7ad 100644 --- a/src/main/java/de/kintel/ki/model/Field.java +++ b/src/main/java/de/kintel/ki/model/Field.java @@ -6,9 +6,9 @@ package de.kintel.ki.model; +import org.eclipse.jdt.annotation.NonNull; import org.fusesource.jansi.Ansi; -import javax.annotation.Nonnull; import java.io.Serializable; import java.util.Deque; import java.util.LinkedList; @@ -39,7 +39,7 @@ public Field(boolean isForbidden) { /** * Pushes an element onto the top of this field. */ - public void addStein(@Nonnull final Piece s) { + public void addStein(@NonNull final Piece s) { pieces.push(s); } diff --git a/src/main/java/de/kintel/ki/model/Piece.java b/src/main/java/de/kintel/ki/model/Piece.java index ffd6b24..474a70b 100644 --- a/src/main/java/de/kintel/ki/model/Piece.java +++ b/src/main/java/de/kintel/ki/model/Piece.java @@ -8,9 +8,9 @@ import com.google.common.base.Preconditions; import de.kintel.ki.algorithm.MoveClassifier; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.io.Serializable; import java.util.Objects; @@ -23,7 +23,7 @@ public class Piece implements Serializable { private Player owner; private Rank rank; - public Piece(@Nonnull final Player owner) { + public Piece(@NonNull final Player owner) { this.owner = owner; this.rank = Rank.normal; } diff --git a/src/main/java/de/kintel/ki/model/UMLMove.java b/src/main/java/de/kintel/ki/model/UMLMove.java index b8a577d..52d04c6 100644 --- a/src/main/java/de/kintel/ki/model/UMLMove.java +++ b/src/main/java/de/kintel/ki/model/UMLMove.java @@ -8,10 +8,10 @@ import com.google.common.base.MoreObjects; import de.kintel.ki.algorithm.MoveClassifier; +import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; import java.io.Serializable; import java.util.Objects; import java.util.Optional; @@ -32,7 +32,7 @@ public class UMLMove extends Move implements Serializable { private Optional forwardOpponentRank; //save the rank of the opponent piece, if the move was a capture (needed for undoing) private Rank forwardSourceRank; //save the rank of the player piece (needed for undoing) - public UMLMove(@Nonnull Coordinate2D from, @Nonnull Coordinate2D to, @Nonnull Player currentPlayer) { + public UMLMove(@NonNull Coordinate2D from, @NonNull Coordinate2D to, @NonNull Player currentPlayer) { uuid = UUID.randomUUID(); this.from = from; this.to = to; diff --git a/src/main/java/de/kintel/ki/ruleset/IRule.java b/src/main/java/de/kintel/ki/ruleset/IRule.java index e0db3ff..ec00bd5 100644 --- a/src/main/java/de/kintel/ki/ruleset/IRule.java +++ b/src/main/java/de/kintel/ki/ruleset/IRule.java @@ -8,10 +8,9 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Move; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.core.Ordered; -import javax.annotation.Nonnull; - public interface IRule extends Ordered { /** * Check if the move is a valid move on the current board. This means it does not violate the rule in any matter. @@ -19,5 +18,5 @@ public interface IRule extends Ordered { * @param board the board to check against * @return true if valid, false otherwise */ - boolean isValidMove(@Nonnull Move move, Board board); + boolean isValidMove(@NonNull Move move, Board board); } diff --git a/src/main/java/de/kintel/ki/ruleset/IRulesChecker.java b/src/main/java/de/kintel/ki/ruleset/IRulesChecker.java index f58ab86..04701a4 100644 --- a/src/main/java/de/kintel/ki/ruleset/IRulesChecker.java +++ b/src/main/java/de/kintel/ki/ruleset/IRulesChecker.java @@ -8,8 +8,7 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Move; - -import javax.annotation.Nonnull; +import org.eclipse.jdt.annotation.NonNull; public interface IRulesChecker { /** @@ -18,5 +17,5 @@ public interface IRulesChecker { * @param board the board to check against * @return true if valid, false otherwise */ - boolean isValidMove(@Nonnull final Move move, Board board); + boolean isValidMove(@NonNull final Move move, Board board); } diff --git a/src/main/java/de/kintel/ki/ruleset/RulesChecker.java b/src/main/java/de/kintel/ki/ruleset/RulesChecker.java index eb93a7c..a8d2487 100644 --- a/src/main/java/de/kintel/ki/ruleset/RulesChecker.java +++ b/src/main/java/de/kintel/ki/ruleset/RulesChecker.java @@ -8,11 +8,11 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Move; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; import java.util.List; @Component @@ -30,7 +30,7 @@ public RulesChecker(List rules) { * {@inheritDoc } */ @Override - public boolean isValidMove(@Nonnull final Move move, Board board) { + public boolean isValidMove(@NonNull final Move move, Board board) { for (IRule r : rules) { if (!r.isValidMove(move, board)) { return false; diff --git a/src/main/java/de/kintel/ki/ruleset/rules/RuleDestinationIsEmpty.java b/src/main/java/de/kintel/ki/ruleset/rules/RuleDestinationIsEmpty.java index c244170..128788a 100644 --- a/src/main/java/de/kintel/ki/ruleset/rules/RuleDestinationIsEmpty.java +++ b/src/main/java/de/kintel/ki/ruleset/rules/RuleDestinationIsEmpty.java @@ -9,11 +9,10 @@ import de.kintel.ki.model.Board; import de.kintel.ki.model.Move; import de.kintel.ki.ruleset.IRule; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; - @Component @Scope("singleton") public class RuleDestinationIsEmpty implements IRule { @@ -22,7 +21,7 @@ public class RuleDestinationIsEmpty implements IRule { * {@inheritDoc } */ @Override - public boolean isValidMove(@Nonnull final Move move, Board board) { + public boolean isValidMove(@NonNull final Move move, Board board) { return !board.getField(move.getTargetCoordinate()).peekHead().isPresent(); } diff --git a/src/main/java/de/kintel/ki/ruleset/rules/RuleDirection.java b/src/main/java/de/kintel/ki/ruleset/rules/RuleDirection.java index 3b0f7fd..16169a4 100644 --- a/src/main/java/de/kintel/ki/ruleset/rules/RuleDirection.java +++ b/src/main/java/de/kintel/ki/ruleset/rules/RuleDirection.java @@ -12,10 +12,10 @@ import de.kintel.ki.model.Piece; import de.kintel.ki.model.Rank; import de.kintel.ki.ruleset.IRule; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; import java.util.Optional; @@ -27,7 +27,7 @@ public class RuleDirection implements IRule { * {@inheritDoc } */ @Override - public boolean isValidMove(@Nonnull final Move move, Board board) { + public boolean isValidMove(@NonNull final Move move, Board board) { final boolean isForward = move.isForward(); final MoveClassifier.MoveType moveType = move.getForwardClassification(); final Optional steinOpt = board.getField(move.getSourceCoordinate()).peekHead(); diff --git a/src/main/java/de/kintel/ki/ruleset/rules/RuleDistanceAndOpponent.java b/src/main/java/de/kintel/ki/ruleset/rules/RuleDistanceAndOpponent.java index beae084..e3d1319 100644 --- a/src/main/java/de/kintel/ki/ruleset/rules/RuleDistanceAndOpponent.java +++ b/src/main/java/de/kintel/ki/ruleset/rules/RuleDistanceAndOpponent.java @@ -11,11 +11,10 @@ import de.kintel.ki.model.Move; import de.kintel.ki.model.Player; import de.kintel.ki.ruleset.IRule; +import org.eclipse.jdt.annotation.NonNull; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; -import javax.annotation.Nonnull; - @Component @Scope("singleton") public class RuleDistanceAndOpponent implements IRule { @@ -24,7 +23,7 @@ public class RuleDistanceAndOpponent implements IRule { * {@inheritDoc } */ @Override - public boolean isValidMove(@Nonnull Move move, Board board) { + public boolean isValidMove(@NonNull Move move, Board board) { int squaredDistance = move.getSourceCoordinate().distanceSquaredTo(move.getTargetCoordinate()); if(squaredDistance>8){ diff --git a/src/main/java/de/kintel/ki/util/BoardUtils.java b/src/main/java/de/kintel/ki/util/BoardUtils.java index 295d2d8..5ffec1a 100644 --- a/src/main/java/de/kintel/ki/util/BoardUtils.java +++ b/src/main/java/de/kintel/ki/util/BoardUtils.java @@ -8,10 +8,10 @@ import de.kintel.ki.algorithm.MoveClassifier; import de.kintel.ki.model.*; +import org.eclipse.jdt.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -36,7 +36,7 @@ private BoardUtils() {} * @param radius radius of fields to search * @return the surrounding fields in diagonal */ - public static List getDiagonalSurroundings(@Nonnull final Board board, @Nonnull final Coordinate2D coordFrom, int radius) { + public static List getDiagonalSurroundings(@NonNull final Board board, @NonNull final Coordinate2D coordFrom, int radius) { int[][] directions = new int[][]{{-1, -1}, {-1, 1}, {1, 1}, {1, -1}}; int x = coordFrom.getX(); int y = coordFrom.getY(); @@ -66,7 +66,7 @@ public static List getDiagonalSurroundings(@Nonnull final Board bo * @param moveClassifier the moveClassifier * @return List of possible moves */ - public static List getPossibleMoves(@Nonnull Board board, @Nonnull Player currentPlayer, @Nonnull MoveClassifier moveClassifier) { + public static List getPossibleMoves(@NonNull Board board, @NonNull Player currentPlayer, @NonNull MoveClassifier moveClassifier) { final List possibleMoves; // Moves the user must do final List zugzwaenge = new ArrayList<>();