commit 335a7ef3a73f63ae8fa49fcb05e4d62d8843936e
parent 227e07fc124ee5e5216096469c90243108822ea7
Author: Michael Neuper <michaelneuper@icloud.com>
Date: Thu, 27 Apr 2023 21:11:52 +0200
Merge pull request #17 from michaelneuper/statistics-gui
Statistics gui
Diffstat:
10 files changed, 1075 insertions(+), 283 deletions(-)
diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml
@@ -19,7 +19,7 @@ is divided into following sections:
- cleanup
-->
-<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="librejack-impl">
+<project xmlns:if="ant:if" xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" xmlns:unless="ant:unless" basedir=".." default="default" name="librejack-impl">
<fail message="Please build using Ant 1.8.0 or higher.">
<condition>
<not>
@@ -46,14 +46,79 @@ is divided into following sections:
<property file="${user.properties.file}"/>
<!-- The two properties below are usually overridden -->
<!-- by the active platform. Just a fallback. -->
- <property name="default.javac.source" value="1.6"/>
- <property name="default.javac.target" value="1.6"/>
+ <property name="default.javac.source" value="1.8"/>
+ <property name="default.javac.target" value="1.8"/>
</target>
<target depends="-pre-init,-init-private,-init-user" name="-init-project">
<property file="nbproject/configs/${config}.properties"/>
<property file="nbproject/project.properties"/>
</target>
- <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+ <target name="-init-modules-supported">
+ <condition property="modules.supported.internal" value="true">
+ <not>
+ <matches pattern="1\.[0-8](\..*)?" string="${javac.source}"/>
+ </not>
+ </condition>
+ </target>
+ <target depends="-init-modules-supported" if="modules.supported.internal" name="-init-macrodef-modulename">
+ <macrodef name="modulename" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute name="property"/>
+ <attribute name="sourcepath"/>
+ <sequential>
+ <loadresource property="@{property}" quiet="true">
+ <javaresource classpath="@{sourcepath}" name="module-info.java" parentFirst="false"/>
+ <filterchain>
+ <stripjavacomments/>
+ <linecontainsregexp>
+ <regexp pattern="module .* \{"/>
+ </linecontainsregexp>
+ <tokenfilter>
+ <linetokenizer/>
+ <replaceregex flags="s" pattern="(\s*module\s+)(\S*)(\s*\{.*)" replace="\2"/>
+ </tokenfilter>
+ <striplinebreaks/>
+ </filterchain>
+ </loadresource>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-modules-supported,-init-macrodef-modulename" if="modules.supported.internal" name="-init-source-module-properties">
+ <fail message="Java 9 support requires Ant 1.10.0 or higher.">
+ <condition>
+ <not>
+ <antversion atleast="1.10.0"/>
+ </not>
+ </condition>
+ </fail>
+ <j2seproject3:modulename property="module.name" sourcepath="${src.dir}"/>
+ <condition property="named.module.internal">
+ <and>
+ <isset property="module.name"/>
+ <length length="0" string="${module.name}" when="greater"/>
+ </and>
+ </condition>
+ <condition property="unnamed.module.internal">
+ <not>
+ <isset property="named.module.internal"/>
+ </not>
+ </condition>
+ <property name="javac.modulepath" value=""/>
+ <property name="run.modulepath" value="${javac.modulepath}"/>
+ <property name="module.build.classes.dir" value="${build.classes.dir}"/>
+ <property name="debug.modulepath" value="${run.modulepath}"/>
+ <property name="javac.upgrademodulepath" value=""/>
+ <property name="run.upgrademodulepath" value="${javac.upgrademodulepath}"/>
+ <condition else="" property="javac.systemmodulepath.cmd.line.arg" value="--system '${javac.systemmodulepath}'">
+ <and>
+ <isset property="javac.systemmodulepath"/>
+ <length length="0" string="${javac.systemmodulepath}" when="greater"/>
+ </and>
+ </condition>
+ <property name="dist.jlink.dir" value="${dist.dir}/jlink"/>
+ <property name="dist.jlink.output" value="${dist.jlink.dir}/${application.title}"/>
+ <property name="module.name" value=""/>
+ </target>
+ <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property,-init-modules-supported" name="-do-init">
<property name="platform.java" value="${java.home}/bin/java"/>
<available file="${manifest.file}" property="manifest.available"/>
<condition property="splashscreen.available">
@@ -76,7 +141,9 @@ is divided into following sections:
<and>
<isset property="javac.profile"/>
<length length="0" string="${javac.profile}" when="greater"/>
- <matches pattern="((1\.[89])|9)(\..*)?" string="${javac.source}"/>
+ <not>
+ <matches pattern="1\.[0-7](\..*)?" string="${javac.source}"/>
+ </not>
</and>
</condition>
<condition property="do.archive">
@@ -87,15 +154,6 @@ is divided into following sections:
<istrue value="${not.archive.disabled}"/>
</or>
</condition>
- <condition property="do.mkdist">
- <and>
- <isset property="do.archive"/>
- <isset property="libs.CopyLibs.classpath"/>
- <not>
- <istrue value="${mkdist.disabled}"/>
- </not>
- </and>
- </condition>
<condition property="do.archive+manifest.available">
<and>
<isset property="manifest.available"/>
@@ -250,11 +308,80 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
- <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+ <target depends="-init-ap-cmdline-properties,-init-source-module-properties" if="modules.supported.internal" name="-init-macrodef-javac-with-module">
+ <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${src.dir}" name="srcdir"/>
+ <attribute default="${build.classes.dir}" name="destdir"/>
+ <attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.modulepath}" name="modulepath"/>
+ <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
+ <attribute default="${javac.processorpath}" name="processorpath"/>
+ <attribute default="${javac.processormodulepath}" name="processormodulepath"/>
+ <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="${javac.debug}" name="debug"/>
+ <attribute default="${empty.dir}" name="sourcepath" unless:set="named.module.internal"/>
+ <attribute default="${src.dir}" if:set="named.module.internal" name="sourcepath"/>
+ <attribute default="${empty.dir}" name="gensrcdir"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <condition property="warn.excludes.internal">
+ <and>
+ <isset property="named.module.internal"/>
+ <length length="0" string="@{excludes}" trim="true" when="greater"/>
+ </and>
+ </condition>
+ <echo if:set="warn.excludes.internal" level="warning" message="The javac excludes are not supported in the JDK 9 Named Module."/>
+ <property location="${build.dir}/empty" name="empty.dir"/>
+ <mkdir dir="${empty.dir}"/>
+ <mkdir dir="@{apgeneratedsrcdir}"/>
+ <condition property="processormodulepath.set">
+ <resourcecount count="0" when="greater">
+ <path>
+ <pathelement path="@{processormodulepath}"/>
+ </path>
+ </resourcecount>
+ </condition>
+ <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+ <src>
+ <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+ <include name="*"/>
+ </dirset>
+ </src>
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <modulepath>
+ <path path="@{modulepath}"/>
+ </modulepath>
+ <upgrademodulepath>
+ <path path="@{upgrademodulepath}"/>
+ </upgrademodulepath>
+ <compilerarg line="${javac.systemmodulepath.cmd.line.arg}"/>
+ <compilerarg line="${javac.profile.cmd.line.arg}"/>
+ <compilerarg line="${javac.compilerargs}"/>
+ <compilerarg if:set="processormodulepath.set" value="--processor-module-path"/>
+ <compilerarg if:set="processormodulepath.set" path="@{processormodulepath}"/>
+ <compilerarg unless:set="processormodulepath.set" value="-processorpath"/>
+ <compilerarg path="@{processorpath}:${empty.dir}" unless:set="processormodulepath.set"/>
+ <compilerarg line="${ap.processors.internal}"/>
+ <compilerarg line="${annotation.processing.processor.options}"/>
+ <compilerarg value="-s"/>
+ <compilerarg path="@{apgeneratedsrcdir}"/>
+ <compilerarg line="${ap.proc.none.internal}"/>
+ <customize/>
+ </javac>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-ap-cmdline-properties,-init-source-module-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors" unless="modules.supported.internal">
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
<attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.modulepath}" name="modulepath"/>
+ <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
<attribute default="${javac.processorpath}" name="processorpath"/>
<attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
<attribute default="${includes}" name="includes"/>
@@ -291,11 +418,13 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
- <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+ <target depends="-init-ap-cmdline-properties,-init-source-module-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
<attribute default="${javac.classpath}" name="classpath"/>
+ <attribute default="${javac.modulepath}" name="modulepath"/>
+ <attribute default="${javac.upgrademodulepath}" name="upgrademodulepath"/>
<attribute default="${javac.processorpath}" name="processorpath"/>
<attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
<attribute default="${includes}" name="includes"/>
@@ -324,7 +453,7 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
- <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+ <target depends="-init-macrodef-javac-with-module,-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
<macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${src.dir}" name="srcdir"/>
<attribute default="${build.classes.dir}" name="destdir"/>
@@ -379,59 +508,99 @@ is divided into following sections:
<property name="test.binarytestincludes" value=""/>
<property name="test.binaryexcludes" value=""/>
</target>
- <target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
- <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <target depends="-init-modules-supported" if="modules.supported.internal" name="-init-macrodef-junit-prototype-with-module">
+ <macrodef name="junit-prototype" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
+ <element name="customizePrototype" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <modulepath>
+ <path path="${run.test.modulepath}"/>
+ </modulepath>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg value="-ea"/>
- <customize/>
+ <jvmarg line="${run.test.jvmargs}"/>
+ <customizePrototype/>
</junit>
</sequential>
</macrodef>
</target>
- <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
- <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <target depends="-init-modules-supported" name="-init-macrodef-junit-prototype-without-module" unless="modules.supported.internal">
+ <macrodef name="junit-prototype" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
+ <element name="customizePrototype" optional="true"/>
<sequential>
<property name="junit.forkmode" value="perTest"/>
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <batchtest todir="${build.test.results.dir}">
- <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
- <filename name="${test.binarytestincludes}"/>
- </fileset>
- </batchtest>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</syspropertyset>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
<formatter type="brief" usefile="false"/>
<formatter type="xml"/>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg value="-ea"/>
- <customize/>
+ <customizePrototype/>
</junit>
</sequential>
</macrodef>
</target>
+ <target depends="-init-test-properties,-init-macrodef-junit-prototype-with-module,-init-macrodef-junit-prototype-without-module" if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <attribute default="" name="testmethods"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <j2seproject3:junit-prototype>
+ <customizePrototype>
+ <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+ <customize/>
+ </customizePrototype>
+ </j2seproject3:junit-prototype>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-test-properties,-init-macrodef-junit-prototype-with-module,-init-macrodef-junit-prototype-without-module" if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
+ <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${includes}" name="includes"/>
+ <attribute default="${excludes}" name="excludes"/>
+ <attribute default="**" name="testincludes"/>
+ <attribute default="" name="testmethods"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <j2seproject3:junit-prototype>
+ <customizePrototype>
+ <batchtest todir="${build.test.results.dir}">
+ <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+ <filename name="@{testincludes}"/>
+ </fileset>
+ <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
+ <filename name="${test.binarytestincludes}"/>
+ </fileset>
+ </batchtest>
+ <customize/>
+ </customizePrototype>
+ </j2seproject3:junit-prototype>
+ </sequential>
+ </macrodef>
+ </target>
<target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
<target if="${testng.available}" name="-init-macrodef-testng">
<macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
@@ -456,6 +625,10 @@ is divided into following sections:
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
</propertyset>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<customize/>
</testng>
</sequential>
@@ -510,10 +683,6 @@ is divided into following sections:
<sequential>
<j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
<customize>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
</customize>
@@ -521,74 +690,20 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
- <target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
- <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-test-properties" if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
- <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
- <attribute default="${includes}" name="includes"/>
- <attribute default="${excludes}" name="excludes"/>
- <attribute default="**" name="testincludes"/>
- <attribute default="" name="testmethods"/>
- <element name="customize" optional="true"/>
- <sequential>
- <property name="junit.forkmode" value="perTest"/>
- <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}">
- <batchtest todir="${build.test.results.dir}">
- <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
- <filename name="@{testincludes}"/>
- </fileset>
- <fileset dir="${build.test.classes.dir}" excludes="@{excludes},${excludes},${test.binaryexcludes}" includes="${test.binaryincludes}">
- <filename name="${test.binarytestincludes}"/>
- </fileset>
- </batchtest>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- <jvmarg value="-ea"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
- <customize/>
- </junit>
- </sequential>
- </macrodef>
- </target>
- <target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
+ <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
<macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="**" name="testincludes"/>
<attribute default="" name="testmethods"/>
- <element implicit="true" name="customize" optional="true"/>
+ <element name="customizeDebuggee" optional="true"/>
<sequential>
- <j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize/>
- </j2seproject3:junit-debug>
+ <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+ <customize>
+ <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
+ <customizeDebuggee/>
+ </customize>
+ </j2seproject3:junit>
</sequential>
</macrodef>
</target>
@@ -607,14 +722,14 @@ is divided into following sections:
<delete dir="${build.test.results.dir}" quiet="true"/>
<mkdir dir="${build.test.results.dir}"/>
<j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
- <customize>
+ <customizeDebuggee>
<customize2/>
<jvmarg value="-ea"/>
<arg line="${testng.debug.mode}"/>
<arg line="-d ${build.test.results.dir}"/>
<arg line="-listener org.testng.reporters.VerboseReporter"/>
<arg line="${testng.cmd.args}"/>
- </customize>
+ </customizeDebuggee>
</j2seproject3:debug>
</sequential>
</macrodef>
@@ -641,14 +756,10 @@ is divided into following sections:
<attribute default="" name="testMethod"/>
<sequential>
<j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
- <customize>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+ <customizeDebuggee>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
- </customize>
+ </customizeDebuggee>
</j2seproject3:test-debug-impl>
</sequential>
</macrodef>
@@ -728,10 +839,14 @@ is divided into following sections:
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/>
+ <attribute default="${debug.modulepath}" name="modulepath"/>
<attribute default="${debug.classpath}" name="classpath"/>
<attribute default="" name="stopclassname"/>
<sequential>
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+ <modulepath>
+ <path path="@{modulepath}"/>
+ </modulepath>
<classpath>
<path path="@{classpath}"/>
</classpath>
@@ -750,18 +865,6 @@ is divided into following sections:
</macrodef>
</target>
<target name="-init-debug-args">
- <property name="version-output" value="java version "${ant.java.version}"/>
- <condition property="have-jdk-older-than-1.4">
- <or>
- <contains string="${version-output}" substring="java version "1.0"/>
- <contains string="${version-output}" substring="java version "1.1"/>
- <contains string="${version-output}" substring="java version "1.2"/>
- <contains string="${version-output}" substring="java version "1.3"/>
- </or>
- </condition>
- <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
- <istrue value="${have-jdk-older-than-1.4}"/>
- </condition>
<condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
<os family="windows"/>
</condition>
@@ -771,21 +874,79 @@ is divided into following sections:
</target>
<target depends="-init-debug-args" name="-init-macrodef-debug">
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+ <attribute default="${module.name}" name="modulename"/>
<attribute default="${main.class}" name="classname"/>
+ <attribute default="${debug.modulepath}" name="modulepath"/>
<attribute default="${debug.classpath}" name="classpath"/>
+ <element name="customizeDebuggee" optional="true"/>
+ <sequential>
+ <j2seproject1:java classname="@{classname}" classpath="@{classpath}" modulename="@{modulename}" modulepath="@{modulepath}">
+ <customize>
+ <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
+ <customizeDebuggee/>
+ </customize>
+ </j2seproject1:java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-source-module-properties" if="named.module.internal" name="-init-macrodef-java-with-module">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="${module.name}" name="modulename"/>
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.modulepath}" name="modulepath"/>
+ <attribute default="${run.upgrademodulepath}" name="upgrademodulepath"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <attribute default="jvm" name="jvm"/>
<element name="customize" optional="true"/>
<sequential>
- <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
- <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
- <jvmarg line="${debug-args-line}"/>
- <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+ <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true" module="@{modulename}">
+ <classpath>
+ <path path="@{classpath}"/>
+ </classpath>
+ <modulepath>
+ <pathelement path="@{modulepath}"/>
+ <pathelement location="${module.build.classes.dir}"/>
+ </modulepath>
+ <upgrademodulepath>
+ <path path="@{upgrademodulepath}"/>
+ </upgrademodulepath>
<jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
<redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
<jvmarg line="${run.jvmargs}"/>
<jvmarg line="${run.jvmargs.ide}"/>
+ <syspropertyset>
+ <propertyref prefix="run-sys-prop."/>
+ <mapper from="run-sys-prop.*" to="*" type="glob"/>
+ </syspropertyset>
+ <customize/>
+ </java>
+ </sequential>
+ </macrodef>
+ </target>
+ <target depends="-init-source-module-properties" if="unnamed.module.internal" name="-init-macrodef-java-with-unnamed-module">
+ <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="" name="modulename"/>
+ <attribute default="${main.class}" name="classname"/>
+ <attribute default="${run.modulepath}" name="modulepath"/>
+ <attribute default="${run.upgrademodulepath}" name="upgrademodulepath"/>
+ <attribute default="${run.classpath}" name="classpath"/>
+ <attribute default="jvm" name="jvm"/>
+ <element name="customize" optional="true"/>
+ <sequential>
+ <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true">
<classpath>
<path path="@{classpath}"/>
</classpath>
+ <modulepath>
+ <path path="@{modulepath}"/>
+ </modulepath>
+ <upgrademodulepath>
+ <path path="@{upgrademodulepath}"/>
+ </upgrademodulepath>
+ <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+ <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+ <jvmarg line="${run.jvmargs}"/>
+ <jvmarg line="${run.jvmargs.ide}"/>
<syspropertyset>
<propertyref prefix="run-sys-prop."/>
<mapper from="run-sys-prop.*" to="*" type="glob"/>
@@ -795,9 +956,11 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
- <target name="-init-macrodef-java">
+ <target depends="-init-source-module-properties" name="-init-macrodef-java-without-module" unless="modules.supported.internal">
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+ <attribute default="" name="modulename"/>
<attribute default="${main.class}" name="classname"/>
+ <attribute default="" name="modulepath"/>
<attribute default="${run.classpath}" name="classpath"/>
<attribute default="jvm" name="jvm"/>
<element name="customize" optional="true"/>
@@ -820,6 +983,7 @@ is divided into following sections:
</sequential>
</macrodef>
</target>
+ <target depends="-init-macrodef-java-with-module, -init-macrodef-java-with-unnamed-module, -init-macrodef-java-without-module" name="-init-macrodef-java"/>
<target name="-init-macrodef-copylibs">
<macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
<attribute default="${manifest.file}" name="manifest"/>
@@ -909,7 +1073,9 @@ is divided into following sections:
<available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
</target>
<target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
- <antcall target="clean"/>
+ <antcall target="clean">
+ <param name="no.dependencies" value="true"/>
+ </antcall>
</target>
<target depends="init,deps-jar" name="-pre-pre-compile">
<mkdir dir="${build.classes.dir}"/>
@@ -950,7 +1116,7 @@ is divided into following sections:
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile/>
- <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+ <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}, module-info.java" sourcepath="${src.dir}"/>
</target>
<target name="-post-compile-single">
<!-- Empty placeholder for easier customization. -->
@@ -970,6 +1136,25 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
+ <target depends="init,compile" name="-check-module-main-class">
+ <pathconvert property="main.class.file">
+ <string value="${main.class}"/>
+ <unpackagemapper from="*" to="*.class"/>
+ </pathconvert>
+ <condition property="do.module.main.class">
+ <and>
+ <isset property="main.class.available"/>
+ <available file="${build.classes.dir}/module-info.class"/>
+ <available file="${build.classes.dir}/${main.class.file}"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <available classname="org.netbeans.modules.java.j2seproject.moduletask.ModuleMainClass" classpath="${libs.CopyLibs.classpath}"/>
+ </and>
+ </condition>
+ </target>
+ <target depends="-check-module-main-class" if="do.module.main.class" name="-set-module-main-class">
+ <taskdef classname="org.netbeans.modules.java.j2seproject.moduletask.ModuleMainClass" classpath="${libs.CopyLibs.classpath}" name="modulemainclass"/>
+ <modulemainclass failonerror="false" mainclass="${main.class}" moduleinfo="${build.classes.dir}/module-info.class"/>
+ </target>
<target depends="init" if="do.archive" name="-do-jar-create-manifest" unless="manifest.available">
<tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
<touch file="${tmp.manifest.file}" verbose="false"/>
@@ -996,21 +1181,61 @@ is divided into following sections:
<attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
</manifest>
</target>
- <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.mkdist" name="-do-jar-copylibs">
+ <target depends="init,compile" name="-check-do-mkdist">
+ <condition property="do.mkdist">
+ <and>
+ <isset property="do.archive"/>
+ <isset property="libs.CopyLibs.classpath"/>
+ <not>
+ <istrue value="${mkdist.disabled}"/>
+ </not>
+ <not>
+ <available file="${build.classes.dir}/module-info.class"/>
+ </not>
+ </and>
+ </condition>
+ </target>
+ <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-check-do-mkdist" if="do.mkdist" name="-do-jar-copylibs">
<j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
<echo level="info">To run this application from the command line without Ant, try:</echo>
<property location="${dist.jar}" name="dist.jar.resolved"/>
<echo level="info">java -jar "${dist.jar.resolved}"</echo>
</target>
- <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
+ <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-create-manifest,-do-jar-copy-manifest,-do-jar-set-mainclass,-do-jar-set-profile,-do-jar-set-splashscreen,-check-do-mkdist" if="do.archive" name="-do-jar-jar" unless="do.mkdist">
<j2seproject1:jar manifest="${tmp.manifest.file}"/>
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
<property location="${dist.jar}" name="dist.jar.resolved"/>
+ <condition else="${dist.jar.resolved}" property="jar.usage.message.class.path.replacement" value="">
+ <isset property="named.module.internal"/>
+ </condition>
<pathconvert property="run.classpath.with.dist.jar">
<path path="${run.classpath}"/>
+ <map from="${build.classes.dir.resolved}" to="${jar.usage.message.class.path.replacement}"/>
+ </pathconvert>
+ <pathconvert property="run.modulepath.with.dist.jar">
+ <path location="${dist.jar.resolved}"/>
+ <path path="${run.modulepath}"/>
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
</pathconvert>
- <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java} -cp ${run.classpath.with.dist.jar} ${main.class}">
+ <condition else="${run.modulepath}" property="jar.usage.message.run.modulepath.with.dist.jar" value="${run.modulepath.with.dist.jar}">
+ <isset property="named.module.internal"/>
+ </condition>
+ <condition else="" property="jar.usage.message.module.path" value=" -p ${jar.usage.message.run.modulepath.with.dist.jar}">
+ <and>
+ <isset property="modules.supported.internal"/>
+ <length length="0" string="${jar.usage.message.run.modulepath.with.dist.jar}" when="greater"/>
+ </and>
+ </condition>
+ <condition else="" property="jar.usage.message.class.path" value=" -cp ${run.classpath.with.dist.jar}">
+ <length length="0" string="${run.classpath.with.dist.jar}" when="greater"/>
+ </condition>
+ <condition else="/${main.class}" property="jar.usage.message.main.class.class.selector" value="">
+ <isset property="do.module.main.class"/>
+ </condition>
+ <condition else=" ${main.class}" property="jar.usage.message.main.class" value=" -m ${module.name}${jar.usage.message.main.class.class.selector}">
+ <isset property="named.module.internal"/>
+ </condition>
+ <condition else="" property="jar.usage.message" value="To run this application from the command line without Ant, try:${line.separator}${platform.java}${jar.usage.message.module.path}${jar.usage.message.class.path}${jar.usage.message.main.class}">
<isset property="main.class.available"/>
</condition>
<condition else="debug" property="jar.usage.level" value="info">
@@ -1029,8 +1254,73 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
- <target depends="init,compile,-pre-jar,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
- <target depends="init,compile,-pre-jar,-do-jar,-post-jar" description="Build JAR." name="jar"/>
+ <target depends="init,compile,-pre-jar,-set-module-main-class,-do-jar-without-libraries,-do-jar-with-libraries,-post-jar" name="-do-jar"/>
+ <target depends="init,compile,-pre-jar,-do-jar,-post-jar,deploy" description="Build JAR." name="jar"/>
+ <!--
+ =================
+ DEPLOY SECTION
+ =================
+ -->
+ <target name="-pre-deploy">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="init" name="-check-jlink">
+ <condition property="do.jlink.internal">
+ <and>
+ <istrue value="${do.jlink}"/>
+ <isset property="do.archive"/>
+ <isset property="named.module.internal"/>
+ </and>
+ </condition>
+ </target>
+ <target depends="init,-do-jar,-post-jar,-pre-deploy,-check-jlink" if="do.jlink.internal" name="-do-deploy">
+ <delete dir="${dist.jlink.dir}" failonerror="false" quiet="true"/>
+ <property name="jlink.launcher.name" value="${application.title}"/>
+ <condition else="${module.name}" property="jlink.add.modules" value="${module.name},${jlink.additionalmodules}">
+ <and>
+ <isset property="jlink.additionalmodules"/>
+ <length length="0" string="${jlink.additionalmodules}" when="greater"/>
+ </and>
+ </condition>
+ <condition property="jlink.do.strip.internal">
+ <and>
+ <isset property="jlink.strip"/>
+ <istrue value="${jlink.strip}"/>
+ </and>
+ </condition>
+ <condition property="jlink.do.additionalparam.internal">
+ <and>
+ <isset property="jlink.additionalparam"/>
+ <length length="0" string="${jlink.additionalparam}" when="greater"/>
+ </and>
+ </condition>
+ <condition property="jlink.do.launcher.internal">
+ <and>
+ <istrue value="${jlink.launcher}"/>
+ <isset property="main.class.available"/>
+ </and>
+ </condition>
+ <property name="platform.jlink" value="${jdk.home}/bin/jlink"/>
+ <property name="jlink.systemmodules.internal" value="${jdk.home}/jmods"/>
+ <exec executable="${platform.jlink}">
+ <arg value="--module-path"/>
+ <arg path="${jlink.systemmodules.internal}:${run.modulepath}:${dist.jar}"/>
+ <arg value="--add-modules"/>
+ <arg value="${jlink.add.modules}"/>
+ <arg if:set="jlink.do.strip.internal" value="--strip-debug"/>
+ <arg if:set="jlink.do.launcher.internal" value="--launcher"/>
+ <arg if:set="jlink.do.launcher.internal" value="${jlink.launcher.name}=${module.name}/${main.class}"/>
+ <arg if:set="jlink.do.additionalparam.internal" line="${jlink.additionalparam}"/>
+ <arg value="--output"/>
+ <arg value="${dist.jlink.output}"/>
+ </exec>
+ </target>
+ <target name="-post-deploy">
+ <!-- Empty placeholder for easier customization. -->
+ <!-- You can override this target in the ../build.xml file. -->
+ </target>
+ <target depends="-do-jar,-post-jar,-pre-deploy,-do-deploy,-post-deploy" name="deploy"/>
<!--
=================
EXECUTION SECTION
@@ -1067,9 +1357,9 @@ is divided into following sections:
</target>
<target depends="init,compile" name="-debug-start-debuggee">
<j2seproject3:debug>
- <customize>
+ <customizeDebuggee>
<arg line="${application.args}"/>
- </customize>
+ </customizeDebuggee>
</j2seproject3:debug>
</target>
<target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
@@ -1135,28 +1425,24 @@ is divided into following sections:
</customize>
</profile>
</target>
- <target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
+ <target depends="-init-macrodef-junit,profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
<fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
<nbprofiledirect>
<classpath>
<path path="${run.test.classpath}"/>
</classpath>
</nbprofiledirect>
- <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
- <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
- <jvmarg value="${profiler.info.jvmargs.agent}"/>
- <jvmarg line="${profiler.info.jvmargs}"/>
- <test name="${profile.class}"/>
- <classpath>
- <path path="${run.test.classpath}"/>
- </classpath>
- <syspropertyset>
- <propertyref prefix="test-sys-prop."/>
- <mapper from="test-sys-prop.*" to="*" type="glob"/>
- </syspropertyset>
- <formatter type="brief" usefile="false"/>
- <formatter type="xml"/>
- </junit>
+ <j2seproject3:junit excludes="${excludes}" includes="${includes}" testincludes="${profile.class}" testmethods="">
+ <customize>
+ <jvmarg value="-agentlib:jdwp=transport=${debug-transport},address=${jpda.address}"/>
+ <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+ <jvmarg value="${profiler.info.jvmargs.agent}"/>
+ <jvmarg line="${profiler.info.jvmargs}"/>
+ <classpath>
+ <path path="${run.test.classpath}"/>
+ </classpath>
+ </customize>
+ </j2seproject3:junit>
</target>
<!--
end of pre NB72 profiling section
@@ -1212,6 +1498,12 @@ is divided into following sections:
<condition else="" property="bug5101868workaround" value="*.java">
<matches pattern="1\.[56](\..*)?" string="${java.version}"/>
</condition>
+ <condition else="" property="javadoc.html5.cmd.line.arg" value="-html5">
+ <and>
+ <isset property="javadoc.html5"/>
+ <available file="${jdk.home}${file.separator}lib${file.separator}jrt-fs.jar"/>
+ </and>
+ </condition>
<javadoc additionalparam="-J-Dfile.encoding=${file.encoding} ${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
<classpath>
<path path="${javac.classpath}"/>
@@ -1224,6 +1516,7 @@ is divided into following sections:
<exclude name="*.java"/>
</fileset>
<arg line="${javadoc.endorsed.classpath.cmd.line.arg}"/>
+ <arg line="${javadoc.html5.cmd.line.arg}"/>
</javadoc>
<copy todir="${dist.javadoc.dir}">
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
@@ -1250,11 +1543,63 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
+ <target depends="-init-source-module-properties" if="named.module.internal" name="-init-test-javac-module-properties-with-module">
+ <j2seproject3:modulename property="test.module.name" sourcepath="${test.src.dir}"/>
+ <condition else="${empty.dir}" property="javac.test.sourcepath" value="${test.src.dir}">
+ <and>
+ <isset property="test.module.name"/>
+ <length length="0" string="${test.module.name}" when="greater"/>
+ </and>
+ </condition>
+ <condition else="--patch-module ${module.name}=${test.src.dir} --add-reads ${module.name}=ALL-UNNAMED" property="javac.test.compilerargs" value="--add-reads ${test.module.name}=ALL-UNNAMED">
+ <and>
+ <isset property="test.module.name"/>
+ <length length="0" string="${test.module.name}" when="greater"/>
+ </and>
+ </condition>
+ </target>
+ <target depends="-init-source-module-properties" if="named.module.internal" name="-init-test-run-module-properties">
+ <condition else="${module.name}" property="run.test.addexport.source.module.internal" value="${test.module.name}">
+ <and>
+ <isset property="test.module.name"/>
+ <length length="0" string="${test.module.name}" when="greater"/>
+ </and>
+ </condition>
+ <fileset dir="${build.test.classes.dir}" id="run.test.packages.internal" includes="**/*.class"/>
+ <property location="${build.test.classes.dir}" name="build.test.classes.dir.abs.internal"/>
+ <pathconvert pathsep=" " property="run.test.addexports.internal" refid="run.test.packages.internal">
+ <chainedmapper>
+ <regexpmapper from="^(.*)\Q${file.separator}\E.*\.class$$" to="\1"/>
+ <filtermapper>
+ <uniqfilter/>
+ <replacestring from="${build.test.classes.dir.abs.internal}" to=""/>
+ </filtermapper>
+ <cutdirsmapper dirs="1"/>
+ <packagemapper from="*" to="--add-exports ${run.test.addexport.source.module.internal}/*=ALL-UNNAMED"/>
+ </chainedmapper>
+ </pathconvert>
+ <condition else="--patch-module ${module.name}=${build.test.classes.dir} --add-modules ${module.name} --add-reads ${module.name}=ALL-UNNAMED ${run.test.addexports.internal}" property="run.test.jvmargs" value="--add-modules ${test.module.name} --add-reads ${test.module.name}=ALL-UNNAMED ${run.test.addexports.internal}">
+ <and>
+ <isset property="test.module.name"/>
+ <length length="0" string="${test.module.name}" when="greater"/>
+ </and>
+ </condition>
+ </target>
+ <target depends="-init-source-module-properties" name="-init-test-module-properties-without-module" unless="named.module.internal">
+ <property name="javac.test.sourcepath" value="${empty.dir}"/>
+ <property name="javac.test.compilerargs" value=""/>
+ <property name="run.test.jvmargs" value=""/>
+ </target>
+ <target depends="-init-test-javac-module-properties-with-module,-init-test-module-properties-without-module" name="-init-test-module-properties"/>
<target if="do.depend.true" name="-compile-test-depend">
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
</target>
- <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
- <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+ <target depends="init,deps-jar,compile,-init-test-module-properties,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${javac.test.sourcepath}" srcdir="${test.src.dir}">
+ <customize>
+ <compilerarg line="${javac.test.compilerargs}"/>
+ </customize>
+ </j2seproject3:javac>
<copy todir="${build.test.classes.dir}">
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
</copy>
@@ -1268,10 +1613,14 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. -->
</target>
- <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+ <target depends="init,deps-jar,compile,-init-test-module-properties,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
- <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+ <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}, module-info.java" modulepath="${javac.test.modulepath}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}">
+ <customize>
+ <compilerarg line="${javac.test.compilerargs}"/>
+ </customize>
+ </j2seproject3:javac>
<copy todir="${build.test.classes.dir}">
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
</copy>
@@ -1289,7 +1638,7 @@ is divided into following sections:
<target depends="init" if="have.tests" name="-pre-test-run">
<mkdir dir="${build.test.results.dir}"/>
</target>
- <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+ <target depends="init,compile-test,-init-test-run-module-properties,-pre-test-run" if="have.tests" name="-do-test-run">
<j2seproject3:test includes="${includes}" testincludes="**/*Test.java"/>
</target>
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
@@ -1301,14 +1650,14 @@ is divided into following sections:
<target depends="init" if="have.tests" name="-pre-test-run-single">
<mkdir dir="${build.test.results.dir}"/>
</target>
- <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+ <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
<j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
</target>
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+ <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
<fail unless="test.class">Must select some files in the IDE or set test.class</fail>
<fail unless="test.method">Must select some method in the IDE or set test.method</fail>
@@ -1317,7 +1666,7 @@ is divided into following sections:
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
<fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
</target>
- <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
+ <target depends="init,compile-test-single,-init-test-run-module-properties,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
<!--
=======================
TEST DEBUGGING SECTION
@@ -1335,8 +1684,9 @@ is divided into following sections:
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
</target>
- <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
- <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
+ <target depends="init,compile-test-single,-init-test-run-module-properties,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+ <target depends="init,compile-test-single,-init-test-run-module-properties,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
+ <target depends="debug-test-method" name="debug-single-method"/>
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
</target>
@@ -1362,9 +1712,9 @@ is divided into following sections:
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
<j2seproject3:debug classname="sun.applet.AppletViewer">
- <customize>
+ <customizeDebuggee>
<arg value="${applet.url}"/>
- </customize>
+ </customizeDebuggee>
</j2seproject3:debug>
</target>
<target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
@@ -1391,6 +1741,7 @@ is divided into following sections:
</target>
<target depends="init" name="-do-clean">
<delete dir="${build.dir}"/>
+ <delete dir="${dist.jlink.output}"/>
<delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
</target>
<target name="-post-clean">
diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties
@@ -1,8 +1,8 @@
build.xml.data.CRC32=4cc620bd
build.xml.script.CRC32=b68ce127
-build.xml.stylesheet.CRC32=8064a381@1.80.1.48
+build.xml.stylesheet.CRC32=f85dc8f2@1.105.0.48
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=4cc620bd
-nbproject/build-impl.xml.script.CRC32=665f095a
-nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48
+nbproject/build-impl.xml.script.CRC32=537cf352
+nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.105.0.48
diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties
@@ -3,4 +3,4 @@ do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
-user.properties.file=/home/michael/.netbeans/8.2/build.properties
+user.properties.file=/home/michael/.netbeans/16/build.properties
diff --git a/nbproject/project.properties b/nbproject/project.properties
@@ -21,8 +21,12 @@ build.test.results.dir=${build.dir}/test/results
#debug.transport=dt_socket
debug.classpath=\
${run.classpath}
+debug.modulepath=\
+ ${run.modulepath}
debug.test.classpath=\
${run.test.classpath}
+debug.test.modulepath=\
+ ${run.test.modulepath}
# Files in build.classes.dir which should be excluded from distribution jar
dist.archive.excludes=
# This directory is removed when the project is cleaned:
@@ -31,6 +35,7 @@ dist.jar=${dist.dir}/librejack.jar
dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath=
excludes=
+file.reference.commons-lang3-3.12.0.jar=/home/michael/Downloads/commons-lang3-3.12.0/commons-lang3-3.12.0.jar
file.reference.jcalendar-1.4.jar=/home/michael/Downloads/jcalendar-1.4/lib/jcalendar-1.4.jar
file.reference.opencsv-5.7.1.jar=/home/michael/Downloads/opencsv-5.7.1.jar
includes=**
@@ -40,11 +45,14 @@ jar.index=${jnlp.enabled}
javac.classpath=\
${libs.absolutelayout.classpath}:\
${file.reference.jcalendar-1.4.jar}:\
- ${file.reference.opencsv-5.7.1.jar}
+ ${file.reference.opencsv-5.7.1.jar}:\
+ ${file.reference.commons-lang3-3.12.0.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.external.vm=true
+javac.modulepath=
+javac.processormodulepath=
javac.processorpath=\
${javac.classpath}
javac.source=1.8
@@ -52,6 +60,8 @@ javac.target=1.8
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}
+javac.test.modulepath=\
+ ${javac.modulepath}
javac.test.processorpath=\
${javac.test.classpath}
javadoc.additionalparam=
@@ -95,9 +105,13 @@ run.classpath=\
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
# To set system properties for unit tests define test-sys-prop.name=value:
run.jvmargs=
+run.modulepath=\
+ ${javac.modulepath}
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
+run.test.modulepath=\
+ ${javac.test.modulepath}
source.encoding=UTF-8
src.dir=src
test.src.dir=test
diff --git a/src/controller/LoginController.java b/src/controller/LoginController.java
@@ -15,7 +15,7 @@ public class LoginController {
}
/**
- * Checks whether all the entered fields are present and valid
+ * Checks whether all the entered fields are present and valid.
*
* @param email
* @param mobileNumber
diff --git a/src/model/Statistics.java b/src/model/Statistics.java
@@ -8,78 +8,147 @@ import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import com.opencsv.exceptions.CsvValidationException;
-
/**
* The Statistics class represents a set of statistics for a blackjack game.
- * Statistics are stored in a CSV file with the following format:
- * - Column 1: number of wins
- * - Column 2: number of losses
- * - Column 3: number of pushes (ties)
- *
+ * Statistics are stored in a CSV file with the following format: - Column 1:
+ * number of wins - Column 2: number of losses - Column 3: number of pushes
+ * (ties)
+ *
* The file is named 'statistics.csv' and is stored in the 'db/' directory.
- *
+ *
* @author michael
*/
public class Statistics {
- private static final String CSV_FILE = "db/statistics.csv";
- private static final String[] CSV_HEADERS = {"wins", "losses", "pushes"};
+
+ private static final String CSV_FILE = "db/statistics.csv"; // csv file that stores the stats
+ private static final String[] CSV_HEADERS = {"wins", "losses", "pushes"}; // headers for the csv file
private int wins;
private int losses;
private int pushes;
+ /**
+ * Constructs a new Statistics object with all statistics initialized to 0.
+ */
public Statistics() {
this.wins = 0;
this.losses = 0;
this.pushes = 0;
}
+ /**
+ *
+ * Constructs a new Statistics object with the given statistics.
+ *
+ * @param wins the number of wins
+ * @param losses the number of losses
+ * @param pushes the number of pushes (ties)
+ */
public Statistics(int wins, int losses, int pushes) {
this.wins = wins;
this.losses = losses;
this.pushes = pushes;
}
+ /**
+ *
+ * Gets the number of wins.
+ *
+ * @return wins number of wins
+ */
public int getWins() {
return wins;
}
+ /**
+ *
+ * Gets the number of losses.
+ *
+ * @return losses number of losses
+ */
public int getLosses() {
return losses;
}
+ /**
+ *
+ * Gets the number of pushes (ties).
+ *
+ * @return pushes number of pushes
+ */
public int getPushes() {
return pushes;
}
+ /**
+ *
+ * Sets the number of wins.
+ *
+ * @param wins the new number of wins
+ */
public void setWins(int wins) {
this.wins = wins;
}
+ /**
+ *
+ * Sets the number of losses.
+ *
+ * @param losses the new number of losses
+ */
public void setLosses(int losses) {
this.losses = losses;
}
+ /**
+ *
+ * Sets the number of pushes (ties).
+ *
+ * @param pushes the new number of pushes
+ */
public void setPushes(int pushes) {
this.pushes = pushes;
}
+ /**
+ *
+ * Increments the number of wins by 1 and saves the new statistics to the
+ * CSV file.
+ */
public void incrementWins() {
this.wins++;
save();
}
+ /**
+ *
+ * Increments the number of losses by 1 and saves the new statistics to the
+ * CSV file.
+ */
public void incrementLosses() {
this.losses++;
save();
}
+ /**
+ *
+ * Increments the number of pushes (ties) by 1 and saves the new statistics
+ * to the CSV file.
+ */
public void incrementPushes() {
this.pushes++;
save();
}
- public void save() {
+ /**
+ *
+ * This method saves the current statistics (number of wins, losses, and
+ * pushes) to a CSV file. The file path is defined by the CSV_FILE constant
+ * in the Statistics class. The method uses a CSVWriter object to write the
+ * data to the file. If an IOException occurs during the file writing
+ * process, it is caught and ignored.
+ */
+ private void save() {
try (CSVWriter writer = new CSVWriter(new FileWriter(CSV_FILE))) {
writer.writeNext(CSV_HEADERS);
String[] data = {String.valueOf(wins), String.valueOf(losses), String.valueOf(pushes)};
@@ -88,7 +157,23 @@ public class Statistics {
}
}
- public static Statistics load() throws CsvValidationException {
+ /**
+ * This static method loads the statistics from the CSV file located at the
+ * path defined by the CSV_FILE constant in the Statistics class. The method
+ * uses a CSVReader object to read the data from the file. If the CSV file
+ * does not have the expected headers, an IOException is thrown. The method
+ * returns a Statistics object with the values read from the CSV file. If an
+ * IOException occurs during the file reading process, it is caught and
+ * ignored. If a CsvValidationException is thrown during the file reading
+ * process, it is handled internally and an empty Statistics object is
+ * returned.
+ *
+ * @return a Statistics object with the values read from the CSV file, or an
+ * empty Statistics object if there was a problem with the CSV file format
+ * @throws IOException if there is a problem with the file reading process
+ * or the CSV file headers are invalid
+ */
+ public static Statistics load() throws IOException {
Statistics stats = new Statistics();
try (CSVReader reader = new CSVReader(new FileReader(CSV_FILE))) {
String[] headers = reader.readNext();
@@ -101,7 +186,12 @@ public class Statistics {
stats.setLosses(Integer.parseInt(data[1]));
stats.setPushes(Integer.parseInt(data[2]));
}
+ } catch (CsvValidationException e) {
+ // handle the exception internally
+ System.err.println("Error: invalid CSV file format");
} catch (IOException e) {
+ // rethrow the IOException to the calling function
+ throw new IOException("Error reading CSV file", e);
}
return stats;
}
diff --git a/src/view/MainGUI.form b/src/view/MainGUI.form
@@ -34,21 +34,24 @@
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
<Component id="jPanel3" min="-2" max="-2" attributes="0"/>
</Group>
- <Group type="102" alignment="0" attributes="0">
- <Component id="jLabelDealerHandValue" min="-2" pref="80" max="-2" attributes="0"/>
- <EmptySpace max="32767" attributes="0"/>
- </Group>
+ <Component id="jLabelDealerHandValue" alignment="0" min="-2" pref="80" max="-2" attributes="0"/>
</Group>
<EmptySpace min="-2" pref="196" max="-2" attributes="0"/>
</Group>
- <Group type="102" attributes="0">
- <Group type="103" groupAlignment="1" attributes="0">
- <Group type="103" groupAlignment="0" max="-2" attributes="0">
+ <Group type="103" groupAlignment="1" max="-2" attributes="0">
+ <Group type="102" attributes="0">
+ <EmptySpace min="1132" pref="1132" max="-2" attributes="0"/>
+ <Component id="jButtonExit" min="-2" pref="120" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="144" max="-2" attributes="0"/>
+ </Group>
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace min="-2" pref="256" max="-2" attributes="0"/>
+ <Component id="jLabelResult" min="-2" pref="894" max="-2" attributes="0"/>
+ <EmptySpace max="32767" attributes="0"/>
+ </Group>
+ <Group type="102" alignment="1" attributes="0">
+ <Group type="103" groupAlignment="1" attributes="0">
<Group type="102" attributes="0">
- <EmptySpace min="1132" pref="1132" max="-2" attributes="0"/>
- <Component id="jButtonExit" min="-2" pref="120" max="-2" attributes="0"/>
- </Group>
- <Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace min="70" pref="70" max="-2" attributes="0"/>
@@ -68,42 +71,44 @@
</Group>
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
- <Group type="102" attributes="0">
- <Component id="jLabelPlayerHand" min="-2" pref="210" max="-2" attributes="0"/>
- <EmptySpace type="unrelated" max="-2" attributes="0"/>
- <Component id="jLabelPlayerHandValue" min="-2" pref="60" max="-2" attributes="0"/>
- <EmptySpace min="-2" pref="150" max="-2" attributes="0"/>
- <Component id="jButtonHit" min="-2" pref="190" max="-2" attributes="0"/>
- </Group>
<Group type="102" alignment="0" attributes="0">
<Component id="jLabelDisplayPlayerHand" min="-2" pref="400" max="-2" attributes="0"/>
- <EmptySpace min="30" pref="30" max="-2" attributes="0"/>
- <Group type="103" groupAlignment="0" attributes="0">
- <Component id="jButtonDouble" min="-2" pref="190" max="-2" attributes="0"/>
- <Component id="jButtonStand" min="-2" pref="190" max="-2" attributes="0"/>
+ <EmptySpace max="32767" attributes="0"/>
+ <Component id="jButtonStand" min="-2" pref="190" max="-2" attributes="0"/>
+ </Group>
+ <Group type="102" alignment="0" attributes="0">
+ <Group type="103" groupAlignment="1" attributes="0">
+ <Component id="jButtonStats" min="-2" pref="199" max="-2" attributes="0"/>
+ <Group type="102" attributes="0">
+ <Component id="jLabelPlayerHand" min="-2" pref="210" max="-2" attributes="0"/>
+ <EmptySpace type="unrelated" max="-2" attributes="0"/>
+ <Component id="jLabelPlayerHandValue" min="-2" pref="60" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="288" max="-2" attributes="0"/>
+ <Component id="jButtonHit" min="-2" pref="190" max="-2" attributes="0"/>
+ </Group>
</Group>
+ <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
</Group>
</Group>
- <Group type="102" alignment="0" attributes="0">
- <EmptySpace min="-2" pref="256" max="-2" attributes="0"/>
- <Component id="jLabelResult" min="-2" pref="894" max="-2" attributes="0"/>
+ <Group type="102" attributes="0">
+ <EmptySpace min="-2" pref="52" max="-2" attributes="0"/>
+ <Component id="jButtonDeal" min="-2" pref="460" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="38" max="-2" attributes="0"/>
+ <Component id="jButtonDouble" min="-2" pref="190" max="-2" attributes="0"/>
</Group>
</Group>
- <Group type="102" alignment="1" attributes="0">
- <EmptySpace min="-2" pref="52" max="-2" attributes="0"/>
- <Component id="jButtonDeal" min="-2" pref="460" max="-2" attributes="0"/>
- <EmptySpace min="-2" pref="322" max="-2" attributes="0"/>
- </Group>
+ <EmptySpace min="-2" pref="100" max="-2" attributes="0"/>
</Group>
- <EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
- <EmptySpace min="-2" pref="24" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="95" max="-2" attributes="0"/>
+ <Component id="jButtonStats" min="-2" pref="64" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
<Component id="jLabelResult" min="-2" pref="130" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
@@ -132,37 +137,35 @@
</Group>
</Group>
<Group type="103" groupAlignment="0" attributes="0">
- <Group type="102" attributes="0">
- <EmptySpace max="-2" attributes="0"/>
- <Component id="jLabelDisplayDealerHand" min="-2" pref="59" max="-2" attributes="0"/>
- <EmptySpace type="unrelated" max="-2" attributes="0"/>
- <Component id="jLabelBalance" min="-2" pref="40" max="-2" attributes="0"/>
- </Group>
- <Group type="102" attributes="0">
- <EmptySpace min="10" pref="10" max="-2" attributes="0"/>
- <Component id="jLabelDisplayPlayerHand" min="-2" pref="150" max="-2" attributes="0"/>
- </Group>
- <Group type="102" attributes="0">
- <EmptySpace min="50" pref="50" max="-2" attributes="0"/>
- <Component id="jButtonStand" min="-2" pref="110" max="-2" attributes="0"/>
- </Group>
- </Group>
- <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
- <EmptySpace min="-2" pref="62" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
- <Component id="jButtonDeal" min="-2" pref="120" max="-2" attributes="0"/>
- <Component id="jButtonDouble" min="-2" pref="120" max="-2" attributes="0"/>
+ <Group type="102" attributes="0">
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jLabelDisplayDealerHand" min="-2" pref="59" max="-2" attributes="0"/>
+ <EmptySpace type="unrelated" max="-2" attributes="0"/>
+ <Component id="jLabelBalance" min="-2" pref="40" max="-2" attributes="0"/>
+ </Group>
+ <Group type="102" attributes="0">
+ <EmptySpace min="10" pref="10" max="-2" attributes="0"/>
+ <Component id="jLabelDisplayPlayerHand" min="-2" pref="150" max="-2" attributes="0"/>
+ </Group>
</Group>
- </Group>
- <Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="50" max="-2" attributes="0"/>
<Component id="jLabelCurrentBet" min="-2" pref="50" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="jButtonBetAmount" min="-2" pref="60" max="-2" attributes="0"/>
</Group>
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace min="-2" pref="63" max="-2" attributes="0"/>
+ <Component id="jButtonStand" min="-2" pref="110" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="49" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Component id="jButtonDeal" min="-2" pref="120" max="-2" attributes="0"/>
+ <Component id="jButtonDouble" min="-2" pref="120" max="-2" attributes="0"/>
+ </Group>
+ </Group>
</Group>
- <EmptySpace min="-2" pref="56" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="62" max="-2" attributes="0"/>
<Component id="jButtonExit" min="-2" pref="50" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="22" max="-2" attributes="0"/>
</Group>
@@ -317,5 +320,16 @@
</Property>
</Properties>
</Component>
+ <Component class="javax.swing.JButton" name="jButtonStats">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="18" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Show Statistics"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButtonStatsActionPerformed"/>
+ </Events>
+ </Component>
</SubComponents>
</Form>
diff --git a/src/view/MainGUI.java b/src/view/MainGUI.java
@@ -1,6 +1,9 @@
package view;
import controller.Controller;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.swing.JOptionPane;
/**
@@ -43,6 +46,7 @@ public class MainGUI extends javax.swing.JFrame {
jButtonExit = new javax.swing.JButton();
jLabelDealerHandValue = new javax.swing.JLabel();
jLabelPlayerHandValue = new javax.swing.JLabel();
+ jButtonStats = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("librejack");
@@ -127,6 +131,14 @@ public class MainGUI extends javax.swing.JFrame {
jLabelPlayerHandValue.setFont(new java.awt.Font("Dialog", 1, 36)); // NOI18N
+ jButtonStats.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
+ jButtonStats.setText("Show Statistics");
+ jButtonStats.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ jButtonStatsActionPerformed(evt);
+ }
+ });
+
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
@@ -137,16 +149,19 @@ public class MainGUI extends javax.swing.JFrame {
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGroup(layout.createSequentialGroup()
- .addComponent(jLabelDealerHandValue, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
+ .addComponent(jLabelDealerHandValue, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(196, 196, 196))
- .addGroup(layout.createSequentialGroup()
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
- .addGroup(layout.createSequentialGroup()
- .addGap(1132, 1132, 1132)
- .addComponent(jButtonExit, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(1132, 1132, 1132)
+ .addComponent(jButtonExit, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(144, 144, 144))
+ .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+ .addGap(256, 256, 256)
+ .addComponent(jLabelResult, javax.swing.GroupLayout.PREFERRED_SIZE, 894, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGroup(layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
@@ -163,30 +178,32 @@ public class MainGUI extends javax.swing.JFrame {
.addGap(20, 20, 20)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
- .addComponent(jLabelPlayerHand, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(jLabelPlayerHandValue, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(150, 150, 150)
- .addComponent(jButtonHit, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGroup(layout.createSequentialGroup()
.addComponent(jLabelDisplayPlayerHand, javax.swing.GroupLayout.PREFERRED_SIZE, 400, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(30, 30, 30)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jButtonDouble, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jButtonStand, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE)))))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(jButtonStand, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jButtonStats, javax.swing.GroupLayout.PREFERRED_SIZE, 199, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jLabelPlayerHand, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jLabelPlayerHandValue, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(288, 288, 288)
+ .addComponent(jButtonHit, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addGap(0, 0, Short.MAX_VALUE))))
.addGroup(layout.createSequentialGroup()
- .addGap(256, 256, 256)
- .addComponent(jLabelResult, javax.swing.GroupLayout.PREFERRED_SIZE, 894, javax.swing.GroupLayout.PREFERRED_SIZE)))
- .addGroup(layout.createSequentialGroup()
- .addGap(52, 52, 52)
- .addComponent(jButtonDeal, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addGap(322, 322, 322)))
- .addContainerGap())
+ .addGap(52, 52, 52)
+ .addComponent(jButtonDeal, javax.swing.GroupLayout.PREFERRED_SIZE, 460, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(38, 38, 38)
+ .addComponent(jButtonDouble, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addGap(100, 100, 100)))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
- .addGap(24, 24, 24)
+ .addGap(95, 95, 95)
+ .addComponent(jButtonStats, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabelResult, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -209,28 +226,27 @@ public class MainGUI extends javax.swing.JFrame {
.addComponent(jLabelDealerHandValue, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(jLabelDisplayDealerHand, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(jLabelBalance, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGroup(layout.createSequentialGroup()
- .addGap(10, 10, 10)
- .addComponent(jLabelDisplayPlayerHand, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE))
- .addGroup(layout.createSequentialGroup()
- .addGap(50, 50, 50)
- .addComponent(jButtonStand, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)))
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addGap(62, 62, 62)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(jButtonDeal, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(jButtonDouble, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)))
- .addGroup(layout.createSequentialGroup()
+ .addGroup(layout.createSequentialGroup()
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jLabelDisplayDealerHand, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jLabelBalance, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(layout.createSequentialGroup()
+ .addGap(10, 10, 10)
+ .addComponent(jLabelDisplayPlayerHand, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(50, 50, 50)
.addComponent(jLabelCurrentBet, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(jButtonBetAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)))
- .addGap(56, 56, 56)
+ .addComponent(jButtonBetAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(layout.createSequentialGroup()
+ .addGap(63, 63, 63)
+ .addComponent(jButtonStand, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(49, 49, 49)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jButtonDeal, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jButtonDouble, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE))))
+ .addGap(62, 62, 62)
.addComponent(jButtonExit, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(22, 22, 22))
);
@@ -279,9 +295,17 @@ public class MainGUI extends javax.swing.JFrame {
}//GEN-LAST:event_jButtonHitActionPerformed
private void jButtonExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonExitActionPerformed
- // TODO: add exit operation
+ System.exit(0);
}//GEN-LAST:event_jButtonExitActionPerformed
+ private void jButtonStatsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonStatsActionPerformed
+ try {
+ new StatisticsGUI().setVisible(true);
+ } catch (IOException ex) {
+ Logger.getLogger(MainGUI.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }//GEN-LAST:event_jButtonStatsActionPerformed
+
/**
* @param args the command line arguments
*/
@@ -333,6 +357,7 @@ public class MainGUI extends javax.swing.JFrame {
private javax.swing.JButton jButtonExit;
private javax.swing.JButton jButtonHit;
private javax.swing.JButton jButtonStand;
+ private javax.swing.JButton jButtonStats;
private javax.swing.JLabel jLabelBalance;
private javax.swing.JLabel jLabelCurrentBet;
private javax.swing.JLabel jLabelDealerHand;
diff --git a/src/view/StatisticsGUI.form b/src/view/StatisticsGUI.form
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="3"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ <SyntheticProperty name="generateCenter" type="boolean" value="false"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ </AuxValues>
+
+ <Layout>
+ <DimensionLayout dim="0">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace min="-2" pref="36" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" attributes="0">
+ <Component id="jLabelLosses" min="-2" max="-2" attributes="0"/>
+ <EmptySpace type="unrelated" max="-2" attributes="0"/>
+ <Component id="jLabelLossesAmount" min="-2" pref="217" max="-2" attributes="0"/>
+ </Group>
+ <Component id="jLabelStatistics" min="-2" pref="342" max="-2" attributes="0"/>
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jLabelWins" min="-2" pref="84" max="-2" attributes="0"/>
+ <EmptySpace max="-2" attributes="0"/>
+ <Component id="jLabelWinsAmount" min="-2" pref="217" max="-2" attributes="0"/>
+ </Group>
+ <Group type="102" alignment="0" attributes="0">
+ <Component id="jLabelPushes" min="-2" max="-2" attributes="0"/>
+ <EmptySpace type="unrelated" max="-2" attributes="0"/>
+ <Component id="jLabelPushesAmount" min="-2" pref="217" max="-2" attributes="0"/>
+ </Group>
+ </Group>
+ <EmptySpace pref="543" max="32767" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ <DimensionLayout dim="1">
+ <Group type="103" groupAlignment="0" attributes="0">
+ <Group type="102" alignment="0" attributes="0">
+ <EmptySpace min="-2" pref="27" max="-2" attributes="0"/>
+ <Component id="jLabelStatistics" min="-2" pref="44" max="-2" attributes="0"/>
+ <EmptySpace min="-2" pref="101" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="jLabelWins" alignment="3" min="-2" pref="26" max="-2" attributes="0"/>
+ <Component id="jLabelWinsAmount" alignment="3" min="-2" pref="43" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace min="-2" pref="40" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="jLabelLosses" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabelLossesAmount" alignment="3" min="-2" pref="43" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace min="-2" pref="37" max="-2" attributes="0"/>
+ <Group type="103" groupAlignment="3" attributes="0">
+ <Component id="jLabelPushes" alignment="3" min="-2" max="-2" attributes="0"/>
+ <Component id="jLabelPushesAmount" alignment="3" min="-2" pref="43" max="-2" attributes="0"/>
+ </Group>
+ <EmptySpace pref="305" max="32767" attributes="0"/>
+ </Group>
+ </Group>
+ </DimensionLayout>
+ </Layout>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabelStatistics">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="48" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Statistics"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelWins">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="24" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Wins:"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelWinsAmount">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="18" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection code=""" + stats.getWins()" type="code"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelPushes">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="24" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Pushes:"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelPushesAmount">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="18" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection code=""" + stats.getPushes()" type="code"/>
+ </Property>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelLosses">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="24" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" value="Losses:"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabelLossesAmount">
+ <Properties>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Dialog" size="18" style="1"/>
+ </Property>
+ <Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection code=""" + stats.getLosses()" type="code"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+</Form>
diff --git a/src/view/StatisticsGUI.java b/src/view/StatisticsGUI.java
@@ -0,0 +1,159 @@
+package view;
+import com.opencsv.exceptions.CsvValidationException;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import model.Statistics;
+
+/**
+ *
+ * @author michael
+ */
+public class StatisticsGUI extends javax.swing.JFrame {
+
+ Statistics stats;
+
+
+ /**
+ * Creates new form StatisticsGUI
+ */
+ public StatisticsGUI() throws IOException {
+ this.stats = Statistics.load();
+ initComponents();
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ jLabelStatistics = new javax.swing.JLabel();
+ jLabelWins = new javax.swing.JLabel();
+ jLabelWinsAmount = new javax.swing.JLabel();
+ jLabelPushes = new javax.swing.JLabel();
+ jLabelPushesAmount = new javax.swing.JLabel();
+ jLabelLosses = new javax.swing.JLabel();
+ jLabelLossesAmount = new javax.swing.JLabel();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+
+ jLabelStatistics.setFont(new java.awt.Font("Dialog", 1, 48)); // NOI18N
+ jLabelStatistics.setText("Statistics");
+
+ jLabelWins.setFont(new java.awt.Font("Dialog", 1, 24)); // NOI18N
+ jLabelWins.setText("Wins:");
+
+ jLabelWinsAmount.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
+ jLabelWinsAmount.setText("" + stats.getWins());
+
+ jLabelPushes.setFont(new java.awt.Font("Dialog", 1, 24)); // NOI18N
+ jLabelPushes.setText("Pushes:");
+
+ jLabelPushesAmount.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
+ jLabelPushesAmount.setText("" + stats.getPushes());
+
+ jLabelLosses.setFont(new java.awt.Font("Dialog", 1, 24)); // NOI18N
+ jLabelLosses.setText("Losses:");
+
+ jLabelLossesAmount.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
+ jLabelLossesAmount.setText("" + stats.getLosses());
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(36, 36, 36)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jLabelLosses)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jLabelLossesAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 217, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addComponent(jLabelStatistics, javax.swing.GroupLayout.PREFERRED_SIZE, 342, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jLabelWins, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(jLabelWinsAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 217, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(jLabelPushes)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(jLabelPushesAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 217, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addContainerGap(543, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(27, 27, 27)
+ .addComponent(jLabelStatistics, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(101, 101, 101)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabelWins, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabelWinsAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(40, 40, 40)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabelLosses)
+ .addComponent(jLabelLossesAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(37, 37, 37)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(jLabelPushes)
+ .addComponent(jLabelPushesAmount, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addContainerGap(305, Short.MAX_VALUE))
+ );
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) throws CsvValidationException {
+ /* Set the Nimbus look and feel */
+ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
+ /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
+ * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
+ */
+ try {
+ for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
+ if ("Nimbus".equals(info.getName())) {
+ javax.swing.UIManager.setLookAndFeel(info.getClassName());
+ break;
+ }
+ }
+ } catch (ClassNotFoundException ex) {
+ java.util.logging.Logger.getLogger(StatisticsGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ } catch (InstantiationException ex) {
+ java.util.logging.Logger.getLogger(StatisticsGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ } catch (IllegalAccessException ex) {
+ java.util.logging.Logger.getLogger(StatisticsGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ } catch (javax.swing.UnsupportedLookAndFeelException ex) {
+ java.util.logging.Logger.getLogger(StatisticsGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ }
+ //</editor-fold>
+
+
+ /* Create and display the form */
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ new StatisticsGUI().setVisible(true);
+ } catch (IOException ex) {
+ Logger.getLogger(StatisticsGUI.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ });
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel jLabelLosses;
+ private javax.swing.JLabel jLabelLossesAmount;
+ private javax.swing.JLabel jLabelPushes;
+ private javax.swing.JLabel jLabelPushesAmount;
+ private javax.swing.JLabel jLabelStatistics;
+ private javax.swing.JLabel jLabelWins;
+ private javax.swing.JLabel jLabelWinsAmount;
+ // End of variables declaration//GEN-END:variables
+}