From 4b64bddbe0f166450270d3ced370707e7b3da528 Mon Sep 17 00:00:00 2001 From: tobia <tobia@Ryzen7Office.fritz.box> Date: Tue, 31 Mar 2020 15:41:14 -0700 Subject: [PATCH] Initial move to NPS Gitlab --- Brennenstuhl/build.xml | 73 + Brennenstuhl/nbproject/build-impl.xml | 1770 +++++++++++++++++ Brennenstuhl/nbproject/genfiles.properties | 8 + Brennenstuhl/nbproject/project.properties | 113 ++ Brennenstuhl/nbproject/project.xml | 15 + Brennenstuhl/src/DISTools/Compressor.java | 174 ++ Brennenstuhl/src/DISTools/Coordinates.java | 58 + Brennenstuhl/src/DISTools/EspduReceiver.java | 111 ++ Brennenstuhl/src/DISTools/EspduSender.java | 361 ++++ .../src/DISTools/PduListenerSaver.java | 92 + .../src/DISTools/PduReaderPlayer.java | 85 + Brennenstuhl/src/DISTools/PduReceiver.java | 12 + Brennenstuhl/src/DISTools/Player.java | 242 +++ Brennenstuhl/src/DISTools/PlayerTobi.java | 484 +++++ Brennenstuhl/src/DISTools/Recorder.java | 236 +++ Brennenstuhl/src/DISTools/RecorderTobi.java | 237 +++ .../src/DISTools/SimpleSenderGUI.java | 400 ++++ .../src/DISTools/SimpleSenderGUIMain.java | 31 + 18 files changed, 4502 insertions(+) create mode 100644 Brennenstuhl/build.xml create mode 100644 Brennenstuhl/nbproject/build-impl.xml create mode 100644 Brennenstuhl/nbproject/genfiles.properties create mode 100644 Brennenstuhl/nbproject/project.properties create mode 100644 Brennenstuhl/nbproject/project.xml create mode 100644 Brennenstuhl/src/DISTools/Compressor.java create mode 100644 Brennenstuhl/src/DISTools/Coordinates.java create mode 100644 Brennenstuhl/src/DISTools/EspduReceiver.java create mode 100644 Brennenstuhl/src/DISTools/EspduSender.java create mode 100644 Brennenstuhl/src/DISTools/PduListenerSaver.java create mode 100644 Brennenstuhl/src/DISTools/PduReaderPlayer.java create mode 100644 Brennenstuhl/src/DISTools/PduReceiver.java create mode 100644 Brennenstuhl/src/DISTools/Player.java create mode 100644 Brennenstuhl/src/DISTools/PlayerTobi.java create mode 100644 Brennenstuhl/src/DISTools/Recorder.java create mode 100644 Brennenstuhl/src/DISTools/RecorderTobi.java create mode 100644 Brennenstuhl/src/DISTools/SimpleSenderGUI.java create mode 100644 Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java diff --git a/Brennenstuhl/build.xml b/Brennenstuhl/build.xml new file mode 100644 index 0000000..75987f5 --- /dev/null +++ b/Brennenstuhl/build.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- You may freely edit this file. See commented blocks below for --> +<!-- some examples of how to customize the build. --> +<!-- (If you delete it and reopen the project it will be recreated.) --> +<!-- By default, only the Clean and Build commands use this build script. --> +<!-- Commands such as Run, Debug, and Test only use this build script if --> +<!-- the Compile on Save feature is turned off for the project. --> +<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> +<!-- in the project's Project Properties dialog box.--> +<project name="Brennenstuhl" default="default" basedir="."> + <description>Builds, tests, and runs the project Brennenstuhl.</description> + <import file="nbproject/build-impl.xml"/> + <!-- + + There exist several targets which are by default empty and which can be + used for execution of your tasks. These targets are usually executed + before and after some main targets. They are: + + -pre-init: called before initialization of project properties + -post-init: called after initialization of project properties + -pre-compile: called before javac compilation + -post-compile: called after javac compilation + -pre-compile-single: called before javac compilation of single file + -post-compile-single: called after javac compilation of single file + -pre-compile-test: called before javac compilation of JUnit tests + -post-compile-test: called after javac compilation of JUnit tests + -pre-compile-test-single: called before javac compilation of single JUnit test + -post-compile-test-single: called after javac compilation of single JUunit test + -pre-jar: called before JAR building + -post-jar: called after JAR building + -post-clean: called after cleaning build products + + (Targets beginning with '-' are not intended to be called on their own.) + + Example of inserting an obfuscator after compilation could look like this: + + <target name="-post-compile"> + <obfuscate> + <fileset dir="${build.classes.dir}"/> + </obfuscate> + </target> + + For list of available properties check the imported + nbproject/build-impl.xml file. + + + Another way to customize the build is by overriding existing main targets. + The targets of interest are: + + -init-macrodef-javac: defines macro for javac compilation + -init-macrodef-junit: defines macro for junit execution + -init-macrodef-debug: defines macro for class debugging + -init-macrodef-java: defines macro for class execution + -do-jar: JAR building + run: execution of project + -javadoc-build: Javadoc generation + test-report: JUnit report generation + + An example of overriding the target for project execution could look like this: + + <target name="run" depends="Brennenstuhl-impl.jar"> + <exec dir="bin" executable="launcher.exe"> + <arg file="${dist.jar}"/> + </exec> + </target> + + Notice that the overridden target depends on the jar target and not only on + the compile target as the regular run target does. Again, for a list of available + properties which you can use, check the target you are overriding in the + nbproject/build-impl.xml file. + + --> +</project> diff --git a/Brennenstuhl/nbproject/build-impl.xml b/Brennenstuhl/nbproject/build-impl.xml new file mode 100644 index 0000000..73b7328 --- /dev/null +++ b/Brennenstuhl/nbproject/build-impl.xml @@ -0,0 +1,1770 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +*** GENERATED FROM project.xml - DO NOT EDIT *** +*** EDIT ../build.xml INSTEAD *** + +For the purpose of easier reading the script +is divided into following sections: + + - initialization + - compilation + - jar + - execution + - debugging + - javadoc + - test compilation + - test execution + - test debugging + - applet + - cleanup + + --> +<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="Brennenstuhl-impl"> + <fail message="Please build using Ant 1.8.0 or higher."> + <condition> + <not> + <antversion atleast="1.8.0"/> + </not> + </condition> + </fail> + <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/> + <!-- + ====================== + INITIALIZATION SECTION + ====================== + --> + <target name="-pre-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="-pre-init" name="-init-private"> + <property file="nbproject/private/config.properties"/> + <property file="nbproject/private/configs/${config}.properties"/> + <property file="nbproject/private/private.properties"/> + </target> + <target depends="-pre-init,-init-private" name="-init-user"> + <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"/> + </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 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"> + <and> + <not> + <equals arg1="${application.splash}" arg2="" trim="true"/> + </not> + <available file="${application.splash}"/> + </and> + </condition> + <condition property="main.class.available"> + <and> + <isset property="main.class"/> + <not> + <equals arg1="${main.class}" arg2="" trim="true"/> + </not> + </and> + </condition> + <condition property="profile.available"> + <and> + <isset property="javac.profile"/> + <length length="0" string="${javac.profile}" when="greater"/> + <not> + <matches pattern="1\.[0-7](\..*)?" string="${javac.source}"/> + </not> + </and> + </condition> + <condition property="do.archive"> + <or> + <not> + <istrue value="${jar.archive.disabled}"/> + </not> + <istrue value="${not.archive.disabled}"/> + </or> + </condition> + <condition property="do.archive+manifest.available"> + <and> + <isset property="manifest.available"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="do.archive+main.class.available"> + <and> + <isset property="main.class.available"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="do.archive+splashscreen.available"> + <and> + <isset property="splashscreen.available"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="do.archive+profile.available"> + <and> + <isset property="profile.available"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="have.tests"> + <or> + <available file="${test.src.dir}"/> + </or> + </condition> + <condition property="have.sources"> + <or> + <available file="${src.dir}"/> + </or> + </condition> + <condition property="netbeans.home+have.tests"> + <and> + <isset property="netbeans.home"/> + <isset property="have.tests"/> + </and> + </condition> + <condition property="no.javadoc.preview"> + <and> + <isset property="javadoc.preview"/> + <isfalse value="${javadoc.preview}"/> + </and> + </condition> + <property name="run.jvmargs" value=""/> + <property name="run.jvmargs.ide" value=""/> + <property name="javac.compilerargs" value=""/> + <property name="work.dir" value="${basedir}"/> + <condition property="no.deps"> + <and> + <istrue value="${no.dependencies}"/> + </and> + </condition> + <property name="javac.debug" value="true"/> + <property name="javadoc.preview" value="true"/> + <property name="application.args" value=""/> + <property name="source.encoding" value="${file.encoding}"/> + <property name="runtime.encoding" value="${source.encoding}"/> + <property name="manifest.encoding" value="${source.encoding}"/> + <condition property="javadoc.encoding.used" value="${javadoc.encoding}"> + <and> + <isset property="javadoc.encoding"/> + <not> + <equals arg1="${javadoc.encoding}" arg2=""/> + </not> + </and> + </condition> + <property name="javadoc.encoding.used" value="${source.encoding}"/> + <property name="includes" value="**"/> + <property name="excludes" value=""/> + <property name="do.depend" value="false"/> + <condition property="do.depend.true"> + <istrue value="${do.depend}"/> + </condition> + <path id="endorsed.classpath.path" path="${endorsed.classpath}"/> + <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'"> + <and> + <isset property="endorsed.classpath"/> + <not> + <equals arg1="${endorsed.classpath}" arg2="" trim="true"/> + </not> + </and> + </condition> + <condition else="" property="javac.profile.cmd.line.arg" value="-profile ${javac.profile}"> + <isset property="profile.available"/> + </condition> + <condition else="false" property="jdkBug6558476"> + <and> + <matches pattern="1\.[56]" string="${java.specification.version}"/> + <not> + <os family="unix"/> + </not> + </and> + </condition> + <condition else="false" property="javac.fork"> + <or> + <istrue value="${jdkBug6558476}"/> + <istrue value="${javac.external.vm}"/> + </or> + </condition> + <property name="jar.index" value="false"/> + <property name="jar.index.metainf" value="${jar.index}"/> + <property name="copylibs.rebase" value="true"/> + <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/> + <condition property="junit.available"> + <or> + <available classname="org.junit.Test" classpath="${run.test.classpath}"/> + <available classname="junit.framework.Test" classpath="${run.test.classpath}"/> + </or> + </condition> + <condition property="testng.available"> + <available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/> + </condition> + <condition property="junit+testng.available"> + <and> + <istrue value="${junit.available}"/> + <istrue value="${testng.available}"/> + </and> + </condition> + <condition else="testng" property="testng.mode" value="mixed"> + <istrue value="${junit+testng.available}"/> + </condition> + <condition else="" property="testng.debug.mode" value="-mixed"> + <istrue value="${junit+testng.available}"/> + </condition> + <property name="java.failonerror" value="true"/> + </target> + <target name="-post-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check"> + <fail unless="src.dir">Must set src.dir</fail> + <fail unless="test.src.dir">Must set test.src.dir</fail> + <fail unless="build.dir">Must set build.dir</fail> + <fail unless="dist.dir">Must set dist.dir</fail> + <fail unless="build.classes.dir">Must set build.classes.dir</fail> + <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail> + <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail> + <fail unless="build.test.results.dir">Must set build.test.results.dir</fail> + <fail unless="build.classes.excludes">Must set build.classes.excludes</fail> + <fail unless="dist.jar">Must set dist.jar</fail> + </target> + <target name="-init-macrodef-property"> + <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1"> + <attribute name="name"/> + <attribute name="value"/> + <sequential> + <property name="@{name}" value="${@{value}}"/> + </sequential> + </macrodef> + </target> + <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"/> + <attribute default="${excludes}" name="excludes"/> + <attribute default="${javac.debug}" name="debug"/> + <attribute default="${empty.dir}" name="sourcepath"/> + <attribute default="${empty.dir}" name="gensrcdir"/> + <element name="customize" optional="true"/> + <sequential> + <property location="${build.dir}/empty" name="empty.dir"/> + <mkdir dir="${empty.dir}"/> + <mkdir dir="@{apgeneratedsrcdir}"/> + <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> + <compilerarg line="${endorsed.classpath.cmd.line.arg}"/> + <compilerarg line="${javac.profile.cmd.line.arg}"/> + <compilerarg line="${javac.compilerargs}"/> + <compilerarg value="-processorpath"/> + <compilerarg path="@{processorpath}:${empty.dir}"/> + <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" 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"/> + <attribute default="${excludes}" name="excludes"/> + <attribute default="${javac.debug}" name="debug"/> + <attribute default="${empty.dir}" name="sourcepath"/> + <attribute default="${empty.dir}" name="gensrcdir"/> + <element name="customize" optional="true"/> + <sequential> + <property location="${build.dir}/empty" name="empty.dir"/> + <mkdir dir="${empty.dir}"/> + <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> + <compilerarg line="${endorsed.classpath.cmd.line.arg}"/> + <compilerarg line="${javac.profile.cmd.line.arg}"/> + <compilerarg line="${javac.compilerargs}"/> + <customize/> + </javac> + </sequential> + </macrodef> + </target> + <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"/> + <attribute default="${javac.classpath}" name="classpath"/> + <sequential> + <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}"> + <classpath> + <path path="@{classpath}"/> + </classpath> + </depend> + </sequential> + </macrodef> + <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${build.classes.dir}" name="destdir"/> + <sequential> + <fail unless="javac.includes">Must set javac.includes</fail> + <pathconvert pathsep="${line.separator}" property="javac.includes.binary"> + <path> + <filelist dir="@{destdir}" files="${javac.includes}"/> + </path> + <globmapper from="*.java" to="*.class"/> + </pathconvert> + <tempfile deleteonexit="true" property="javac.includesfile.binary"/> + <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/> + <delete> + <files includesfile="${javac.includesfile.binary}"/> + </delete> + <delete> + <fileset file="${javac.includesfile.binary}"/> + </delete> + </sequential> + </macrodef> + </target> + <target if="${junit.available}" name="-init-macrodef-junit-init"> + <condition else="false" property="nb.junit.batch" value="true"> + <and> + <istrue value="${junit.available}"/> + <not> + <isset property="test.method"/> + </not> + </and> + </condition> + <condition else="false" property="nb.junit.single" value="true"> + <and> + <istrue value="${junit.available}"/> + <isset property="test.method"/> + </and> + </condition> + </target> + <target name="-init-test-properties"> + <property name="test.binaryincludes" value="<nothing>"/> + <property name="test.binarytestincludes" value=""/> + <property name="test.binaryexcludes" value=""/> + </target> + <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"/> + <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}"> + <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"/> + <jvmarg line="${run.test.jvmargs}"/> + <customizePrototype/> + </junit> + </sequential> + </macrodef> + </target> + <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"/> + <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}"> + <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"/> + <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"> + <attribute default="${includes}" name="includes"/> + <attribute default="${excludes}" name="excludes"/> + <attribute default="**" name="testincludes"/> + <attribute default="" name="testmethods"/> + <element name="customize" optional="true"/> + <sequential> + <condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}"> + <isset property="test.method"/> + </condition> + <union id="test.set"> + <fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}"> + <filename name="@{testincludes}"/> + </fileset> + </union> + <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/> + <testng classfilesetref="test.set" failureProperty="tests.failed" listeners="org.testng.reporters.VerboseReporter" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="Brennenstuhl" testname="TestNG tests" workingDir="${work.dir}"> + <xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/> + <propertyset> + <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> + </macrodef> + </target> + <target name="-init-macrodef-test-impl"> + <macrodef name="test-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"/> + <sequential> + <echo>No tests executed.</echo> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl"> + <macrodef name="test-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"/> + <sequential> + <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}"> + <customize/> + </j2seproject3:junit> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl"> + <macrodef name="test-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"/> + <sequential> + <j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}"> + <customize/> + </j2seproject3:testng> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test"> + <macrodef name="test" 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"/> + <sequential> + <j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}"> + <customize> + <jvmarg line="${run.jvmargs}"/> + <jvmarg line="${run.jvmargs.ide}"/> + </customize> + </j2seproject3:test-impl> + </sequential> + </macrodef> + </target> + <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 name="customizeDebuggee" optional="true"/> + <sequential> + <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> + <target if="${testng.available}" name="-init-macrodef-testng-debug"> + <macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${main.class}" name="testClass"/> + <attribute default="" name="testMethod"/> + <element name="customize2" optional="true"/> + <sequential> + <condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}"> + <isset property="test.method"/> + </condition> + <condition else="-suitename Brennenstuhl -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}"> + <matches pattern=".*\.xml" string="@{testClass}"/> + </condition> + <delete dir="${build.test.results.dir}" quiet="true"/> + <mkdir dir="${build.test.results.dir}"/> + <j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}"> + <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}"/> + </customizeDebuggee> + </j2seproject3:debug> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl"> + <macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${main.class}" name="testClass"/> + <attribute default="" name="testMethod"/> + <element implicit="true" name="customize2" optional="true"/> + <sequential> + <j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}"> + <customize2/> + </j2seproject3:testng-debug> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit"> + <macrodef name="test-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"/> + <attribute default="${main.class}" name="testClass"/> + <attribute default="" name="testMethod"/> + <sequential> + <j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}"> + <customizeDebuggee> + <jvmarg line="${run.jvmargs}"/> + <jvmarg line="${run.jvmargs.ide}"/> + </customizeDebuggee> + </j2seproject3:test-debug-impl> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng"> + <macrodef name="test-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"/> + <attribute default="${main.class}" name="testClass"/> + <attribute default="" name="testMethod"/> + <sequential> + <j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}"> + <customize2> + <syspropertyset> + <propertyref prefix="test-sys-prop."/> + <mapper from="test-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + </customize2> + </j2seproject3:testng-debug-impl> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/> + <!-- + pre NB7.2 profiling section; consider it deprecated + --> + <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/> + <target if="profiler.info.jvmargs.agent" name="-profile-pre-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target if="profiler.info.jvmargs.agent" name="-profile-post-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile"> + <macrodef name="resolve"> + <attribute name="name"/> + <attribute name="value"/> + <sequential> + <property name="@{name}" value="${env.@{value}}"/> + </sequential> + </macrodef> + <macrodef name="profile"> + <attribute default="${main.class}" name="classname"/> + <element name="customize" optional="true"/> + <sequential> + <property environment="env"/> + <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/> + <java classname="@{classname}" dir="${profiler.info.dir}" failonerror="${java.failonerror}" fork="true" jvm="${profiler.info.jvm}"> + <jvmarg line="${endorsed.classpath.cmd.line.arg}"/> + <jvmarg value="${profiler.info.jvmargs.agent}"/> + <jvmarg line="${profiler.info.jvmargs}"/> + <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/> + <arg line="${application.args}"/> + <classpath> + <path path="${run.classpath}"/> + </classpath> + <syspropertyset> + <propertyref prefix="run-sys-prop."/> + <mapper from="run-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <customize/> + </java> + </sequential> + </macrodef> + </target> + <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check"> + <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail> + <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail> + </target> + <!-- + end of pre NB7.2 profiling section + --> + <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> + </nbjpdastart> + </sequential> + </macrodef> + <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1"> + <attribute default="${build.classes.dir}" name="dir"/> + <sequential> + <nbjpdareload> + <fileset dir="@{dir}" includes="${fix.classes}"> + <include name="${fix.includes}*.class"/> + </fileset> + </nbjpdareload> + </sequential> + </macrodef> + </target> + <target name="-init-debug-args"> + <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem"> + <os family="windows"/> + </condition> + <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}"> + <isset property="debug.transport"/> + </condition> + </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" 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"/> + </syspropertyset> + <customize/> + </java> + </sequential> + </macrodef> + </target> + <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"/> + <sequential> + <java classname="@{classname}" dir="${work.dir}" failonerror="${java.failonerror}" fork="true"> + <jvmarg line="${endorsed.classpath.cmd.line.arg}"/> + <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}"/> + <classpath> + <path path="@{classpath}"/> + </classpath> + <syspropertyset> + <propertyref prefix="run-sys-prop."/> + <mapper from="run-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <customize/> + </java> + </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"/> + <element name="customize" optional="true"/> + <sequential> + <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> + <pathconvert property="run.classpath.without.build.classes.dir"> + <path path="${run.classpath}"/> + <map from="${build.classes.dir.resolved}" to=""/> + </pathconvert> + <pathconvert pathsep=" " property="jar.classpath"> + <path path="${run.classpath.without.build.classes.dir}"/> + <chainedmapper> + <flattenmapper/> + <filtermapper> + <replacestring from=" " to="%20"/> + </filtermapper> + <globmapper from="*" to="lib/*"/> + </chainedmapper> + </pathconvert> + <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> + <copylibs compress="${jar.compress}" excludeFromCopy="${copylibs.excludes}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" manifestencoding="UTF-8" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> + <fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/> + <manifest> + <attribute name="Class-Path" value="${jar.classpath}"/> + <customize/> + </manifest> + </copylibs> + </sequential> + </macrodef> + </target> + <target name="-init-presetdef-jar"> + <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1"> + <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifestencoding="UTF-8"> + <j2seproject1:fileset dir="${build.classes.dir}" excludes="${dist.archive.excludes}"/> + </jar> + </presetdef> + </target> + <target name="-init-ap-cmdline-properties"> + <property name="annotation.processing.enabled" value="true"/> + <property name="annotation.processing.processors.list" value=""/> + <property name="annotation.processing.processor.options" value=""/> + <property name="annotation.processing.run.all.processors" value="true"/> + <property name="javac.processorpath" value="${javac.classpath}"/> + <property name="javac.test.processorpath" value="${javac.test.classpath}"/> + <condition property="ap.supported.internal" value="true"> + <not> + <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/> + </not> + </condition> + </target> + <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported"> + <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}"> + <isfalse value="${annotation.processing.run.all.processors}"/> + </condition> + <condition else="" property="ap.proc.none.internal" value="-proc:none"> + <isfalse value="${annotation.processing.enabled}"/> + </condition> + </target> + <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline"> + <property name="ap.cmd.line.internal" value=""/> + </target> + <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/> + <!-- + =================== + COMPILATION SECTION + =================== + --> + <target name="-deps-jar-init" unless="built-jar.properties"> + <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/> + <delete file="${built-jar.properties}" quiet="true"/> + </target> + <target if="already.built.jar.${basedir}" name="-warn-already-built-jar"> + <echo level="warn" message="Cycle detected: Brennenstuhl was already built"/> + </target> + <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps"> + <mkdir dir="${build.dir}"/> + <touch file="${built-jar.properties}" verbose="false"/> + <property file="${built-jar.properties}" prefix="already.built.jar."/> + <antcall target="-warn-already-built-jar"/> + <propertyfile file="${built-jar.properties}"> + <entry key="${basedir}" value=""/> + </propertyfile> + </target> + <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/> + <target depends="init" name="-check-automatic-build"> + <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"> + <param name="no.dependencies" value="true"/> + </antcall> + </target> + <target depends="init,deps-jar" name="-pre-pre-compile"> + <mkdir dir="${build.classes.dir}"/> + </target> + <target name="-pre-compile"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target if="do.depend.true" name="-compile-depend"> + <pathconvert property="build.generated.subdirs"> + <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="*"/> + </dirset> + </pathconvert> + <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/> + </target> + <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile"> + <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/> + <copy todir="${build.classes.dir}"> + <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> + </copy> + </target> + <target if="has.persistence.xml" name="-copy-persistence-xml"> + <mkdir dir="${build.classes.dir}/META-INF"/> + <copy todir="${build.classes.dir}/META-INF"> + <fileset dir="${meta.inf.dir}" includes="persistence.xml orm.xml"/> + </copy> + </target> + <target name="-post-compile"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/> + <target name="-pre-compile-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <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}, module-info.java" sourcepath="${src.dir}"/> + </target> + <target name="-post-compile-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/> + <!-- + ==================== + JAR BUILDING SECTION + ==================== + --> + <target depends="init" name="-pre-pre-jar"> + <dirname file="${dist.jar}" property="dist.jar.dir"/> + <mkdir dir="${dist.jar.dir}"/> + </target> + <target name="-pre-jar"> + <!-- 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"/> + </target> + <target depends="init" if="do.archive+manifest.available" name="-do-jar-copy-manifest"> + <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/> + <copy encoding="${manifest.encoding}" file="${manifest.file}" outputencoding="UTF-8" tofile="${tmp.manifest.file}"/> + </target> + <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+main.class.available" name="-do-jar-set-mainclass"> + <manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update"> + <attribute name="Main-Class" value="${main.class}"/> + </manifest> + </target> + <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+profile.available" name="-do-jar-set-profile"> + <manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update"> + <attribute name="Profile" value="${javac.profile}"/> + </manifest> + </target> + <target depends="init,-do-jar-create-manifest,-do-jar-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-set-splashscreen"> + <basename file="${application.splash}" property="splashscreen.basename"/> + <mkdir dir="${build.classes.dir}/META-INF"/> + <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/> + <manifest encoding="UTF-8" file="${tmp.manifest.file}" mode="update"> + <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/> + </manifest> + </target> + <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,-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="${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"> + <isset property="main.class.available"/> + </condition> + <echo level="${jar.usage.level}" message="${jar.usage.message}"/> + </target> + <target depends="-do-jar-copylibs" if="do.archive" name="-do-jar-delete-manifest"> + <delete> + <fileset file="${tmp.manifest.file}"/> + </delete> + </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,-do-jar-jar,-do-jar-delete-manifest" name="-do-jar-without-libraries"/> + <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,-do-jar-copylibs,-do-jar-delete-manifest" name="-do-jar-with-libraries"/> + <target name="-post-jar"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <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 + ================= + --> + <target depends="init,compile" description="Run a main class." name="run"> + <j2seproject1:java> + <customize> + <arg line="${application.args}"/> + </customize> + </j2seproject1:java> + </target> + <target name="-do-not-recompile"> + <property name="javac.includes.binary" value=""/> + </target> + <target depends="init,compile-single" name="run-single"> + <fail unless="run.class">Must select one file in the IDE or set run.class</fail> + <j2seproject1:java classname="${run.class}"/> + </target> + <target depends="init,compile-test-single" name="run-test-with-main"> + <fail unless="run.class">Must select one file in the IDE or set run.class</fail> + <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/> + </target> + <!-- + ================= + DEBUGGING SECTION + ================= + --> + <target depends="init" if="netbeans.home" name="-debug-start-debugger"> + <j2seproject1:nbjpdastart name="${debug.class}"/> + </target> + <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test"> + <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/> + </target> + <target depends="init,compile" name="-debug-start-debuggee"> + <j2seproject3:debug> + <customizeDebuggee> + <arg line="${application.args}"/> + </customizeDebuggee> + </j2seproject3:debug> + </target> + <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/> + <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto"> + <j2seproject1:nbjpdastart stopclassname="${main.class}"/> + </target> + <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/> + <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single"> + <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> + <j2seproject3:debug classname="${debug.class}"/> + </target> + <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/> + <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test"> + <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> + <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/> + </target> + <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/> + <target depends="init" name="-pre-debug-fix"> + <fail unless="fix.includes">Must set fix.includes</fail> + <property name="javac.includes" value="${fix.includes}.java"/> + </target> + <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix"> + <j2seproject1:nbjpdareload/> + </target> + <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/> + <!-- + ================= + PROFILING SECTION + ================= + --> + <!-- + pre NB7.2 profiler integration + --> + <target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72"> + <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail> + <nbprofiledirect> + <classpath> + <path path="${run.classpath}"/> + </classpath> + </nbprofiledirect> + <profile/> + </target> + <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72"> + <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail> + <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail> + <nbprofiledirect> + <classpath> + <path path="${run.classpath}"/> + </classpath> + </nbprofiledirect> + <profile classname="${profile.class}"/> + </target> + <target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72"> + <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail> + <nbprofiledirect> + <classpath> + <path path="${run.classpath}"/> + </classpath> + </nbprofiledirect> + <profile classname="sun.applet.AppletViewer"> + <customize> + <arg value="${applet.url}"/> + </customize> + </profile> + </target> + <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> + <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 + --> + <target if="netbeans.home" name="-profile-check"> + <condition property="profiler.configured"> + <or> + <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/> + <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/> + </or> + </condition> + </target> + <target depends="-profile-check,-profile-pre72" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent"> + <startprofiler/> + <antcall target="run"/> + </target> + <target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent"> + <fail unless="run.class">Must select one file in the IDE or set run.class</fail> + <startprofiler/> + <antcall target="run-single"/> + </target> + <target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/> + <target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs"> + <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail> + <startprofiler/> + <antcall target="test-single"/> + </target> + <target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main"> + <fail unless="run.class">Must select one file in the IDE or set run.class</fail> + <startprofiler/> + <antcall target="run-test-with-main"/> + </target> + <target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent"> + <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> + <startprofiler/> + <antcall target="run-applet"/> + </target> + <!-- + =============== + JAVADOC SECTION + =============== + --> + <target depends="init" if="have.sources" name="-javadoc-build"> + <mkdir dir="${dist.javadoc.dir}"/> + <condition else="" property="javadoc.endorsed.classpath.cmd.line.arg" value="-J${endorsed.classpath.cmd.line.arg}"> + <and> + <isset property="endorsed.classpath.cmd.line.arg"/> + <not> + <equals arg1="${endorsed.classpath.cmd.line.arg}" arg2=""/> + </not> + </and> + </condition> + <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}"/> + </classpath> + <fileset dir="${src.dir}" excludes="${bug5101868workaround},${excludes}" includes="${includes}"> + <filename name="**/*.java"/> + </fileset> + <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="**/*.java"/> + <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}"> + <filename name="**/doc-files/**"/> + </fileset> + <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="**/doc-files/**"/> + </fileset> + </copy> + </target> + <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview"> + <nbbrowse file="${dist.javadoc.dir}/index.html"/> + </target> + <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/> + <!-- + ========================= + TEST COMPILATION SECTION + ========================= + --> + <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test"> + <mkdir dir="${build.test.classes.dir}"/> + </target> + <target name="-pre-compile-test"> + <!-- 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,-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> + </target> + <target name="-post-compile-test"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/> + <target name="-pre-compile-test-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <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}, 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> + </target> + <target name="-post-compile-test-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/> + <!-- + ======================= + TEST EXECUTION SECTION + ======================= + --> + <target depends="init" if="have.tests" name="-pre-test-run"> + <mkdir dir="${build.test.results.dir}"/> + </target> + <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"> + <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail> + </target> + <target depends="init" if="have.tests" name="test-report"/> + <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/> + <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/> + <target depends="init" if="have.tests" name="-pre-test-run-single"> + <mkdir dir="${build.test.results.dir}"/> + </target> + <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,-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> + <j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/> + </target> + <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,-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 + ======================= + --> + <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test"> + <fail unless="test.class">Must select one file in the IDE or set test.class</fail> + <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/> + </target> + <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method"> + <fail unless="test.class">Must select one file in the IDE or set test.class</fail> + <fail unless="test.method">Must select some method in the IDE or set test.method</fail> + <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/> + </target> + <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,-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="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test"> + <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/> + </target> + <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/> + <!-- + ========================= + APPLET EXECUTION SECTION + ========================= + --> + <target depends="init,compile-single" name="run-applet"> + <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> + <j2seproject1:java classname="sun.applet.AppletViewer"> + <customize> + <arg value="${applet.url}"/> + </customize> + </j2seproject1:java> + </target> + <!-- + ========================= + APPLET DEBUGGING SECTION + ========================= + --> + <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"> + <customizeDebuggee> + <arg value="${applet.url}"/> + </customizeDebuggee> + </j2seproject3:debug> + </target> + <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/> + <!-- + =============== + CLEANUP SECTION + =============== + --> + <target name="-deps-clean-init" unless="built-clean.properties"> + <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/> + <delete file="${built-clean.properties}" quiet="true"/> + </target> + <target if="already.built.clean.${basedir}" name="-warn-already-built-clean"> + <echo level="warn" message="Cycle detected: Brennenstuhl was already built"/> + </target> + <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps"> + <mkdir dir="${build.dir}"/> + <touch file="${built-clean.properties}" verbose="false"/> + <property file="${built-clean.properties}" prefix="already.built.clean."/> + <antcall target="-warn-already-built-clean"/> + <propertyfile file="${built-clean.properties}"> + <entry key="${basedir}" value=""/> + </propertyfile> + </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"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/> + <target name="-check-call-dep"> + <property file="${call.built.properties}" prefix="already.built."/> + <condition property="should.call.dep"> + <and> + <not> + <isset property="already.built.${call.subproject}"/> + </not> + <available file="${call.script}"/> + </and> + </condition> + </target> + <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep"> + <ant antfile="${call.script}" inheritall="false" target="${call.target}"> + <propertyset> + <propertyref prefix="transfer."/> + <mapper from="transfer.*" to="*" type="glob"/> + </propertyset> + </ant> + </target> +</project> diff --git a/Brennenstuhl/nbproject/genfiles.properties b/Brennenstuhl/nbproject/genfiles.properties new file mode 100644 index 0000000..56d6dc4 --- /dev/null +++ b/Brennenstuhl/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=2cdd87f6 +build.xml.script.CRC32=9d412d19 +build.xml.stylesheet.CRC32=f85dc8f2@1.93.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=2cdd87f6 +nbproject/build-impl.xml.script.CRC32=08c29b05 +nbproject/build-impl.xml.stylesheet.CRC32=f89f7d21@1.93.0.48 diff --git a/Brennenstuhl/nbproject/project.properties b/Brennenstuhl/nbproject/project.properties new file mode 100644 index 0000000..28a65bf --- /dev/null +++ b/Brennenstuhl/nbproject/project.properties @@ -0,0 +1,113 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processor.options= +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#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: +dist.dir=dist +dist.jar=${dist.dir}/Brennenstuhl.jar +dist.javadoc.dir=${dist.dir}/javadoc +dist.jlink.dir=${dist.dir}/jlink +dist.jlink.output=${dist.jlink.dir}/Brennenstuhl +excludes= +file.reference.commons-io-2.6.jar=C:\\NetBeans\\TobisThesisWork\\lib\\commons-io-2.6.jar +file.reference.dis-enums-1.3.jar=C:\\NetBeans\\TobisThesisWork\\lib\\dis-enums-1.3.jar +file.reference.guava-28.0-jre.jar=C:\\NetBeans\\TobisThesisWork\\lib\\guava-28.0-jre.jar +file.reference.Jama-1.0.3.jar=C:\\NetBeans\\TobisThesisWork\\lib\\Jama-1.0.3.jar +file.reference.open-dis7-entities-all.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-entities-all.jar +file.reference.open-dis7-java.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-java.jar +file.reference.open-dis7-javadoc.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-javadoc.jar +file.reference.open-dis7-source.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7-source.jar +file.reference.open-dis7.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis7.jar +file.reference.open-dis_4.16.jar=C:\\NetBeans\\TobisThesisWork\\lib\\open-dis_4.16.jar +includes=** +jar.compress=false +javac.classpath=\ + ${file.reference.Jama-1.0.3.jar}:\ + ${file.reference.commons-io-2.6.jar}:\ + ${file.reference.dis-enums-1.3.jar}:\ + ${file.reference.guava-28.0-jre.jar}:\ + ${file.reference.open-dis7-entities-all.jar}:\ + ${file.reference.open-dis7-java.jar}:\ + ${file.reference.open-dis7-javadoc.jar}:\ + ${file.reference.open-dis7-source.jar}:\ + ${file.reference.open-dis7.jar}:\ + ${file.reference.open-dis_4.16.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=14 +javac.target=14 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.modulepath=\ + ${javac.modulepath} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.html5=false +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +# The jlink additional root modules to resolve +jlink.additionalmodules= +# The jlink additional command line parameters +jlink.additionalparam= +jlink.launcher=true +jlink.launcher.name=Brennenstuhl +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# 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/Brennenstuhl/nbproject/project.xml b/Brennenstuhl/nbproject/project.xml new file mode 100644 index 0000000..e1bea72 --- /dev/null +++ b/Brennenstuhl/nbproject/project.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://www.netbeans.org/ns/project/1"> + <type>org.netbeans.modules.java.j2seproject</type> + <configuration> + <data xmlns="http://www.netbeans.org/ns/j2se-project/3"> + <name>Brennenstuhl</name> + <source-roots> + <root id="src.dir"/> + </source-roots> + <test-roots> + <root id="test.src.dir"/> + </test-roots> + </data> + </configuration> +</project> diff --git a/Brennenstuhl/src/DISTools/Compressor.java b/Brennenstuhl/src/DISTools/Compressor.java new file mode 100644 index 0000000..a76e263 --- /dev/null +++ b/Brennenstuhl/src/DISTools/Compressor.java @@ -0,0 +1,174 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; + +import static java.lang.Math.pow; +import static java.lang.Math.sqrt; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Set; +import java.util.TreeMap; + +/** + * + * @author tobia + */ +public class Compressor { + + private LinkedHashMap<Double, Coordinates> localMap; + + public Compressor(LinkedHashMap<Double, Coordinates> localHashMap) { + + //copy the given HashMap to a localMap + this.localMap = new LinkedHashMap<>(); + + Set<Double> keys = localHashMap.keySet(); + + for (Double k : keys) { + + localMap.put(k, localHashMap.get(k)); + + } + + System.out.println("DISTools.Regression.<init>()"); + + } + + public TreeMap<Double, Coordinates> doCompression() { + + System.out.println("DISTools.Regression.doRegression()"); + + //Check whether points could be deleted to compress the stream + //https://www.crashkurs-statistik.de/einfache-lineare-regression/ + TreeMap<Double, Coordinates> streamMap = new TreeMap<>(); + + Set<Double> keys = localMap.keySet(); + + //Copy LinkedHashMap into TreeMap to be able to pull the first element. + streamMap.putAll(localMap); + + TreeMap<Double, Coordinates> returnMap = new TreeMap<>(); + //TreeMap of slidingWindows will store all of the points that are currently processed + //use .pullFirstEntry() to get rid of the points at the beginning. + TreeMap<Double, Coordinates> slidingWindow = new TreeMap<>(); + + boolean addToWindow = true; + + while (streamMap.size() > 0) { + slidingWindow.put(streamMap.firstEntry().getKey(), streamMap.get(streamMap.firstEntry().getKey())); + streamMap.pollFirstEntry(); + + //Calculate the mean and SD + Set<Double> slidingWindowKeys = slidingWindow.keySet(); + + if (slidingWindow.size() >= 3) { + + List<Double> tList = new ArrayList<>(); + List<Double> xList = new ArrayList<>(); + List<Double> yList = new ArrayList<>(); + List<Double> zList = new ArrayList<>(); + + + + + Double[] k = new Double[slidingWindowKeys.size()]; + slidingWindowKeys.toArray(k); + + for (int i = 0; i < slidingWindow.size(); i++) { + + //Fix Loop to fill Arrays + tList.add(i, k[i]); + + xList.add(i, slidingWindow.get(k[i]).getX()); + + yList.add(i, slidingWindow.get(k[i]).getY()); + + zList.add(i, slidingWindow.get(k[i]).getZ()); + + } + + + + //calculate triangle according to the homepage + for (int i = 0; i < slidingWindow.size(); i++) { + + + //Calculate Area of Triangle + //http://www.ambrsoft.com/TrigoCalc/Line3D/LineColinear.htm + double a = sqrt(pow(xList.get(1) - xList.get(0), 2) + pow(yList.get(1) - yList.get(0), 2) + pow(zList.get(1) - zList.get(0), 2)); + double b = sqrt(pow(xList.get(i) - xList.get(0), 2) + pow(yList.get(i) - yList.get(0), 2) + pow(zList.get(i) - zList.get(0), 2)); + double c = sqrt(pow(xList.get(i) - xList.get(1), 2) + pow(yList.get(i) - yList.get(1), 2) + pow(zList.get(i) - zList.get(1), 2)); + + double s = (a + b + c) / 2; + + double areaA = sqrt(s * (s - a) * (s - b) * (s - c)); + + if ((areaA >= 0.1) || (tList.get(i) - tList.get(0) >= 4.0)) { + + System.out.println("Threshold met. Break"); + + //grab the first and the last point from the regression test and push it to the returnMap + Coordinates firstPoint = new Coordinates(); + firstPoint.setX(xList.get(0)); + firstPoint.setY(yList.get(0)); + firstPoint.setZ(zList.get(0)); + + Coordinates lastPoint = new Coordinates(xList.get(i), yList.get(i), zList.get(i)); + + returnMap.put(tList.get(0), firstPoint); + returnMap.put(tList.get(i), lastPoint); + + slidingWindow.clear(); + + tList.clear(); + xList.clear(); + yList.clear(); + zList.clear(); + + break; + } + + if ((areaA <= 0.1) && (tList.get(i) - tList.get(0) <= 4.0) && streamMap.size() == 0) { + + System.out.println("StreamMap empty. All points left will be added. Break"); + + //grab the first and the last point from the regression test and push it to the returnMap + for (int j = 0; j < slidingWindow.size(); j++) { + + Coordinates leftPoints = new Coordinates(xList.get(j), yList.get(j), zList.get(j)); + + returnMap.put(tList.get(j), leftPoints); + + } + + + + break; + } + + + System.out.println("Area of Triangle: " + areaA); + + } + + + } + + }; + + return returnMap; + + } + + ; + + private void calcValues() { + + } +; + +} diff --git a/Brennenstuhl/src/DISTools/Coordinates.java b/Brennenstuhl/src/DISTools/Coordinates.java new file mode 100644 index 0000000..2f2c85b --- /dev/null +++ b/Brennenstuhl/src/DISTools/Coordinates.java @@ -0,0 +1,58 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; + +/** + * + * @author tobia + */ +public class Coordinates { + + private double x; + private double y; + private double z; + + public Coordinates(double x, double y, double z) { + this.setX(x); + this.setY(y); + this.setZ(z); + } + + public Coordinates() { + this.setX(0.0); + this.setY(0.0); + this.setZ(0.0); + } + + + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getZ() { + return z; + } + + public void setZ(double z) { + this.z = z; + } + + + +} diff --git a/Brennenstuhl/src/DISTools/EspduReceiver.java b/Brennenstuhl/src/DISTools/EspduReceiver.java new file mode 100644 index 0000000..7e1ff22 --- /dev/null +++ b/Brennenstuhl/src/DISTools/EspduReceiver.java @@ -0,0 +1,111 @@ +package DISTools; + +import java.io.*; +import java.net.*; +import java.util.*; + +import edu.nps.moves.dis7.*; +import edu.nps.moves.dis7.util.*; + +/** + * Receives PDUs from the network in IEEE DIS format. + * Adapted from OpenDIS library example package edu.nps.moves.examples + * + * @author DMcG + * @version $Id:$ + */ +public class EspduReceiver +{ + /** Max size of a PDU in binary format that we can receive. This is actually + * somewhat outdated--PDUs can be larger--but this is a reasonable starting point. + */ + public static final int MAX_PDU_SIZE = 8192; + + /** Default multicast group address we send on. */ + public String DEFAULT_MULTICAST_ADDRESS; + + /** Default multicast port used, matches Wireshark DIS capture default */ + public int DEFAULT_MULTICAST_PORT; + + public String receive(String localBroadCastAddress, int localPort) + { + System.out.println("DisExamplesOpenDis7.EspduReceiver started..."); + + String returnString; + returnString = new String("Test Return Receiver \n"); + + this.DEFAULT_MULTICAST_ADDRESS = localBroadCastAddress; + this.DEFAULT_MULTICAST_PORT = localPort; + + + MulticastSocket socket; + DatagramPacket packet; + InetAddress address; + PduFactory pduFactory = new PduFactory(); + + try { + // Specify the socket to receive data + socket = new MulticastSocket(DEFAULT_MULTICAST_PORT); +// socket.setBroadcast(true); + + address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS); + socket.joinGroup(address); + + + byte buffer[] = new byte[MAX_PDU_SIZE]; + packet = new DatagramPacket(buffer, buffer.length); + + socket.receive(packet); + + List<Pdu> pduBundle = pduFactory.getPdusFromBundle(packet.getData(),packet.getLength()); + if (pduBundle.size() > 1) + System.out.println("Bundle size is " + pduBundle.size()); + returnString += "Bundle size is "+ pduBundle.size(); + Iterator iterator = pduBundle.iterator(); + + while (iterator.hasNext()) + { + Pdu aPdu = (Pdu)iterator.next(); + String receiptMessage = "received PDU type " + aPdu.getPduType().getValue() + "=" + aPdu.getPduType().name() + " " + aPdu.getClass().getName(); + if (aPdu instanceof EntityStatePdu) + { + System.out.println("==============="); + returnString += "===============\n"; + System.out.println(receiptMessage); + returnString += receiptMessage + "\n"; + EntityID entityID = ((EntityStatePdu)aPdu).getEntityID(); + Vector3Double position = ((EntityStatePdu)aPdu).getEntityLocation(); + System.out.println(" entityID triplet: [" + entityID.getSiteID()+ ", " + entityID.getApplicationID()+ ", " + entityID.getEntityID()+ "] "); + returnString += " entityID triplet: [" + entityID.getSiteID()+ ", " + entityID.getApplicationID()+ ", " + entityID.getEntityID()+ "] "; + System.out.println(" Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]\n"); + returnString += " Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]\n"; + } + else if (aPdu instanceof FirePdu) + { + System.out.println(receiptMessage); + returnString += receiptMessage + "\n"; + Vector3Double position = ((FirePdu)aPdu).getLocationInWorldCoordinates(); + System.out.println(" FirePdu locationInWorldCoordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]"); + returnString += " FirePdu locationInWorldCoordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]\n"; + } + else + { + System.out.println(receiptMessage); + returnString += receiptMessage + "\n"; + } + } // end iterator loop through PDU bundle + + } // end try block + catch (IOException e) + { + System.out.println("Problem with DisExamplesOpenDis7.EspduReceiver, see exception trace:"); + returnString += "Problem with DisExamplesOpenDis7.EspduReceiver, see exception trace:\n"; + System.out.println(e); + returnString += e + "\n"; + } + System.out.println("DisExamplesOpenDis7.EspduReceiver complete."); + + return returnString; + + } // end main +} // end class diff --git a/Brennenstuhl/src/DISTools/EspduSender.java b/Brennenstuhl/src/DISTools/EspduSender.java new file mode 100644 index 0000000..68704c9 --- /dev/null +++ b/Brennenstuhl/src/DISTools/EspduSender.java @@ -0,0 +1,361 @@ +package DISTools; + +import java.io.*; +import java.net.*; +import java.util.*; + +import edu.nps.moves.dis7.*; +import edu.nps.moves.dis7.util.*; + +/** + * Creates and sends ESPDUs in IEEE binary format. Adapted from OpenDIS library + * example package edu.nps.moves.examples + * + * @author Don McGregor + * @author Don Brutzman + */ +public class EspduSender +{ + public static final int NUMBER_TO_SEND = 1; // 5000 + + /** + * Default multicast group address we send on. + */ + public String DEFAULT_MULTICAST_ADDRESS = "239.1.2.3"; + + /** + * Default multicast port used, matches Wireshark DIS capture default + */ + public int DEFAULT_MULTICAST_PORT = 3000; + + public enum NetworkMode { + UNICAST, MULTICAST, BROADCAST + }; + + /** + * Possible system properties, passed in via -Dattr=val networkMode: + * unicast, broadcast, multicast destinationIp: where to send the packet.If + in multicast mode, this can be multicast.To determine broadcast + destination IP, use an online broadcast address calculator, for example + http://www.remotemonitoringsystems.ca/broadcast.php If in multicast mode, + a join() will be done on the multicast address.port: port used for both + source and destination. + * + * + * @param localBroadCastAddress + * @param localPort + * @return + */ + public String send(String localBroadCastAddress, int localPort) + { + String returnString; + returnString = new String(); + this.DEFAULT_MULTICAST_ADDRESS = localBroadCastAddress; + this.DEFAULT_MULTICAST_PORT = localPort; + + + System.out.println("DisExamplesOpenDis7.EspduSender started..."); + + // Default settings. These are used if no system properties are set. + // If system properties are passed in, these are overridden later. + NetworkMode networkMode = NetworkMode.BROADCAST; + InetAddress address = null; // must be initialized, even if null + int port = DEFAULT_MULTICAST_PORT; + MulticastSocket socket = null; // must be initialized to avoid later error, even if null; + EntityStatePdu espdu = new EntityStatePdu(); + DisTime disTime = new DisTime(); + + // ICBM coordinates for my office + double latitude = 36.595517; + double longitude = -121.877000; + try + { + address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS); + } + catch (UnknownHostException e) + { + System.out.println(e + " Cannot create multicast address"); + System.exit(0); + } + + // All system properties, passed in on the command line via -Dattribute=value + Properties systemProperties = System.getProperties(); + + // IP address we send to + String destinationIpString = systemProperties.getProperty("destinationIp"); + + // Port we send to, and local port we open the socket on + String portString = systemProperties.getProperty("port"); + + // Network mode: unicast, multicast, broadcast + String networkModeString = systemProperties.getProperty("networkMode"); // unicast or multicast or broadcast + + // Set up socket to send information + try + { + if (portString != null) // Update port we send to, if provided + { + port = Integer.parseInt(portString); + } + socket = new MulticastSocket(port); + + // Where we send packets to, the destination IP address + if (destinationIpString != null) + { + address = InetAddress.getByName(destinationIpString); + } + + // Type of transport: unicast, broadcast, or multicast + if (networkModeString != null) + { + if (networkModeString.equalsIgnoreCase("unicast")) + { + networkMode = NetworkMode.UNICAST; + } + else if (networkModeString.equalsIgnoreCase("broadcast")) + { + networkMode = NetworkMode.BROADCAST; + } + else if (networkModeString.equalsIgnoreCase("multicast")) + { + networkMode = NetworkMode.MULTICAST; + if (!address.isMulticastAddress()) + { + throw new RuntimeException("*** Error: sending to multicast address, but destination address " + address.toString() + "is not multicast"); + } + socket.joinGroup(address); + } + } // end networkModeString + } + catch (IOException | RuntimeException e) + { + System.out.println("Unable to initialize network correctly, exiting."); + System.out.println(e); + System.exit(-1); // outta here + } + + // Initialize values in the Entity State PDU object. The exercise ID is + // a way to differentiate between different virtual worlds on one network. + // Note that some values (such as the PDU type and PDU family) are set + // automatically when you create the ESPDU. + espdu.setExerciseID((byte)1); //(short) 1); + + // The EID is the unique identifier for objects in the world. This + // EID should match up with the ID for the object specified in the + // VMRL/x3d/virtual world. + + EntityID entityID = espdu.getEntityID(); // initialize, reset, override + // TODO check: 0 is apparently not a valid site number, per DIS specification + entityID.setSiteID ((short)1); // TODO utility method to allow int values + entityID.setApplicationID((short)2); + entityID.setEntityID ((short)3); + espdu.setEntityID(entityID); + + // Set the entity type. SISO has a big list of enumerations, so that by + // specifying various numbers we can say this is an M1A2 American tank, + // the USS Enterprise, and so on. We'll make this a tank. There is a + // separate project elsehwhere in this project that implements DIS + // enumerations in C++ and Java, but to keep things simple we just use + // numbers here. + + // New way using entity jar(s) + espdu.setEntityType(new edu.nps.moves.dis7.entities.usa.platform.land.M1A2()); + + // Manual way: + /* + EntityType entityType = espdu.getEntityType(); + entityType.setEntityKind(EntityKind.PLATFORM); //(short) 1); // Platform (vs lifeform, munition, sensor, etc.) + entityType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA); //225); // USA + entityType.setDomain(Domain.inst(PlatformDomain.LAND)); // Land (vs air, surface, subsurface, space) + entityType.setCategory((byte) 1); // Tank + entityType.setSubCategory((byte) 1); // M1 Abrams + entityType.setSpecific((byte) 3); // M1A2 Abrams + */ + Set<InetAddress> broadcastAddresses; + + try // Loop through sending N ESPDUs + { + System.out.println("Sending " + NUMBER_TO_SEND + " sets of packets:"); // + address.toString() + + for (int index = 0; index < NUMBER_TO_SEND; index++) { + // DIS time is a pain in the uh, neck. DIS time units are 2^31-1 units per + // hour, and time is set to DIS time units from the top of the hour. + // This means that if you start sending just before the top of the hour + // the time units can roll over to zero as you are sending. The receivers + // (escpecially homegrown ones) are often not able to detect rollover + // and may start discarding packets as dupes or out of order. We use + // an NPS timestamp here, hundredths of a second since the start of the + // year. The DIS standard for time is often ignored in the wild; I've seen + // people use Unix time (seconds since 1970) and more. Or you can + // just stuff idx into the timestamp field to get something that is monotonically + // increasing. + + // Note that timestamp is used to detect duplicate and out of order packets. + // That means if you DON'T change the timestamp, many implementations will simply + // discard subsequent packets that have an identical timestamp. Also, if they + // receive a PDU with an timestamp lower than the last one they received, they + // may discard it as an earlier, out-of-order PDU. So it is a good idea to + // update the timestamp on ALL packets sent. + // An alterative approach: actually follow the standard. It's a crazy concept, + // but it might just work. + int timestamp = disTime.getDisAbsoluteTimestamp(); + espdu.setTimestamp(timestamp); + + // Set the position of the entity in the world. DIS uses a cartesian + // coordinate system with the origin at the center of the earth, the x + // axis out at the equator and prime meridian, y out at the equator and + // 90 deg east, and z up and out the north pole. To place an object on + // the earth's surface you also need a model for the shape of the earth + // (it's not a sphere.) All the fancy math necessary to do this is in + // the SEDRIS SRM package. There are also some one-off formulas for + // doing conversions from, for example, lat/lon/altitude to DIS coordinates. + // Here we use those one-off formulas. + // Modify the position of the object. This will send the object a little + // due east by adding some to the longitude every iteration. Since we + // are on the Pacific coast, this sends the object east. Assume we are + // at zero altitude. In other worlds you'd use DTED to determine the + // local ground altitude at that lat/lon, or you'd just use ground clamping. + // The x and y values will change, but the z value should not. + //lon = lon + (double)((double)idx / 100000.0); + //System.out.println("lla=" + lat + "," + lon + ", 0.0"); + double direction = Math.pow((double) (-1.0), (double) (index)); + longitude = longitude + (direction * 0.00006); + + double disCoordinates[] = CoordinateConversions.getXYZfromLatLonDegrees(latitude, longitude, 1.0); + Vector3Double location = espdu.getEntityLocation(); + location.setX(disCoordinates[0]); + location.setY(disCoordinates[1]); + location.setZ(disCoordinates[2]); + System.out.println("==============="); + returnString += "===============\n"; + System.out.println("Create new PDUs"); + returnString += "Create new PDU\n"; + System.out.println(" latitude, longitude: [" + latitude + ", " + longitude + "]"); + returnString += " latitude, longitude: [" + latitude + ", " + longitude + "]\n"; + System.out.println(" coordinate conversion: [" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2] + "]"); + returnString += " coordinate conversion: [" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2] + "]\n"; + location = espdu.getEntityLocation(); + + System.out.println("Espdu #" + index + " entityID=[" + entityID.getSiteID()+ "," + entityID.getApplicationID()+ "," + entityID.getEntityID()+ "]"); + returnString += "Espdu #" + index + " entityID=[" + entityID.getSiteID()+ "," + entityID.getApplicationID()+ "," + entityID.getEntityID()+ "]\n"; + double c[] = {location.getX(), location.getY(), location.getZ()}; + double lla[] = CoordinateConversions.xyzToLatLonDegrees(c); +// System.out.println(" DIS entityLocation: [" + location.getX() + "," + location.getY() + "," + location.getZ() + "]"); + String debugString = " Location (latitude/longitude/altitude): [" + lla[0] + ", " + lla[1] + ", " + lla[2] + "]"; +// System.out.println(debugString); + + // Optionally, we can do some rotation of the entity + /* + Orientation orientation = espdu.getEntityOrientation(); + float psi = orientation.getPsi(); + psi = psi + idx; + orientation.setPsi(psi); + orientation.setTheta((float)(orientation.getTheta() + idx /2.0)); + */ + // You can set other ESPDU values here, such as the velocity, acceleration, + // and so on. + // Marshal out the espdu object to a byte array, then send a datagram + // packet with that data in it. + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + DatagramPacket packet; + + // The byte array here is the packet in DIS format. We put that into a + // datagram and send it. + espdu.marshal(dos); + byte[] espduArray = baos.toByteArray(); + + FirePdu firePdu = new FirePdu(); + firePdu.setLocationInWorldCoordinates(espdu.getEntityLocation()); + byte[] fireArray = firePdu.marshal(); + + broadcastAddresses = getBroadcastAddresses(); + Iterator iterator = broadcastAddresses.iterator(); + while (iterator.hasNext()) + { + InetAddress broadcast = (InetAddress) iterator.next(); + if (espduArray.length > 0) + { + System.out.println("Sending espdu datagram packet to " + broadcast); + returnString += "Sending espdu datagram packet to " + broadcast + "\n"; + packet = new DatagramPacket(espduArray, espduArray.length, broadcast, port); + socket.send(packet); + } + // TODO experiment with these! 8) + if (fireArray.length > 0) + { + System.out.println("Sending fire datagram packet to " + broadcast); + returnString += "Sending fire datagram packet to " + broadcast + "\n"; + packet = new DatagramPacket(fireArray, fireArray.length, broadcast, port); // alternate + socket.send(packet); + } + } + + // Send every 1 second within loop. Otherwise all this will be all over in a fraction of a second. + Thread.sleep(1000); // msec + } + } + catch (Exception e) + { + System.out.println("Problem with DisExamplesOpenDis7.EspduSender, see exception trace:"); + System.out.println(e); + } + System.out.println("==============="); + System.out.println("DisExamplesOpenDis7.EspduSender complete."); + + return returnString; + } + + /** + * A number of sites get all snippy about using 255.255.255.255 for a + * broadcast address; it trips their security software and they kick you off + * their network. (Comcast, NPS, etc.) This determines the broadcast address for + * all connected interfaces, based on the IP and subnet mask. If you have a + * dual-homed host it will return a broadcast address for both. If you have + * some VMs running on your host this will pick up the addresses for those + * as well--e.g. running VMWare on your laptop with a local IP this will also + * pick up a 192.168 address assigned to the VM by the host OS. + * + * @return set of all broadcast addresses + */ + public static Set<InetAddress> getBroadcastAddresses() + { + Set<InetAddress> broadcastAddresses = new HashSet<>(); + Enumeration interfaces; + + try { + interfaces = NetworkInterface.getNetworkInterfaces(); + + while (interfaces.hasMoreElements()) + { + NetworkInterface anInterface = (NetworkInterface) interfaces.nextElement(); + + if (anInterface.isUp()) + { + Iterator iterator = anInterface.getInterfaceAddresses().iterator(); + while (iterator.hasNext()) + { + InterfaceAddress anAddress = (InterfaceAddress) iterator.next(); + if ((anAddress == null || anAddress.getAddress().isLinkLocalAddress())) + { + continue; + } + + //System.out.println("Getting broadcast address for " + anAddress); + InetAddress broadcastAddress = anAddress.getBroadcast(); + if (broadcastAddress != null) + { + broadcastAddresses.add(broadcastAddress); + } + } + } + } + } + catch (SocketException e) + { + System.out.println("Problem with DisExamplesOpenDis7.EspduSender.getBroadcastAddresses(), see exception trace:"); + System.out.println(e); + } + return broadcastAddresses; + } +} diff --git a/Brennenstuhl/src/DISTools/PduListenerSaver.java b/Brennenstuhl/src/DISTools/PduListenerSaver.java new file mode 100644 index 0000000..7e5a6be --- /dev/null +++ b/Brennenstuhl/src/DISTools/PduListenerSaver.java @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All rights reserved. + * This work is licensed under the BSD open source license, available at https://www.movesinstitute.org/licenses/bsd.html + */ +package DISTools; + +import java.io.IOException; +import java.util.Scanner; + +/** + * PduSaver.java created on Aug 21, 2019 + * MOVES Institute Naval Postgraduate School, Monterey, CA, USA www.nps.edu + * + * @author Mike Bailey, jmbailey@nps.edu + * @version $Id$ + */ +public class PduListenerSaver +{ + private final static String DEFAULT_OUTPUTDIR = "pduLog"; + private final static String MCAST_ADDR = "239.1.2.3"; + private final static int DIS_PORT = 3000; + + private enum mystate + { + RUNNING, + PAUSED; + } + + public static void main(String[] args) + { + String outDir = DEFAULT_OUTPUTDIR; + String mcast = MCAST_ADDR; + int port = DIS_PORT; + + System.out.println("DisExamplesOpenDis7.PduListenerSaver started..."); + + switch (args.length) { + case 0: + break; + case 1: + outDir = args[0]; + break; + case 3: + outDir = args[0]; + mcast = args[1]; + port = Integer.parseInt(args[2]); + break; + default: + System.err.println("Usage: PduListener() or PduListener(\"outputdir\") or PduListener(\"outputdir\",\"multicast address\", ipPort"); + System.exit(1); + } + + System.out.println("Beginning pdu save to directory " + outDir); + try { + + //RecorderTobi stores an unencoded PduLog + RecorderTobi recorder = new RecorderTobi(outDir, mcast, port); + //Recorder stores a BASE64 encoded PduLod + //Recorder recorder = new Recorder(outDir, mcast, port); + + recorder.startResume(); + mystate state = mystate.RUNNING; + System.out.println("* recorder.startResume(), state=RUNNING, recording in progress..."); + Scanner scan = new Scanner(System.in); + + while (true) { + System.out.println("Warning: you must quit when complete, otherwise recorded PDUs are lost!"); + System.out.println("Type p/enter to pause, r/enter to resume, q/enter to stop recording, save and quit"); + String line = scan.nextLine(); + if (line.equalsIgnoreCase("p") && state == mystate.RUNNING) { + recorder.stopPause(); + state = mystate.PAUSED; + System.out.println("* recorder.stopPause(), state=PAUSED, recording paused..."); + } + else if (line.equalsIgnoreCase("r") && state == mystate.PAUSED) { + recorder.startResume(); + state = mystate.RUNNING; + System.out.println("* recorder.startResume(), state=RUNNING, recording in progress..."); + } + else if (line.equalsIgnoreCase("q")) { + recorder.end(); + System.out.println("* recorder.end(), recording complete."); + break; + } + } + System.out.println("Ending pdu save to "+recorder.getLogFile()); + } + catch (IOException ex) { + System.err.println("*** Exception: " + ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage()); + } + } +} diff --git a/Brennenstuhl/src/DISTools/PduReaderPlayer.java b/Brennenstuhl/src/DISTools/PduReaderPlayer.java new file mode 100644 index 0000000..1ebd172 --- /dev/null +++ b/Brennenstuhl/src/DISTools/PduReaderPlayer.java @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All rights reserved. + * This work is licensed under the BSD open source license, available at https://www.movesinstitute.org/licenses/bsd.html + */ +package DISTools; + +import java.io.File; +import java.io.IOException; +import java.util.Scanner; + +/** + * PduSaver.java created on Aug 21, 2019 MOVES Institute Naval Postgraduate + * School, Monterey, CA, USA www.nps.edu + * + * @author Mike Bailey, jmbailey@nps.edu + * @version $Id$ + */ +public class PduReaderPlayer { + + private final static String DEFAULT_OUTPUTDIR = "pduLog"; + private final static String MCAST_ADDR = "239.1.2.3"; + private final static int DIS_PORT = 3000; + + private enum mystate { + RUNNING, + PAUSED; + } + + public static void main(String[] args) { + String outDir = DEFAULT_OUTPUTDIR; + String mcast = MCAST_ADDR; + int port = DIS_PORT; + + System.out.println("DisExamplesOpenDis7.PduReaderPlayer started..."); + + switch (args.length) { + case 0: + break; + case 1: + outDir = args[0]; + break; + case 3: + outDir = args[0]; + mcast = args[1]; + port = Integer.parseInt(args[2]); + break; + default: + System.err.println("Usage: PduReaderPlayer() or PduReaderPlayer(\"outputdir\") or PduReaderPlayer(\"outputdir\",\"multicast address\", ipPort"); + System.exit(1); + } + + System.out.println("Beginning pdu playback from directory " + outDir); + try { + //Use Tobis Code without decryption + //Does only work with unecrypted PduLogs + PlayerTobi player = new PlayerTobi(mcast, port, new File(outDir).toPath()); + + //Use Mikes Code + //Player player = new Player(mcast, port, new File(outDir).toPath()); + player.startResume(); + mystate state = mystate.RUNNING; + Scanner scan = new Scanner(System.in); + + while (true) { + System.out.println("Type p/enter to pause, r/enter to resume, q/enter to quit"); + String line = scan.nextLine(); + if (line.equalsIgnoreCase("p") && state == mystate.RUNNING) { + player.stopPause(); + state = mystate.PAUSED; + } else if (line.equalsIgnoreCase("r") && state == mystate.PAUSED) { + player.startResume(); + state = mystate.RUNNING; + } else if (line.equalsIgnoreCase("q")) { + player.end(); + break; + } + } + System.out.println("Ending pdu files playback for directory " + outDir); + System.out.println("DisExamplesOpenDis7.PduReaderPlayer complete."); + System.exit(0); // not sure why this is necessary with Netbeans... + } catch (IOException ex) { + System.err.println("Exception: " + ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage()); + } + } +} diff --git a/Brennenstuhl/src/DISTools/PduReceiver.java b/Brennenstuhl/src/DISTools/PduReceiver.java new file mode 100644 index 0000000..01a3a50 --- /dev/null +++ b/Brennenstuhl/src/DISTools/PduReceiver.java @@ -0,0 +1,12 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; + + +public interface PduReceiver +{ + void receivePdu(byte[] buff, int len); +} diff --git a/Brennenstuhl/src/DISTools/Player.java b/Brennenstuhl/src/DISTools/Player.java new file mode 100644 index 0000000..057dc7c --- /dev/null +++ b/Brennenstuhl/src/DISTools/Player.java @@ -0,0 +1,242 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; +/** + * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All rights reserved. + * This work is licensed under the BSD open source license, available at https://www.movesinstitute.org/licenses/bsd.html + */ + +import com.google.common.primitives.Longs; + +import java.io.*; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Base64; + +import static DISTools.Recorder.*; + +public class Player +{ + private Path disLogDirectory; + private String ip; + private int port; + private Thread thrd; + + public Player(String ip, int port, Path disLogDirectory) throws IOException + { + this.disLogDirectory = disLogDirectory; + this.ip = ip; + this.port = port; + + thrd = new Thread(() -> begin()); + thrd.setPriority(Thread.NORM_PRIORITY); + thrd.setName("PlayerThread"); + thrd.setDaemon(true); + thrd.start(); + } + + private Integer scenarioPduCount = null; + private boolean showPduCountsOneTime = false; + private int pduCount = 0; + private DatagramSocket dsock; + private BufferedReader brdr; + private Long startNanoTime = null; + private boolean paused = false; + + @SuppressWarnings("StatementWithEmptyBody") + public void begin() + { + try { + System.out.println("Replaying DIS logs."); + InetAddress addr = InetAddress.getByName(ip); + + FilenameFilter filter = (dir, name) -> name.endsWith(Recorder.DISLOG_FILE_TAIL) && !name.startsWith("."); + + File[] fs = disLogDirectory.toFile().listFiles(filter); + if (fs == null) + fs = new File[0]; + + Arrays.sort(fs, (f1, f2) -> { + return f1.getName().compareTo(f2.getName()); + }); + //Arrays.sort(fs, Comparator.comparing(File::getName)); + + dsock = new DatagramSocket(); + Base64.Decoder decdr = Base64.getDecoder(); + + for (File f : fs) { + System.out.println("Replaying " + f.getAbsolutePath()); + brdr = new BufferedReader(new FileReader(f), 1024 * 200); // 200kb buffer + + String line = brdr.readLine(); + while (line != null && !Thread.interrupted()) { + while (paused) { + sleep(500l); // half sec + } + if (line.length() <= 0) + ; // blank lines ok + else if (line.startsWith(COMMENT_MARKER)) { + if (handleComment(line, f)) { + // here if we got an end comment + break; // out of read loop + } + } + else { + + String[] sa = line.split(","); + if (sa.length != 2) { + System.err.println("Error: parsing error. Line follows."); + System.err.println(line); + byebye(); + } + + if (startNanoTime == null) + startNanoTime = System.nanoTime(); + + byte[] pduTimeBytes = decdr.decode(sa[0]); + long pduTimeInterval = Longs.fromByteArray(pduTimeBytes); + // This is a relative number in nanoseconds of the time of packet reception minus first packet reception for scenario. + + long targetSimTime = startNanoTime + pduTimeInterval; // when we should send the packet + long now = System.nanoTime(); + long sleepTime = targetSimTime - now; //System.nanoTime(); // the difference between then and now + + if (sleepTime > 20000000) { // 20 ms // + //System.out.println("sim interval = " + pduTimeInterval + ", sleeping for " + sleepTime/1000000l + " ms"); + sleep(sleepTime / 1000000L, (int) (sleepTime % 1000000L)); + } + + byte[] buffer = decdr.decode(sa[1]); + + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, addr, port); + dsock.send(packet); + + pduCount++; + if (scenarioPduCount != null) + scenarioPduCount++; + + if (showPduCountsOneTime || pduCount % 5 == 0) + showCounts(); + } + + line = brdr.readLine(); + } + brdr.close(); + } + } + catch (Exception ex) { + System.err.println("Exception reading/writing pdus: "+ex.getClass().getSimpleName()+": "+ex.getLocalizedMessage()); + thrd = null; + closer(); + } + } + + private void sleep(long ms) + { + try { + Thread.sleep(ms); + } + catch (InterruptedException ex) { + } + } + + private void showCounts() + { + if (scenarioPduCount != null) + System.out.print(pduCount + " " + ++scenarioPduCount + "\r"); + else + System.out.print(pduCount + "\r"); + showPduCountsOneTime = false; + } + + private void byebye() throws IOException + { + System.out.println("Replay stopped."); + closer(); + throw new IOException("Dis Replayer parsing error"); + } + + private void closer() + { + try { + if (dsock != null) { + dsock.close(); + dsock = null; + } + if (brdr != null) { + brdr.close(); + brdr = null; + } + } + catch (Exception ioex) { + System.err.println("IOException closing reader in Player"); + } + } + + private boolean handleComment(String s, File f) //true if we're done + { + boolean ret = false; + if (s.startsWith(START_COMMENT_MARKER)) { + //System.out.println(); + s = s.substring(START_COMMENT_MARKER.length()); + System.out.println(s + " "); + showPduCountsOneTime = true; // get the first one in there + } + else if (s.startsWith(STOP_COMMENT_MARKER)) { + showCounts(); + System.out.println(); + System.out.println("End of replay from " + f.getName()); + System.out.println(s.substring(STOP_COMMENT_MARKER.length())); + + scenarioPduCount = 0; + startNanoTime = null; + ret = true; + } + return ret; + } + + public void startResume() + { + paused = false; + } + + public void stopPause() + { + paused = false; + } + + public void end() + { + thrd.interrupt(); + closer(); + } + + public static void main(String[] args) + { + try { + //new Player("230.0.0.0", 3000, new File("./pdulog").toPath()).startResume(); + new Player("230.0.0.0", 3000, new File("/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog").toPath()); + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + + private static void sleep(long ms, int ns) + { + // @formatter:off + try { + Thread.sleep(ms, ns); + } + catch (InterruptedException ex) { + System.out.println("InterruptedException"); + } + // @formatter:on + } +} diff --git a/Brennenstuhl/src/DISTools/PlayerTobi.java b/Brennenstuhl/src/DISTools/PlayerTobi.java new file mode 100644 index 0000000..9619ae5 --- /dev/null +++ b/Brennenstuhl/src/DISTools/PlayerTobi.java @@ -0,0 +1,484 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; + +/** + * Copyright (c) 2008-2019, MOVES Institute, Naval Postgraduate School. All + * rights reserved. This work is licensed under the BSD open source license, + * available at https://www.movesinstitute.org/licenses/bsd.html + */ +import static DISTools.Recorder.COMMENT_MARKER; +import static DISTools.Recorder.START_COMMENT_MARKER; +import static DISTools.Recorder.STOP_COMMENT_MARKER; +import com.google.common.primitives.Longs; +import edu.nps.moves.dis7.EntityStatePdu; +import edu.nps.moves.dis7.Pdu; +import edu.nps.moves.dis7.enumerations.DISPDUType; +import edu.nps.moves.dis7.util.PduFactory; + +import java.io.*; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.file.Path; +import java.text.NumberFormat; +import java.util.Arrays; +import java.util.Base64; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Set; +import java.util.TreeMap; +import java.util.regex.Pattern; + +public class PlayerTobi { + + private Path disLogDirectory; + private String ip; + private int port; + private Thread thrd; + + public PlayerTobi(String ip, int port, Path disLogDirectory) throws IOException { + this.disLogDirectory = disLogDirectory; + this.ip = ip; + this.port = port; + + thrd = new Thread(() -> begin()); + thrd.setPriority(Thread.NORM_PRIORITY); + thrd.setName("PlayerThread"); + thrd.setDaemon(true); + thrd.start(); + } + + private Integer scenarioPduCount = null; + private boolean showPduCountsOneTime = false; + private int pduCount = 0; + private DatagramSocket dsock; + private BufferedReader brdr; + private Long startNanoTime = null; + private boolean paused = false; + + @SuppressWarnings("StatementWithEmptyBody") + public void begin() { + try { + System.out.println("Replaying DIS logs."); + InetAddress addr = InetAddress.getByName(ip); + + FilenameFilter filter = (dir, name) -> name.endsWith(Recorder.DISLOG_FILE_TAIL) && !name.startsWith("."); + + File[] fs = disLogDirectory.toFile().listFiles(filter); + if (fs == null) { + fs = new File[0]; + } + + Arrays.sort(fs, (f1, f2) -> { + return f1.getName().compareTo(f2.getName()); + }); + //Arrays.sort(fs, Comparator.comparing(File::getName)); + + dsock = new DatagramSocket(); + Base64.Decoder decdr = Base64.getDecoder(); + + // -------------------- Begin Variables for Position Interpolator + Boolean firstTimeStamp = true; + int firstLocalTimeStamp = 0; + + double firstLocalX = 0; + double firstLocalY = 0; + double firstLocalZ = 0; + + LinkedHashMap<Double, Coordinates> testMap = new LinkedHashMap<>(); + + //Setting up a NumberFormatter for limitting the decimal count to 3 + NumberFormat coordinateNumberFormat = NumberFormat.getInstance(new Locale("en", "US")); + coordinateNumberFormat.setMaximumFractionDigits(3); + + // -------------------- End Variables for Position Interpolator + for (File f : fs) { + System.out.println("Replaying " + f.getAbsolutePath()); + brdr = new BufferedReader(new FileReader(f), 1024 * 200); // 200kb buffer + + String line = brdr.readLine(); + while (line != null && !Thread.interrupted()) { + while (paused) { + sleep(500l); // half sec + } + if (line.length() <= 0) + ; // blank lines ok + else if (line.startsWith(COMMENT_MARKER)) { + if (handleComment(line, f)) { + // here if we got an end comment + break; // out of read loop + } + } else { + + //Pattern splitting needed for playback of unencoded streams + String REGEX = "\\],\\["; + Pattern pattern = Pattern.compile(REGEX); + String[] sa; + sa = pattern.split(line); + //Add the "]" to the end of sa[0]. It was taken off by the split + sa[0] = sa[0].concat("]"); + //Add the "]" to the end of sa[0]. It was taken off by the split + sa[1] = "[".concat(sa[1]); + if (sa.length != 2) { + System.err.println("Error: parsing error. Line follows."); + System.err.println(line); + byebye(); + } + + if (startNanoTime == null) { + startNanoTime = System.nanoTime(); + } + + //byte[] pduTimeBytes = decdr.decode(sa[0]); + //byte[] pduTimeBytes = sa[0].getBytes(); + byte[] pduTimeBytes = null; + + String[] splitString; + + //Split first String into multiple Strings cotaining integers + REGEX = ","; + pattern = Pattern.compile(REGEX); + + sa[0] = sa[0].substring(1, sa[0].length() - 1); + + splitString = pattern.split(sa[0]); + + //Define an array to store the in values from the string and initalize it to a value drifferent from NULL + int[] arr = new int[splitString.length]; + + String tempString = ""; + + //Test + for (int x = 0; x < splitString.length; x++) { + + tempString = splitString[x].trim(); + + int tempInt = Integer.parseInt(tempString); + arr[x] = tempInt; + + //System.out.println(tempInt); + } + + // Credit: https://stackoverflow.com/questions/1086054/how-to-convert-int-to-byte + ByteBuffer byteBuffer1 = ByteBuffer.allocate(arr.length * 4); + IntBuffer intBuffer = byteBuffer1.asIntBuffer(); + intBuffer.put(arr); + + pduTimeBytes = byteBuffer1.array(); + long pduTimeInterval = Longs.fromByteArray(pduTimeBytes); + + // This is a relative number in nanoseconds of the time of packet reception minus first packet reception for scenario. + long targetSimTime = startNanoTime + pduTimeInterval; // when we should send the packet + long now = System.nanoTime(); + long sleepTime = targetSimTime - now; //System.nanoTime(); // the difference between then and now + + if (sleepTime > 20000000) { // 20 ms // + System.out.println("sim interval = " + pduTimeInterval + ", sleeping for " + sleepTime / 1000000l + " ms"); + sleep(sleepTime / 1000000L, (int) (sleepTime % 1000000L)); + + } + + //Handle the second String + //Split second String into multiple Strings cotaining integers + REGEX = ","; + pattern = Pattern.compile(REGEX); + + sa[1] = sa[1].substring(1, sa[1].length() - 1); + + splitString = pattern.split(sa[1]); + + //Define an array to store the in values from the string and initalize it to a value drifferent from NULL + arr = new int[splitString.length]; + + //trim spaces, if any + tempString = ""; + + //Test + for (int x = 0; x < splitString.length; x++) { + + tempString = splitString[x].trim(); + + int tempInt = Integer.parseInt(tempString); + arr[x] = tempInt; + + //System.out.println(tempInt); + } + + // Credit: https://stackoverflow.com/questions/1086054/how-to-convert-int-to-byte + ByteBuffer byteBuffer2 = ByteBuffer.allocate(arr.length * 4); + intBuffer = byteBuffer2.asIntBuffer(); + intBuffer.put(arr); + + //Decoding is no longer needed + //byte[] buffer = decdr.decode(sa[1]); + //byte[] buffer = sa[1].getBytes(); + byte[] buffer = byteBuffer2.array(); + + //When the byteBuffer stores the arry of Integers into the byte array it store a 7 as 0 0 0 7. + //Therefore a shortBuffer is created where only every forth value is stored. + //it must be done with modulo instead of testing for "0" because a "0" could be there as value and not as padding + byte[] bufferShort = new byte[byteBuffer2.array().length / 4]; + + int bufferShortCounter = 0; + + for (int i = 1; i < byteBuffer2.array().length; i++) { + + if (((i + 1) % 4) == 0) { + + bufferShort[bufferShortCounter] = buffer[i]; + bufferShortCounter++; + + } + + } + + DatagramPacket packet = new DatagramPacket(bufferShort, bufferShort.length, addr, port); + dsock.send(packet); + + //PDU Factory + PduFactory pduFactory = new PduFactory(); + Pdu localPdu = null; + + if (arr[2] == 1) { + + localPdu = pduFactory.createPdu(bufferShort); + + // ToDO figure out how to do this! makeEntityStatePDU + EntityStatePdu localEspdu = pduFactory.makeEntityStatePdu(); + //Put all the data we need into the localEspdu + ByteBuffer espduBuffer = ByteBuffer.wrap(bufferShort); + localEspdu.unmarshal(espduBuffer); + + double localTimeStamp = 0; + double localX = 0; + double localY = 0; + double localZ = 0; + + //Store the first timestamp to subtract it from all others + //Same with X,Y,Z to create a local coordiante system + if (firstTimeStamp) { + + firstLocalTimeStamp = localPdu.getTimestamp(); + localTimeStamp = localPdu.getTimestamp(); + firstLocalX = localEspdu.getEntityLocation().getX(); + firstLocalY = localEspdu.getEntityLocation().getY(); + firstLocalZ = localEspdu.getEntityLocation().getZ(); + + firstTimeStamp = false; + } + + localTimeStamp = localPdu.getTimestamp(); + localX = localEspdu.getEntityLocation().getX(); + localY = localEspdu.getEntityLocation().getY(); + localZ = localEspdu.getEntityLocation().getZ(); + + localTimeStamp = localTimeStamp - firstLocalTimeStamp; + localX = localX - firstLocalX; + localY = localY - firstLocalY; + localZ = localZ - firstLocalZ; + + //Divide TimeStamp by 1,000,000 to get something close to a second per Unit. + localTimeStamp = localTimeStamp / 1000000; + + if ((localPdu.getPduType() != null) && (localPdu.getPduType() == DISPDUType.ENTITY_STATE)) { + + //System.out.println("Timestamp: " + localTimeStamp); + //String outPutString = new String("Location: x: " + localX + " y: " + localY + " z: " + localZ); + //Put timestamps and coordinates in a Map to have them stored for a regression + testMap.put((double) localTimeStamp, new Coordinates(localX, localY, localZ)); + //System.out.println(outPutString); + //String positionInterpolatorString = new String(" " + coordinateNumberFormat.format(localZ) + " " + coordinateNumberFormat.format(localY) + " " + coordinateNumberFormat.format(localX)); + //tempKeyKeyValueSetPositionInterPolator.put(localTimeStamp, positionInterpolatorString); + + } + + } + pduCount++; + if (scenarioPduCount != null) { + scenarioPduCount++; + } + + if (showPduCountsOneTime || pduCount % 5 == 0) { + showCounts(); + } + } + + line = brdr.readLine(); + } + brdr.close(); + + //Regression of the testMap + Compressor regression = new Compressor(testMap); + + TreeMap<Double, Coordinates> returnMap = new TreeMap<>(); + + returnMap = regression.doCompression(); + //returnMap.putAll(testMap); + + + //Writing all values from the KeyMap to a proper Position Interpolator String + System.out.println("Writing Position Interpolator"); + Set<Double> keys = returnMap.keySet(); + //Set<Double> keys = tempKeyKeyValueSetPositionInterPolator.keySet(); + String key = "key = '"; + String keyValue = "keyValue = '"; + String interpolatorToCopy = "<PositionInterpolator DEF='Entity' "; + + //Find highest time to do the normalization + double lastTimeStamp = 0; + + for (Double k : keys) { + + if (k > lastTimeStamp) { + + lastTimeStamp = k; + + } + } + + //Normalize all times in the set + var keyKeyValueSetPositionInterPolator = new LinkedHashMap<Double, String>(); + + for (Double k : keys) { + + String localCoordinateString; + double tempX = returnMap.get(k).getX(); + double tempY = returnMap.get(k).getY(); + double tempZ = returnMap.get(k).getZ(); + localCoordinateString = " " + coordinateNumberFormat.format(tempX) + " " + coordinateNumberFormat.format(tempY) + " " + coordinateNumberFormat.format(tempZ); + + keyKeyValueSetPositionInterPolator.put(k / lastTimeStamp, localCoordinateString); + + } + + keys = keyKeyValueSetPositionInterPolator.keySet(); + + //Setting up the timeSensor + String timeSensor = "<TimeSensor DEF='PduStreamClock' cycleInterval='"; + + timeSensor += lastTimeStamp; + + timeSensor += "' loop = 'true'/>"; + + //Printing the timeSensor to the console + System.out.println(timeSensor); + + //Seting up the PositionInterpolator + for (Double k : keys) { + //System.out.println(k+" -- " + keyKeyValuePositionInterPolator.get(k)); + key += coordinateNumberFormat.format(k) + " "; + + keyValue += keyKeyValueSetPositionInterPolator.get(k) + " "; + + } + key += "' "; + keyValue += "' "; + interpolatorToCopy += key + "\n"; + interpolatorToCopy += keyValue; + interpolatorToCopy += "/>"; + //Printing PositionInterpolator to the console + System.out.println(interpolatorToCopy); + } + } catch (Exception ex) { + System.err.println("Exception reading/writing pdus: " + ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage()); + thrd = null; + closer(); + } + } + + private void sleep(long ms) { + try { + Thread.sleep(ms); + } catch (InterruptedException ex) { + } + } + + private void showCounts() { + if (scenarioPduCount != null) { + System.out.print(pduCount + " " + ++scenarioPduCount + "\r"); + } else { + System.out.print(pduCount + "\r"); + } + showPduCountsOneTime = false; + } + + private void byebye() throws IOException { + System.out.println("Replay stopped."); + closer(); + throw new IOException("Dis Replayer parsing error"); + } + + private void closer() { + try { + if (dsock != null) { + dsock.close(); + dsock = null; + } + if (brdr != null) { + brdr.close(); + brdr = null; + } + } catch (Exception ioex) { + System.err.println("IOException closing reader in Player"); + } + } + + private boolean handleComment(String s, File f) //true if we're done + { + boolean ret = false; + if (s.startsWith(START_COMMENT_MARKER)) { + //System.out.println(); + s = s.substring(START_COMMENT_MARKER.length()); + System.out.println(s + " "); + showPduCountsOneTime = true; // get the first one in there + } else if (s.startsWith(STOP_COMMENT_MARKER)) { + showCounts(); + System.out.println(); + System.out.println("End of replay from " + f.getName()); + System.out.println(s.substring(STOP_COMMENT_MARKER.length())); + + scenarioPduCount = 0; + startNanoTime = null; + ret = true; + } + return ret; + } + + public void startResume() { + paused = false; + } + + public void stopPause() { + paused = false; + } + + public void end() { + thrd.interrupt(); + closer(); + } + + public static void main(String[] args) { + try { + //new Player("230.0.0.0", 3000, new File("./pdulog").toPath()).startResume(); + new PlayerTobi("239.1.2.3", 3000, new File("/Users/mike/NetbeansProjects/open-dis7-java/examples/pdulog").toPath()); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private static void sleep(long ms, int ns) { + // @formatter:off + try { + Thread.sleep(ms, ns); + } catch (InterruptedException ex) { + System.out.println("InterruptedException"); + } + // @formatter:on + } +} diff --git a/Brennenstuhl/src/DISTools/Recorder.java b/Brennenstuhl/src/DISTools/Recorder.java new file mode 100644 index 0000000..e647ece --- /dev/null +++ b/Brennenstuhl/src/DISTools/Recorder.java @@ -0,0 +1,236 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + * @author Tobias Brennenstuhl (encryption removed) + */ +package DISTools; + +import com.google.common.primitives.Longs; +import edu.nps.moves.dis7.Pdu; +import edu.nps.moves.dis7.enumerations.DISPDUType; +import edu.nps.moves.dis7.util.DisNetworking; +import edu.nps.moves.dis7.util.DisNetworking.BuffAndLength; +import edu.nps.moves.dis7.util.PduFactory; +import org.apache.commons.io.FilenameUtils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Base64; + +public class Recorder implements edu.nps.moves.dis7.util.playerrecorder.PduReceiver +{ + static String DEFAULT_OUTDIR = "./pdulog"; + static String DEFAULT_FILEPREFIX = "Pdusave"; + static String DEFAULT_MCAST = "230.0.0.0"; + static int DEFAULT_PORT = 3000; + + static String DISLOG_FILE_TAIL = ".dislog"; + + public static String COMMENT_MARKER = "!"; + static String START_COMMENT_MARKER = COMMENT_MARKER + "Begin" + COMMENT_MARKER; + static String STOP_COMMENT_MARKER = COMMENT_MARKER + "End" + COMMENT_MARKER; + + private BufferedWriter bwr; + private File logFile; + private DisNetworking disnet; + private Thread receiverThrd; + + public Recorder() throws IOException + { + this(DEFAULT_OUTDIR,DEFAULT_MCAST,DEFAULT_PORT); + } + + public Recorder(String outputDir, String mcastaddr, int port) throws IOException + { + logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_TAIL ); + bwr = new BufferedWriter(new FileWriter(logFile)); + + disnet = new DisNetworking(port, mcastaddr); + // Start a thread to receive and record pdus + + receiverThrd = new Thread(()->{ + int count = 1; + while(!Thread.interrupted()){ + try { + BuffAndLength blen = disnet.receiveRawPdu(); + //System.out.println(""+ count++ +" Got pdu from DisNetworking"); + receivePdu(blen.buff,blen.length); + } + catch(IOException ex) { + // this is the normal exception if you do disnet.stop() System.err.println("Exception receiving Pdu: "+ex.getLocalizedMessage()); + } + } + }); + receiverThrd.setPriority(Thread.NORM_PRIORITY); + receiverThrd.setDaemon(true); + receiverThrd.start(); + } + + public void startResume() + { + dosave = true; + } + + public void stopPause() + { + dosave = false; + } + + public String getOutputFile() + { + if(logFile != null) + return logFile.getAbsolutePath(); + return null; + } + + public void end() + { + disnet.stop(); + receiverThrd.interrupt(); + + try { + writeFooter(); + bwr.flush(); + bwr.close(); + System.out.println(); + System.out.println("Recorder log file closed"); + } + catch (IOException ex) { + System.out.println("IOException closing file: " + ex.getMessage()); + } + } + + Long startNanoTime = null; + StringBuilder sb = new StringBuilder(); + //Base64.Encoder encdr = Base64.getEncoder(); + int pduCount = 0; + boolean headerWritten = false; + boolean dosave = true; + + @Override + public void receivePdu(byte[] buff, int len) + { + if(!dosave) + return; + + long packetRcvNanoTime = System.nanoTime(); + if (startNanoTime == null) + startNanoTime = packetRcvNanoTime; + + byte[] timeAr = Longs.toByteArray(packetRcvNanoTime - startNanoTime); + //System.out.println("wrote time "+(packetRcvNanoTime - startNanoTime)); + + sb.setLength(0); + //sb.append(encdr.encodeToString(timeAr)); + sb.append(Arrays.toString(timeAr)); + sb.append(','); + byte[] buffsized = Arrays.copyOf(buff, len); + //sb.append(encdr.encodeToString(buffsized)); + sb.append(Arrays.toString(buffsized)); + try { + if (!headerWritten) { + writeHeader(); + headerWritten = true; + } + bwr.write(sb.toString()); + bwr.newLine(); + } + catch (IOException ex) { + System.err.println("Fatal exception writing DIS log file in Recorder.start()"); + throw new RuntimeException(ex); + } + System.out.print(++pduCount + "\r"); + + //bwr.flush(); + sb.setLength(0); + } + + public String getLogFile() + { + return logFile.getAbsolutePath(); + } + + private void writeHeader() throws IOException + { + String template = "Beginning of DIS capture file, %s."; + String startComment = String.format(template, logFile.getName()); + bwr.write(START_COMMENT_MARKER + startComment); + bwr.newLine(); + } + + private void writeFooter() throws IOException + { + String template = "End of DIS capture file, %s."; + String endComment = String.format(template, logFile.getName()); + bwr.write(STOP_COMMENT_MARKER + endComment); + bwr.newLine(); + } + + private File makeFile(Path outputDir, String filename) throws IOException + { + String bname = FilenameUtils.getBaseName(filename); + String ext = FilenameUtils.getExtension(filename); + + Integer count = null; + File f; + boolean fileExists; + outputDir.toFile().mkdirs(); + do { + String fn = bname + (count == null ? "" : count) + "." + ext; + f = new File(outputDir.toFile(), fn); + fileExists = f.exists(); + if (count == null) + count = 1; + else + count++; + } while (fileExists); + if (!f.createNewFile()) { + System.out.println("Cannot create dis log file at " + f.getAbsolutePath()); + throw new RuntimeException("File creation error"); + } + return f; + } + + /* Example test usage */ + public static void main(String[] args) + { + PduFactory factory = new PduFactory(); //default appid, country, etc. + DisNetworking disnet = new DisNetworking(); // default ip and port + + Path path = new File("./pdulog").toPath(); + String filename = "Pdusave"; + + Recorder recorder; + try{recorder = new Recorder();} catch(IOException ex) { + System.err.println("Exception creating recorder: "+ex.getLocalizedMessage()); + return; + } + + DISPDUType all[] = DISPDUType.values(); + Arrays.stream(all).forEach(typ-> { + if(typ != DISPDUType.OTHER) { + try { + Pdu pdu = factory.createPdu(typ); + disnet.sendPdu(pdu); + sleep(100); + } + catch(Exception ex) { + System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage()); + } + } + }); + sleep(2000L); + + recorder.end(); + } + + private static void sleep(long ms) + { + try{Thread.sleep(ms);}catch(InterruptedException ex) {} + } +} diff --git a/Brennenstuhl/src/DISTools/RecorderTobi.java b/Brennenstuhl/src/DISTools/RecorderTobi.java new file mode 100644 index 0000000..a1774fb --- /dev/null +++ b/Brennenstuhl/src/DISTools/RecorderTobi.java @@ -0,0 +1,237 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; + +import com.google.common.primitives.Longs; + +import edu.nps.moves.dis7.Pdu; +import edu.nps.moves.dis7.enumerations.DISPDUType; +import edu.nps.moves.dis7.util.DisNetworking; +import edu.nps.moves.dis7.util.DisNetworking.BuffAndLength; +import edu.nps.moves.dis7.util.PduFactory; +import org.apache.commons.io.FilenameUtils; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Arrays; + + +public class RecorderTobi implements PduReceiver +{ + static String DEFAULT_OUTDIR = "./pdulog"; + static String DEFAULT_FILEPREFIX = "Pdusave"; + static String DEFAULT_MCAST = "239.1.2.3"; + static int DEFAULT_PORT = 3000; + + static String DISLOG_FILE_TAIL = ".dislog"; + + public static String COMMENT_MARKER = "!"; + static String START_COMMENT_MARKER = COMMENT_MARKER + "Begin" + COMMENT_MARKER; + static String STOP_COMMENT_MARKER = COMMENT_MARKER + "End" + COMMENT_MARKER; + + private BufferedWriter bwr; + private File logFile; + private DisNetworking disnet; + private Thread receiverThrd; + + public RecorderTobi() throws IOException + { + this(DEFAULT_OUTDIR,DEFAULT_MCAST,DEFAULT_PORT); + } + + public RecorderTobi(String outputDir, String mcastaddr, int port) throws IOException + { + logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_TAIL ); + bwr = new BufferedWriter(new FileWriter(logFile)); + + disnet = new DisNetworking(port, mcastaddr); + // Start a thread to receive and record pdus + + receiverThrd = new Thread(()->{ + int count = 1; + while(!Thread.interrupted()){ + try { + BuffAndLength blen = disnet.receiveRawPdu(); + //System.out.println(""+ count++ +" Got pdu from DisNetworking"); + receivePdu(blen.buff,blen.length); + } + catch(IOException ex) { + // this is the normal exception if you do disnet.stop() System.err.println("Exception receiving Pdu: "+ex.getLocalizedMessage()); + } + } + }); + receiverThrd.setPriority(Thread.NORM_PRIORITY); + receiverThrd.setDaemon(true); + receiverThrd.start(); + } + + public void startResume() + { + dosave = true; + } + + public void stopPause() + { + dosave = false; + } + + public String getOutputFile() + { + if(logFile != null) + return logFile.getAbsolutePath(); + return null; + } + + public void end() + { + disnet.stop(); + receiverThrd.interrupt(); + + try { + writeFooter(); + bwr.flush(); + bwr.close(); + System.out.println(); + System.out.println("Recorder log file closed"); + } + catch (IOException ex) { + System.out.println("IOException closing file: " + ex.getMessage()); + } + } + + Long startNanoTime = null; + StringBuilder sb = new StringBuilder(); + // Base64.Encoder encdr = Base64.getEncoder(); + int pduCount = 0; + boolean headerWritten = false; + boolean dosave = true; + + @Override + public void receivePdu(byte[] buff, int len) + { + if(!dosave) + return; + + long packetRcvNanoTime = System.nanoTime(); + if (startNanoTime == null) + startNanoTime = packetRcvNanoTime; + + byte[] timeAr = Longs.toByteArray(packetRcvNanoTime - startNanoTime); + //System.out.println("wrote time "+(packetRcvNanoTime - startNanoTime)); + + sb.setLength(0); + //sb.append(encdr.encodeToString(timeAr)); + sb.append(Arrays.toString(timeAr)); + sb.append(','); + byte[] buffsized = Arrays.copyOf(buff, len); + //sb.append(encdr.encodeToString(buffsized)); + sb.append(Arrays.toString(buffsized)); + try { + if (!headerWritten) { + writeHeader(); + headerWritten = true; + } + //Added a REGEX to strip all spaces from the string before writing to file + bwr.write(sb.toString().replaceAll("\\s","")); + bwr.newLine(); + } + catch (IOException ex) { + System.err.println("Fatal exception writing DIS log file in Recorder.start()"); + throw new RuntimeException(ex); + } + System.out.print(++pduCount + "\r"); + + //bwr.flush(); + sb.setLength(0); + } + + public String getLogFile() + { + return logFile.getAbsolutePath(); + } + + private void writeHeader() throws IOException + { + String template = "Beginning of DIS capture file, %s. [PDU Header],[PDU Stream]"; + String startComment = String.format(template, logFile.getName()); + bwr.write(START_COMMENT_MARKER + startComment); + bwr.newLine(); + } + + private void writeFooter() throws IOException + { + String template = "End of DIS capture file, %s."; + String endComment = String.format(template, logFile.getName()); + bwr.write(STOP_COMMENT_MARKER + endComment); + bwr.newLine(); + } + + private File makeFile(Path outputDir, String filename) throws IOException + { + String bname = FilenameUtils.getBaseName(filename); + String ext = FilenameUtils.getExtension(filename); + + Integer count = null; + File f; + boolean fileExists; + outputDir.toFile().mkdirs(); + do { + String fn = bname + (count == null ? "" : count) + "." + ext; + f = new File(outputDir.toFile(), fn); + fileExists = f.exists(); + if (count == null) + count = 1; + else + count++; + } while (fileExists); + if (!f.createNewFile()) { + System.out.println("Cannot create dis log file at " + f.getAbsolutePath()); + throw new RuntimeException("File creation error"); + } + return f; + } + + /* Example test usage */ + public static void main(String[] args) + { + PduFactory factory = new PduFactory(); //default appid, country, etc. + DisNetworking disnet = new DisNetworking(); // default ip and port + + Path path = new File("./pdulog").toPath(); + String filename = "Pdusave"; + + RecorderTobi recorder; + try{recorder = new RecorderTobi();} catch(IOException ex) { + System.err.println("Exception creating recorder: "+ex.getLocalizedMessage()); + return; + } + + DISPDUType all[] = DISPDUType.values(); + Arrays.stream(all).forEach(typ-> { + if(typ != DISPDUType.OTHER) { + try { + Pdu pdu = factory.createPdu(typ); + disnet.sendPdu(pdu); + sleep(100); + } + catch(Exception ex) { + System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage()); + } + } + }); + sleep(2000); + + recorder.end(); + } + + private static void sleep(long ms) + { + try{Thread.sleep(ms);}catch(InterruptedException ex) {} + } +} diff --git a/Brennenstuhl/src/DISTools/SimpleSenderGUI.java b/Brennenstuhl/src/DISTools/SimpleSenderGUI.java new file mode 100644 index 0000000..f7ba040 --- /dev/null +++ b/Brennenstuhl/src/DISTools/SimpleSenderGUI.java @@ -0,0 +1,400 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; + +import java.awt.BorderLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.io.File; +import java.text.NumberFormat; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.JButton; +import javax.swing.JFormattedTextField; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import static javax.swing.JOptionPane.OK_CANCEL_OPTION; +import static javax.swing.JOptionPane.OK_OPTION; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.text.NumberFormatter; + +/** + * + * @author Tobias Brennenstuhl + */ +public final class SimpleSenderGUI extends JFrame implements Runnable { + + private JButton defaultButton; + private JButton clearButton; + private JButton exitButton; + private JButton receiveButton; + private JButton sendButton; + private JMenuItem openMenuItem; + private JMenuItem saveMenuItem; + private DefaultActionListener defaultActionListener; + private ClearActionListener clearActionListener; + private ExitActionListener exitActionListener; + private ReceiveActionListener receiveActionListener; + private SendActionListener sendActionListener; + private JTextArea outputArea; + private JLabel packetsToSendTextFieldLabel; + private JFormattedTextField packetsToSendTextField; + private JLabel ipToSendTextFieldLabel; + private JTextField ipToSendTextField; + private JLabel portToSendTextFieldLabel; + private JFormattedTextField portToSendTextField; + + private JPanel panel; + private JPanel panel2; + private EspduSender simpleSender = new EspduSender(); + private EspduReceiver simpleReceiver = new EspduReceiver(); + private JMenuBar menuBar; + private JMenu fileMenu; + private JMenu editMenu; + private JMenu helpMenu; + private JMenuItem helpMenuItem; + private JMenuItem exitMenuItem; + private HelpActionListener helpActionListener; + + public SimpleSenderGUI() { + + super("DIS Sender/Receiver GUI"); + + exitActionListener = new ExitActionListener(); + this.addWindowListener(exitActionListener); + + this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + this.setSize(600, 500); + this.setLocation(400, 300); + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { + Logger.getLogger(SimpleSenderGUI.class.getName()).log(Level.SEVERE, null, ex); + } + init(); + } + + /** + * Initialize all the widgets, hook up listeners, and place them in the + * window + */ + protected void init() { + //The panel will hold all of our stuff + panel = new JPanel(new GridLayout(1, 5)); + getContentPane().add(panel, BorderLayout.NORTH); + + //Instantiate the JLabel and add to the panel + panel2 = new JPanel(new GridLayout(1, 1)); + getContentPane().add(panel2, BorderLayout.SOUTH); + + //Setup a textfield for the IP adress + ipToSendTextFieldLabel = new JLabel("IP Address:"); + ipToSendTextField = new JTextField("239.1.2.3"); + panel2.add(ipToSendTextFieldLabel); + panel2.add(ipToSendTextField); + + //Setup a textfield for the Port that allows integer only + //Credit: https://stackoverflow.com/questions/11093326/restricting-jtextfield-input-to-integers + + + NumberFormat longFormat = NumberFormat.getIntegerInstance(); + NumberFormatter formatter = new NumberFormatter(longFormat); + + formatter.setValueClass(Integer.class); + formatter.setMinimum(1); + formatter.setMaximum(5000); + formatter.setAllowsInvalid(false); + portToSendTextFieldLabel = new JLabel("Port:"); + portToSendTextField = new JFormattedTextField(formatter); + portToSendTextField.setValue(3000); + panel2.add(portToSendTextFieldLabel); + panel2.add(portToSendTextField); + + //Setup a textfield for number of packets that allows integer only + packetsToSendTextField = new JFormattedTextField(formatter); + packetsToSendTextField.setValue(5); + packetsToSendTextFieldLabel = new JLabel("# of Packets:"); + panel2.add(packetsToSendTextFieldLabel); + panel2.add(packetsToSendTextField); + + //Instantiate the TextArea and make it scrollable + outputArea = new JTextArea(); + JScrollPane scrollPane = new JScrollPane(outputArea); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + getContentPane().add(scrollPane, BorderLayout.CENTER); + + + //Instantiate the OpenButton and add the ActionListener + defaultButton = new JButton("Default"); + panel.add(defaultButton); + defaultActionListener = new DefaultActionListener(); + defaultButton.addActionListener(defaultActionListener); + + //Instantiate the SaveButton and add the ActionListener + clearButton = new JButton("Clear"); + panel.add(clearButton); + clearActionListener = new ClearActionListener(); + clearButton.addActionListener(clearActionListener); + + //Instantiate the ReceiveButton and add the ActionListener + receiveButton = new JButton("Receive"); + receiveActionListener = new ReceiveActionListener(); + receiveButton.addActionListener(receiveActionListener); + panel.add(receiveButton); + + + //Instantiate the SendButton and add the ActionListener + sendButton = new JButton("Send"); + sendActionListener = new SendActionListener(); + sendButton.addActionListener(sendActionListener); + panel.add(sendButton); + + //Instantiate the ExitButton and add the ActionListener + exitButton = new JButton("Exit"); + exitButton.addActionListener(exitActionListener); + panel.add(exitButton); + + //Instatiate a MenuBar + menuBar = new JMenuBar(); + setJMenuBar(menuBar); + + //Instantiate the fileMenuItem + fileMenu = new JMenu("File"); + menuBar.add(fileMenu); + + //Instantiate the editMenuItem + editMenu = new JMenu("Edit"); + menuBar.add(editMenu); + + //Instantiate the helpMenuItem + helpMenu = new JMenu("Help"); + menuBar.add(helpMenu); + + //Instantiate the openMenuItem and add it to the fileMenu + openMenuItem = new JMenuItem("Open"); + helpActionListener = new HelpActionListener(); + openMenuItem.addActionListener(defaultActionListener); + fileMenu.add(openMenuItem); + + //Instantiate the saveMenuItem and add it to the fileMenu + saveMenuItem = new JMenuItem("Save"); + saveMenuItem.addActionListener(clearActionListener); + saveMenuItem.setEnabled(false); + fileMenu.add(saveMenuItem); + fileMenu.addSeparator(); + + //Instantiate the helpMenuItem and add it to the helpMenu + helpMenuItem = new JMenuItem("Help"); + helpMenuItem.addActionListener(helpActionListener); + helpMenu.add(helpMenuItem); + + //Instantiate the ExitMenuItem and add it to the exitMenu + exitMenuItem = new JMenuItem("Exit"); + exitMenuItem.addActionListener(exitActionListener); + fileMenu.add(exitMenuItem); + + } + + ; + + //Run our window and set it to visible + @Override + public void run() { + setVisible(true); + + } + + //ActionListener for SendButton + private class SendActionListener implements ActionListener { + + public SendActionListener() { + + } + + @Override + public void actionPerformed(ActionEvent e) { + + int temp; + + if (packetsToSendTextField.getValue() == null) { + + temp = 1; + + } else { + + temp = (int) packetsToSendTextField.getValue(); + } + + for (int i = 0; i < temp; i++) { + + String tempIpString; + //tempIpString = new String(); + tempIpString = ipToSendTextField.getText(); + int tempPort; + tempPort = (int) portToSendTextField.getValue(); + String tempTextforOurputArea = simpleSender.send(tempIpString, tempPort); + outputArea.append(tempTextforOurputArea); + outputArea.update(outputArea.getGraphics()); + } + + } + } + + ////ActionListener for ReceiveButton + private class ReceiveActionListener implements ActionListener { + + public ReceiveActionListener() { + + } + + @Override + public void actionPerformed(ActionEvent e) { + + int temp; + + if (packetsToSendTextField.getValue() == null) { + + temp = 1; + + } else { + + temp = (int) packetsToSendTextField.getValue(); + } + + for (int i = 0; i < temp; i++) { + + String tempIpString; + //tempIpString = new String(); + tempIpString = ipToSendTextField.getText(); + int tempPort; + tempPort = (int) portToSendTextField.getValue(); + + outputArea.append(simpleReceiver.receive(tempIpString, tempPort)); + outputArea.update(outputArea.getGraphics()); + } + + } + } + + + + + + + //ActionListener for HelpMenuItem + private class HelpActionListener implements ActionListener { + + /** + * Gives the user a Message with some help + * + * + * @param e Given ActionEvent + */ + @Override + public void actionPerformed(ActionEvent e) { + + System.out.println("Help"); + + JOptionPane.showMessageDialog(SimpleSenderGUI.this, + "Type in the IP-adress and the Port you would like to send\n" + + "DIS Packets to. Add the number of Packets and hit send. \n\n" + + " ", "Help", JOptionPane.PLAIN_MESSAGE); + + } + + } + + //ActionListener for OpenMenuItem and OpenButton + private class DefaultActionListener implements ActionListener { + + public DefaultActionListener() { + } + + @Override + public void actionPerformed(ActionEvent e) { + + System.out.println("Default Values restored"); + + ipToSendTextField.setText("239.1.2.3"); + portToSendTextField.setValue(3000); + packetsToSendTextField.setValue(5); + + outputArea.append("Default Values restored. \n"); + + + } + + } + + //ActionListener for SaveMenuItem and SaveButton + private class ClearActionListener implements ActionListener { + + private File outputFile; + + public ClearActionListener() { + } + + @Override + public void actionPerformed(ActionEvent e) { + + outputArea.append("Display will be cleared in 2 seconds. \n"); + outputArea.update(outputArea.getGraphics()); + System.out.println("Clearing display area ..."); + try { + Thread.sleep(2000); + } catch (InterruptedException ex) { + Logger.getLogger(SimpleSenderGUI.class.getName()).log(Level.SEVERE, null, ex); + } + outputArea.setText(""); + } + + } + + //ActionListener for ExitMenuItem, ExitButton and WindowAdapter + private class ExitActionListener extends WindowAdapter implements ActionListener, WindowListener { + + /** + * Prompts the user with JOptionPane.showConformDialog(); will only exit + * if the user clicks "OK" but will do nothing if the user clicks + * "Cancel" + * + * Credits to Class-Code ;-) CS2173 + * + * @param e Given ActionEvent + */ + @Override + public void actionPerformed(ActionEvent e) { + + System.out.println("Exit"); + + int confirm = JOptionPane.showConfirmDialog(SimpleSenderGUI.this, + "Really Exit?", "Confirm Exit", OK_CANCEL_OPTION); + if (confirm == OK_OPTION) { + System.exit(0); + } + } + + @Override + public void windowClosing(WindowEvent e) { + actionPerformed(null); + } + + } + +} diff --git a/Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java b/Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java new file mode 100644 index 0000000..2fd483f --- /dev/null +++ b/Brennenstuhl/src/DISTools/SimpleSenderGUIMain.java @@ -0,0 +1,31 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package DISTools; + +import javax.swing.SwingUtilities; + +/** + * + * @author Tobias Brennenstuhl + */ +public class SimpleSenderGUIMain { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + + //Instantiate a SimpleSenderGUI + SimpleSenderGUI simpleSenderGUI; + + simpleSenderGUI = new SimpleSenderGUI(); + SwingUtilities.invokeLater(simpleSenderGUI); + + //Run our instance of SimpleSenderWordGUI + simpleSenderGUI.run(); + } + +} -- GitLab