From 09cf65118438ff1cd8e1c4b278d01dfb50e57f80 Mon Sep 17 00:00:00 2001 From: Phil Williams Date: Fri, 18 Nov 2022 16:45:36 -0500 Subject: [PATCH 1/7] Implement synchronization fixes from daidalus branch work. - These synchronization issues were realized during work to improve the TCP communications bridge for UxAS. --- .../Amase/avtas/amase/entity/EntityModel.java | 36 +++++--- .../avtas/amase/network/EntityTcpServer.java | 2 + .../src/Core/avtas/app/AppEventManager.java | 91 +++++++++++-------- 3 files changed, 78 insertions(+), 51 deletions(-) diff --git a/OpenAMASE/src/Amase/avtas/amase/entity/EntityModel.java b/OpenAMASE/src/Amase/avtas/amase/entity/EntityModel.java index 028918b..e310281 100644 --- a/OpenAMASE/src/Amase/avtas/amase/entity/EntityModel.java +++ b/OpenAMASE/src/Amase/avtas/amase/entity/EntityModel.java @@ -275,26 +275,36 @@ public void fireModelEvent(Object event) { * the source. */ public void fireModelEvent(Object event, Object source) { + synchronized(eventQueue) { + eventQueue.add(new EventWrapper(event, source)); + } - eventQueue.add(new EventWrapper(event, source)); - - if (isDispatching) { - return; + synchronized(this) { + if (isDispatching) { + return; + } + isDispatching = true; } - isDispatching = true; - - while (!eventQueue.isEmpty()) { - EventWrapper eventWrapper = eventQueue.pollFirst(); - if (eventWrapper != null) { - for (EntityModule m : moduleList) { - if (eventWrapper.source != m) { - m.modelEventOccurred(event); + + while (true) { + synchronized(eventQueue) { + if (eventQueue.isEmpty()) { + break; + } + EventWrapper eventWrapper = eventQueue.pollFirst(); + if (eventWrapper != null) { + for (EntityModule m : moduleList) { + if (eventWrapper.source != m) { + m.modelEventOccurred(eventWrapper.event); + } } } } } - isDispatching = false; + synchronized(this) { + isDispatching = false; + } } public long getID() { diff --git a/OpenAMASE/src/Amase/avtas/amase/network/EntityTcpServer.java b/OpenAMASE/src/Amase/avtas/amase/network/EntityTcpServer.java index 1f50323..4124829 100644 --- a/OpenAMASE/src/Amase/avtas/amase/network/EntityTcpServer.java +++ b/OpenAMASE/src/Amase/avtas/amase/network/EntityTcpServer.java @@ -127,6 +127,8 @@ public void run() { while (isRunning) { try { + //TODO: The Java Socket types is NOT thread safe and there's no protection here for concurrent read/write + // to the socket! byte[] bytes = LMCPFactory.getMessageBytes(socket.getInputStream()); if (bytes.length > 0) { avtas.lmcp.LMCPObject lmcpObject = LMCPFactory.getObject(bytes); diff --git a/OpenAMASE/src/Core/avtas/app/AppEventManager.java b/OpenAMASE/src/Core/avtas/app/AppEventManager.java index c252d60..43a4167 100644 --- a/OpenAMASE/src/Core/avtas/app/AppEventManager.java +++ b/OpenAMASE/src/Core/avtas/app/AppEventManager.java @@ -139,7 +139,9 @@ public static AppEventManager removeEventManager(String tag) { */ public void fireEvent(Object evt, Object eventSource) { EventWrapper wrapper = new EventWrapper(evt, eventSource); - waitList.addLast(wrapper); + synchronized(waitList) { + waitList.addLast(wrapper); + } dispatchObjects(); } @@ -151,7 +153,9 @@ public void fireEvent(Object evt, Object eventSource) { */ public void fireEvent(Object evt) { EventWrapper wrapper = new EventWrapper(evt, null); - waitList.addLast(wrapper); + synchronized(waitList) { + waitList.addLast(wrapper); + } dispatchObjects(); } @@ -166,9 +170,11 @@ public void fireEvent(Object evt) { * the source object. */ public void fireEventNow(Object evt, Object eventSource) { - for (AppEventListener l : listeners) { - if (l != eventSource) { - l.eventOccurred(evt); + synchronized(listeners) { + for (AppEventListener l : listeners) { + if (l != eventSource) { + l.eventOccurred(evt); + } } } } @@ -207,10 +213,12 @@ public boolean isLocked() { * * @param l The AppEventListener to be added. */ - public synchronized boolean addListener(AppEventListener l) { - if (!listeners.contains(l)) { - listeners.add(l); - return true; + public boolean addListener(AppEventListener l) { + synchronized(listeners) { + if (!listeners.contains(l)) { + listeners.add(l); + return true; + } } return false; } @@ -224,8 +232,10 @@ public synchronized boolean addListener(AppEventListener l) { * @param l The listener to remove. * @return true if the listener was removed, false otherwise. */ - public synchronized boolean removeListener(AppEventListener l) { - return listeners.remove(l); + public boolean removeListener(AppEventListener l) { + synchronized(listeners) { + return listeners.remove(l); + } } /** @@ -234,7 +244,9 @@ public synchronized boolean removeListener(AppEventListener l) { * @return The list of registered event listeners */ public List getListeners() { - return listeners; + //cpw: For now return a shallow copy of the list, user shouldn't modify elements of the container! + //TODO: Return a deep copy of the list here. + return new ArrayList(listeners); } /** @@ -244,31 +256,38 @@ public List getListeners() { * lock is true. */ private void dispatchObjects() { - - if (eventOccuring) { - return; + // Separate synchronization on "this" to allow early return from this function and proper protection of + // "eventOccuring" primitive type (cannot synchronize on these). + synchronized(this) { + if (eventOccuring) { + return; + } + eventOccuring = true; } - eventOccuring = true; while (!lock) { - EventWrapper e = waitList.poll(); - if (e == null) { - break; - } - synchronized (listeners) { - for (int i = 0; i < listeners.size(); i++) { - if (consume == e.event) { - consume = null; - break; - } - AppEventListener l = listeners.get(i); - if (l != e.source) { - l.eventOccurred(e.event); + synchronized(waitList) { + EventWrapper e = waitList.poll(); + if (e == null) { + break; + } + synchronized(listeners) { + for (int i = 0; i < listeners.size(); i++) { + if (consume == e.event) { + consume = null; + break; + } + AppEventListener l = listeners.get(i); + if (l != e.source) { + l.eventOccurred(e.event); + } } } } } consume = null; - eventOccuring = false; + synchronized(this) { + eventOccuring = false; + } } /** @@ -285,19 +304,15 @@ public void consume(Object event) { @Override public void applicationPeerAdded(Object peer) { if (peer instanceof AppEventListener) { - synchronized (listeners) { - AppEventListener l = (AppEventListener) peer; - addListener(l); - } + AppEventListener l = (AppEventListener) peer; + addListener(l); } } @Override public void applicationPeerRemoved(Object peer) { - synchronized (listeners) { - AppEventListener l = (AppEventListener) peer; - removeListener(l); - } + AppEventListener l = (AppEventListener) peer; + removeListener(l); } From 33c749048b0f92efab77a3b9010151477a3eb172 Mon Sep 17 00:00:00 2001 From: lhumphrey Date: Wed, 27 Sep 2023 16:34:39 -0400 Subject: [PATCH 2/7] Updated build files and NetBeans project files to JDK 11 --- OpenAMASE/build.xml | 146 +- ...-modules-java-j2seproject-copylibstask.jar | Bin 22969 -> 111130 bytes OpenAMASE/lib/nblibraries.properties | 78 +- OpenAMASE/nbproject/build-impl.xml | 3265 +++++++++-------- OpenAMASE/nbproject/build-native.xml | 76 +- OpenAMASE/nbproject/genfiles.properties | 16 +- OpenAMASE/nbproject/project.properties | 195 +- 7 files changed, 2072 insertions(+), 1704 deletions(-) diff --git a/OpenAMASE/build.xml b/OpenAMASE/build.xml index 5ce1555..a91f698 100644 --- a/OpenAMASE/build.xml +++ b/OpenAMASE/build.xml @@ -1,73 +1,73 @@ - - - - - - - - - - - Builds, tests, and runs the project OpenAMASE. - - - + + + + + + + + + + + Builds, tests, and runs the project OpenAMASE. + + + diff --git a/OpenAMASE/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar b/OpenAMASE/lib/CopyLibs/org-netbeans-modules-java-j2seproject-copylibstask.jar index 14c3bbbf50780fcdd7e29a43c3b6b416f7850744..70ce7f6ce41be9f583b51c742bc5afcf515e4690 100644 GIT binary patch literal 111130 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 literal 22969 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set Core.dir - Must set Amase.dir - Must set SetupTool.dir - Must set src.example.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - No tests executed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set JVM to use for profiling in profiler.info.jvm - Must set profiler agent JVM arguments in profiler.info.jvmargs.agent - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - Must select one file in the IDE or set profile.class - This target only works when run from inside the NetBeans IDE. - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - This target only works when run from inside the NetBeans IDE. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - - - Must select some files in the IDE or set test.includes - - - - - Must select one file in the IDE or set run.class - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - Must select some files in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - Must select one file in the IDE or set test.class - Must select some method in the IDE or set test.method - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set Core.dir + Must set Amase.dir + Must set SetupTool.dir + Must set src.example.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenAMASE/nbproject/build-native.xml b/OpenAMASE/nbproject/build-native.xml index 1aa10a0..899e945 100644 --- a/OpenAMASE/nbproject/build-native.xml +++ b/OpenAMASE/nbproject/build-native.xml @@ -6,45 +6,24 @@ --> @@ -664,6 +643,25 @@ Portions Copyrighted 2013 Sun Microsystems, Inc. // manifest var man = jar.createManifest(); + var userManifestPath = project.getProperty("manifest.file"); + if (userManifestPath) { + var userManifestFile = project.resolveFile(userManifestPath); + if (userManifestFile.isFile()) { + var manifestEncoding = project.getProperty("manifest.encoding"); + var userManifestReader = manifestEncoding ? + new java.io.InputStreamReader( + new java.io.FileInputStream(userManifestFile), + manifestEncoding) : + new java.io.InputStreamReader( + new java.io.FileInputStream(userManifestFile)); + try { + var userManifest = new org.apache.tools.ant.taskdefs.Manifest(userManifestReader); + man.merge(userManifest); + } finally { + userManifestReader.close(); + } + } + } var a1val = new String(project.getProperty("application.vendor")); var a1 = new org.apache.tools.ant.taskdefs.Manifest.Attribute(); a1.setName("Implementation-Vendor"); diff --git a/OpenAMASE/nbproject/genfiles.properties b/OpenAMASE/nbproject/genfiles.properties index dca6934..32eae85 100644 --- a/OpenAMASE/nbproject/genfiles.properties +++ b/OpenAMASE/nbproject/genfiles.properties @@ -1,8 +1,8 @@ -build.xml.data.CRC32=bf9fc4ef -build.xml.script.CRC32=f19a1b87 -build.xml.stylesheet.CRC32=8064a381@1.79.1.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=bf9fc4ef -nbproject/build-impl.xml.script.CRC32=90f070c0 -nbproject/build-impl.xml.stylesheet.CRC32=05530350@1.79.1.48 +build.xml.data.CRC32=bf9fc4ef +build.xml.script.CRC32=f19a1b87 +build.xml.stylesheet.CRC32=f85dc8f2@1.108.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=bf9fc4ef +nbproject/build-impl.xml.script.CRC32=c61f68a4 +nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.108.0.48 diff --git a/OpenAMASE/nbproject/project.properties b/OpenAMASE/nbproject/project.properties index 5241859..ece9d0d 100644 --- a/OpenAMASE/nbproject/project.properties +++ b/OpenAMASE/nbproject/project.properties @@ -1,90 +1,105 @@ -Amase.dir=${file.reference.src-Amase} -annotation.processing.enabled=true -annotation.processing.enabled.in.editor=false -annotation.processing.processors.list= -annotation.processing.run.all.processors=true -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -application.title=OpenAMASE -application.vendor=AFRL.RQ -auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml -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 -Core.dir=${file.reference.src-Core} -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/OpenAMASE.jar -dist.javadoc.dir=${dist.dir}/javadoc -endorsed.classpath= -excludes= -file.reference.lmcplib.jar=lib/lmcplib.jar -file.reference.src-Amase=src/Amase -file.reference.src-Core=src/Core -file.reference.src-SetupTool=src/SetupTool -file.reference.worldwind.jar=lib/worldwind.jar -includes=** -jar.compress=false -javac.classpath=\ - ${file.reference.lmcplib.jar}:\ - ${libs.Flexdock.classpath}:\ - ${libs.SwingX.classpath}:\ - ${libs.GRAL.classpath}:\ - ${file.reference.worldwind.jar} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.external.vm=false -javac.processorpath=\ - ${javac.classpath} -javac.source=1.7 -javac.target=1.7 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javac.test.processorpath=\ - ${javac.test.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class=avtas.app.Application -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -mkdist.disabled=true -native.bundling.enabled=true -platform.active=default_platform -project.license=rqqd_license -project.licensePath=./nbproject/rqqd_license.txt -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=-splash:./data/amase_splash.png -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -SetupTool.dir=${file.reference.src-SetupTool} -source.encoding=UTF-8 -src.example.dir=src\\example +Amase.dir=${file.reference.src-Amase} +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=OpenAMASE +application.vendor=AFRL.RQ +auxiliary.org-netbeans-spi-editor-hints-projects.perProjectHintSettingsFile=nbproject/cfg_hints.xml +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 +Core.dir=${file.reference.src-Core} +# 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} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/OpenAMASE.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.lmcplib.jar=lib/lmcplib.jar +file.reference.src-Amase=src/Amase +file.reference.src-Core=src/Core +file.reference.src-SetupTool=src/SetupTool +file.reference.worldwind.jar=lib/worldwind.jar +includes=** +jar.compress=false +javac.classpath=\ + ${file.reference.lmcplib.jar}:\ + ${libs.Flexdock.classpath}:\ + ${libs.SwingX.classpath}:\ + ${libs.GRAL.classpath}:\ + ${file.reference.worldwind.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.external.vm=false +javac.modulepath= +javac.processormodulepath= +javac.processorpath=\ + ${javac.classpath} +javac.source=11 +javac.target=11 +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= +jlink.launcher=false +jlink.launcher.name=OpenAMASE +main.class=avtas.app.Application +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +native.bundling.enabled=true +platform.active=default_platform +project.license=rqqd_license +project.licensePath=./nbproject/rqqd_license.txt +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=-splash:./data/amase_splash.png +run.modulepath=\ + ${javac.modulepath} +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +run.test.modulepath=\ + ${javac.test.modulepath} +SetupTool.dir=${file.reference.src-SetupTool} +source.encoding=UTF-8 +src.example.dir=src\\example From 02d4b9621c245018b3dfef1037e0da70b27c77f7 Mon Sep 17 00:00:00 2001 From: lhumphrey Date: Fri, 29 Sep 2023 14:05:35 -0400 Subject: [PATCH 3/7] In src/Core/avtas/map/graphics/MapGraphicsList.java: Removed deprecated method getLength(). In src/Core/avtas/swing/IntegerWrapModel.java: Java does autoboxing/unboxing between int and Integer, so using to convert int i to an Integer is unnecessary and deprecated. --- .../src/Core/avtas/map/graphics/MapGraphicsList.java | 8 -------- OpenAMASE/src/Core/avtas/swing/IntegerWrapModel.java | 12 ++++++------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/OpenAMASE/src/Core/avtas/map/graphics/MapGraphicsList.java b/OpenAMASE/src/Core/avtas/map/graphics/MapGraphicsList.java index 587c2ec..269c53d 100644 --- a/OpenAMASE/src/Core/avtas/map/graphics/MapGraphicsList.java +++ b/OpenAMASE/src/Core/avtas/map/graphics/MapGraphicsList.java @@ -109,14 +109,6 @@ public void setPainter(Painter painter) { super.setPainter(painter); } - /** - * @deprecated Use {@link #size() } instead. - * @return length of the internalList - */ - public int getLength() { - return internalList.size(); - } - /** * Returns all of the graphics that intersect the given screen location in the * current projection. diff --git a/OpenAMASE/src/Core/avtas/swing/IntegerWrapModel.java b/OpenAMASE/src/Core/avtas/swing/IntegerWrapModel.java index 69e5248..010d3ea 100644 --- a/OpenAMASE/src/Core/avtas/swing/IntegerWrapModel.java +++ b/OpenAMASE/src/Core/avtas/swing/IntegerWrapModel.java @@ -37,19 +37,19 @@ public IntegerWrapModel(int val, int min, int max, int interval) { this.max = max; this.interval = interval; - setValue( new Integer(val)); + setValue(val); } public Object getPreviousValue() { if (val - interval >= min) - return new Integer(val-interval); - else return new Integer(max-interval); + return (val - interval); + else return (max - interval); } public Object getNextValue() { if (val + interval < max) - return new Integer(val + interval); - else return new Integer(min); + return (val + interval); + else return min; } public void setValue(Object o) { @@ -60,7 +60,7 @@ public void setValue(Object o) { } public Object getValue() { - return new Integer(val); + return val; } } From 06ec04fff211f487f5b93de9fc534cfcbadf84bd Mon Sep 17 00:00:00 2001 From: DocEast Date: Mon, 22 Apr 2024 14:50:04 -0400 Subject: [PATCH 4/7] Removed finalize() due to deprecation. --- OpenAMASE/src/Core/avtas/data/PersistentList.java | 5 +++-- OpenAMASE/src/Core/avtas/map/layers/BufferSupport.java | 9 ++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/OpenAMASE/src/Core/avtas/data/PersistentList.java b/OpenAMASE/src/Core/avtas/data/PersistentList.java index 1cb8a60..63ee275 100644 --- a/OpenAMASE/src/Core/avtas/data/PersistentList.java +++ b/OpenAMASE/src/Core/avtas/data/PersistentList.java @@ -256,12 +256,13 @@ public void close() { } } + /** @Override protected void finalize() throws Throwable { close(); - super.finalize(); } - + * Deprecated, uncalled + */ /** * * @return size of the persistent storage file underlying this list. diff --git a/OpenAMASE/src/Core/avtas/map/layers/BufferSupport.java b/OpenAMASE/src/Core/avtas/map/layers/BufferSupport.java index 52381e0..f7d69c4 100644 --- a/OpenAMASE/src/Core/avtas/map/layers/BufferSupport.java +++ b/OpenAMASE/src/Core/avtas/map/layers/BufferSupport.java @@ -45,8 +45,7 @@ * * @author AFRL/RQQD */ -public class BufferSupport { - +public class BufferSupport implements AutoCloseable{ private RenderThread renderThread = null; private MapScaledImage frontGraphic = null; private MapScaledImage backGraphic = null; @@ -62,9 +61,9 @@ public class BufferSupport { public BufferSupport(MapLayer layer) { this.layer = layer; } - - @Override - protected void finalize() throws Throwable { + + @ Override + public void close() { if (backRaster != null) { backRaster.flush(); } From fefe922ad576101f603257d97ece9698d536c93e Mon Sep 17 00:00:00 2001 From: DocEast Date: Tue, 2 Jul 2024 12:38:49 -0400 Subject: [PATCH 5/7] Updates to Develop Branch --- OpenAMASE/nbproject/project.properties | 6 +++--- OpenAMASE/src/Amase/avtas/amase/map/MapPlugin.java | 2 +- .../avtas/amase/objtree/LmcpObjectActions.java | 2 +- OpenAMASE/src/Core/avtas/map/MapPanel.java | 14 +++++++------- .../src/Core/avtas/properties/XmlSerializer.java | 7 +++++-- OpenAMASE/src/Core/avtas/swing/FindTool.java | 2 +- OpenAMASE/src/Core/avtas/util/ReflectionUtils.java | 2 +- OpenAMASE/src/Core/avtas/xml/ui/XMLComposer.java | 2 +- OpenAMASE/src/Core/avtas/xml/ui/XMLEditPane.java | 8 ++++---- OpenAMASE/src/Core/avtas/xml/ui/XmlView.java | 3 ++- .../avtas/amase/validator/ValidatorPlugin.java | 2 +- 11 files changed, 27 insertions(+), 23 deletions(-) diff --git a/OpenAMASE/nbproject/project.properties b/OpenAMASE/nbproject/project.properties index ece9d0d..cf7ffb6 100644 --- a/OpenAMASE/nbproject/project.properties +++ b/OpenAMASE/nbproject/project.properties @@ -49,14 +49,14 @@ javac.classpath=\ ${file.reference.worldwind.jar} # Space-separated list of extra javac options javac.compilerargs= -javac.deprecation=false +javac.deprecation=true javac.external.vm=false javac.modulepath= javac.processormodulepath= javac.processorpath=\ ${javac.classpath} -javac.source=11 -javac.target=11 +javac.source=21 +javac.target=21 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} diff --git a/OpenAMASE/src/Amase/avtas/amase/map/MapPlugin.java b/OpenAMASE/src/Amase/avtas/amase/map/MapPlugin.java index fd405c0..83deac6 100644 --- a/OpenAMASE/src/Amase/avtas/amase/map/MapPlugin.java +++ b/OpenAMASE/src/Amase/avtas/amase/map/MapPlugin.java @@ -293,7 +293,7 @@ public void actionPerformed(ActionEvent e) { try { Class c = Class.forName(ans); if (MapLayer.class.isAssignableFrom(c)) { - MapLayer layer = (MapLayer) c.newInstance(); + MapLayer layer = (MapLayer) c.getDeclaredConstructor().newInstance(); map.add(layer); if (context != null) { context.addObject(layer); diff --git a/OpenAMASE/src/Amase/avtas/amase/objtree/LmcpObjectActions.java b/OpenAMASE/src/Amase/avtas/amase/objtree/LmcpObjectActions.java index 896ac1f..96bd428 100644 --- a/OpenAMASE/src/Amase/avtas/amase/objtree/LmcpObjectActions.java +++ b/OpenAMASE/src/Amase/avtas/amase/objtree/LmcpObjectActions.java @@ -379,7 +379,7 @@ public static ArrayList getCompatibleTypes(Class origClass) { try { Class tClass = Class.forName(packName.getName() + "." + t); if (origClass.isAssignableFrom(tClass)) { - retList.add(tClass.newInstance()); + retList.add(tClass.getDeclaredConstructor().newInstance()); } } catch (Exception ex) { Logger.getLogger(LmcpObjectActions.class.getName()).log(Level.SEVERE, null, ex); diff --git a/OpenAMASE/src/Core/avtas/map/MapPanel.java b/OpenAMASE/src/Core/avtas/map/MapPanel.java index 0af2462..fe616d4 100644 --- a/OpenAMASE/src/Core/avtas/map/MapPanel.java +++ b/OpenAMASE/src/Core/avtas/map/MapPanel.java @@ -174,7 +174,7 @@ public static MapLayer makeLayer(Element node) { String className = XMLUtil.getAttr(node, "Class", ""); if (!className.isEmpty()) { Class cl = Class.forName(className); - Object o = cl.newInstance(); + Object o = cl.getDeclaredConstructor().newInstance(); if (o instanceof MapLayer) { return (MapLayer) o; @@ -597,12 +597,12 @@ public void mouseDragged(MouseEvent e) { int dx = e.getX() - lastEvent.getX(); int dy = e.getY() - lastEvent.getY(); - int bothDown = (MouseEvent.BUTTON1_MASK | MouseEvent.BUTTON3_MASK); + int bothDown = (MouseEvent.BUTTON1_DOWN_MASK | MouseEvent.BUTTON3_DOWN_MASK); - if ((e.getModifiers() & bothDown) == bothDown) { + if ((e.getModifiersEx() & bothDown) == bothDown) { zoom(Math.pow(1.05, -dy), e); } - else if ((e.getModifiers() & MouseEvent.BUTTON3_MASK) == MouseEvent.BUTTON3_MASK) { + else if ((e.getModifiersEx() & MouseEvent.BUTTON3_DOWN_MASK) == MouseEvent.BUTTON3_DOWN_MASK) { pan(dx, dy); } else if (proj != null) { @@ -633,7 +633,7 @@ public void mouseReleased(MouseEvent e) { double lat = proj.getLat(e.getX(), e.getY()); popupMenu.showMenu(e, lat, lon); } - else if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == MouseEvent.BUTTON1_MASK) { + else if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == MouseEvent.BUTTON1_DOWN_MASK) { double lon = proj.getLon(e.getX(), e.getY()); double lat = proj.getLat(e.getX(), e.getY()); for (MapMouseListener l : mouseListeners) { @@ -658,7 +658,7 @@ public void mousePressed(MouseEvent e) { double lat = proj.getLat(e.getX(), e.getY()); popupMenu.showMenu(e, lat, lon); } - else if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == MouseEvent.BUTTON1_MASK) { + else if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == MouseEvent.BUTTON1_DOWN_MASK) { double lon = proj.getLon(e.getX(), e.getY()); double lat = proj.getLat(e.getX(), e.getY()); for (MapMouseListener l : mouseListeners) { @@ -698,7 +698,7 @@ public void mouseClicked(MouseEvent e) { double lat = proj.getLat(e.getX(), e.getY()); popupMenu.showMenu(e, lat, lon); } - else if ((e.getModifiers() & MouseEvent.BUTTON2_MASK) == MouseEvent.BUTTON2_MASK && proj != null) { + else if ((e.getModifiersEx() & MouseEvent.BUTTON2_DOWN_MASK) == MouseEvent.BUTTON2_DOWN_MASK && proj != null) { pan(-e.getX() + getWidth() / 2, -e.getY() + getHeight() / 2); } diff --git a/OpenAMASE/src/Core/avtas/properties/XmlSerializer.java b/OpenAMASE/src/Core/avtas/properties/XmlSerializer.java index d7dd5e6..16df0a2 100644 --- a/OpenAMASE/src/Core/avtas/properties/XmlSerializer.java +++ b/OpenAMASE/src/Core/avtas/properties/XmlSerializer.java @@ -21,6 +21,7 @@ import java.awt.Font; import java.io.File; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; @@ -115,7 +116,7 @@ public static Object deserialize(Element el) { String className = el.getName(); try { Class c = Class.forName(className); - Object o = c.newInstance(); + Object o = c.getDeclaredConstructor().newInstance(); for (Element child : el.getChildElements()) { Field f = ReflectionUtils.getField(c, child.getName()); @@ -143,7 +144,9 @@ else if (f != null) { } } return o; - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) { + } catch (ClassNotFoundException | InstantiationException | + IllegalAccessException | NoSuchMethodException | + InvocationTargetException ex ) { Logger.getLogger(XmlSerializer.class.getName()).log(Level.SEVERE, null, ex); return null; } diff --git a/OpenAMASE/src/Core/avtas/swing/FindTool.java b/OpenAMASE/src/Core/avtas/swing/FindTool.java index e59c992..eae125e 100644 --- a/OpenAMASE/src/Core/avtas/swing/FindTool.java +++ b/OpenAMASE/src/Core/avtas/swing/FindTool.java @@ -178,7 +178,7 @@ public boolean replace(String replaceTerm) { findNext(); try { - textComp.scrollRectToVisible(textComp.modelToView(textComp.getCaretPosition())); + textComp.scrollRectToVisible(textComp.modelToView2D(textComp.getCaretPosition()).getBounds()); } catch (BadLocationException ex) { Logger.getLogger(FindTool.class.getName()).log(Level.SEVERE, null, ex); } diff --git a/OpenAMASE/src/Core/avtas/util/ReflectionUtils.java b/OpenAMASE/src/Core/avtas/util/ReflectionUtils.java index 0c57ad4..96c2261 100644 --- a/OpenAMASE/src/Core/avtas/util/ReflectionUtils.java +++ b/OpenAMASE/src/Core/avtas/util/ReflectionUtils.java @@ -45,7 +45,7 @@ public static Object createInstance(String classname) throws Exception { //probably should do more checks here, but anything falls to the "could not create" exception anyway return Class.forName(classname).getDeclaredMethod("getInstance").invoke(null); } - Object o = Class.forName(classname).newInstance(); + Object o = Class.forName(classname).getDeclaredConstructor().newInstance(); return o; } diff --git a/OpenAMASE/src/Core/avtas/xml/ui/XMLComposer.java b/OpenAMASE/src/Core/avtas/xml/ui/XMLComposer.java index 7534a01..4a93361 100644 --- a/OpenAMASE/src/Core/avtas/xml/ui/XMLComposer.java +++ b/OpenAMASE/src/Core/avtas/xml/ui/XMLComposer.java @@ -239,7 +239,7 @@ public void setMenuContents(JPopupMenu menu, final java.awt.Point p) { menu.add(new AbstractAction("Edit Element") { public void actionPerformed(ActionEvent ae) { - XmlNode c = textEditor.getXML(textEditor.viewToModel(p)); + XmlNode c = textEditor.getXML(textEditor.viewToModel2D(p)); if (c != null) { TreePath p = xmlTree.getPath(c); if (p != null) { diff --git a/OpenAMASE/src/Core/avtas/xml/ui/XMLEditPane.java b/OpenAMASE/src/Core/avtas/xml/ui/XMLEditPane.java index bc4bdfc..082c787 100644 --- a/OpenAMASE/src/Core/avtas/xml/ui/XMLEditPane.java +++ b/OpenAMASE/src/Core/avtas/xml/ui/XMLEditPane.java @@ -165,7 +165,7 @@ public void select(XmlNode xml) { try { setSelectionStart(b.start); setSelectionEnd(b.end); - scrollRectToVisible(modelToView(b.start)); + scrollRectToVisible(modelToView2D(b.start).getBounds()); return; } catch (BadLocationException ex) { Logger.getLogger(XMLEditPane.class.getName()).log(Level.SEVERE, null, ex); @@ -186,7 +186,7 @@ public void goTo(XmlNode xml) { try { setCaretPosition(getText().length()); setCaretPosition(b.start); - Rectangle r = modelToView(b.start); + Rectangle r = modelToView2D(b.start).getBounds(); scrollRectToVisible(r); return; } catch (BadLocationException ex) { @@ -240,7 +240,7 @@ public void actionPerformed(ActionEvent e) { setSelectionStart(charLoc); setSelectionEnd(charLoc+1); try { - scrollRectToVisible(modelToView(charLoc)); + scrollRectToVisible(modelToView2D(charLoc).getBounds()); getHighlighter().addHighlight(charLoc, charLoc+1, HIGHLIGHT_PAINTER); } catch (BadLocationException ex1) { Logger.getLogger(XMLEditPane.class.getName()).log(Level.SEVERE, null, ex1); @@ -346,7 +346,7 @@ public void menuCanceled(MenuEvent e) { menu.add(gotoXMLMenu); // selects the entire XML content that is under the cursor. - XmlNode content = getXML(viewToModel(p)); + XmlNode content = getXML(viewToModel2D(p)); if (content != null) { JMenu contentSelMenu = new JMenu("Select XML Content"); menu.add(contentSelMenu); diff --git a/OpenAMASE/src/Core/avtas/xml/ui/XmlView.java b/OpenAMASE/src/Core/avtas/xml/ui/XmlView.java index ec8e394..60944c1 100644 --- a/OpenAMASE/src/Core/avtas/xml/ui/XmlView.java +++ b/OpenAMASE/src/Core/avtas/xml/ui/XmlView.java @@ -26,6 +26,7 @@ import java.awt.Color; import java.awt.Graphics; +import java.awt.Graphics2D; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -88,7 +89,7 @@ public XmlView(Element element) { } @Override - protected int drawUnselectedText(Graphics graphics, int x, int y, int p0, + protected float drawUnselectedText(Graphics2D graphics, float x, float y, int p0, int p1) throws BadLocationException { Document doc = getDocument(); diff --git a/OpenAMASE/src/SetupTool/avtas/amase/validator/ValidatorPlugin.java b/OpenAMASE/src/SetupTool/avtas/amase/validator/ValidatorPlugin.java index 0882b5a..00cfd82 100644 --- a/OpenAMASE/src/SetupTool/avtas/amase/validator/ValidatorPlugin.java +++ b/OpenAMASE/src/SetupTool/avtas/amase/validator/ValidatorPlugin.java @@ -80,7 +80,7 @@ public void addedToApplication(Context context, Element xml, String[] cmdParams) for (Element testEl : testsEl) { try { Class c = Class.forName(testEl.getText()); - Object test = c.newInstance(); + Object test = c.getDeclaredConstructor().newInstance(); if (test instanceof Test && !tests.contains(test)) { tests.add((Test) test); } From 3fa977db60054cd176bfc24421b83519d625a80f Mon Sep 17 00:00:00 2001 From: DocEast Date: Wed, 3 Jul 2024 13:46:34 -0400 Subject: [PATCH 6/7] project.properties javac 11 --- OpenAMASE/nbproject/project.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenAMASE/nbproject/project.properties b/OpenAMASE/nbproject/project.properties index cf7ffb6..0a795de 100644 --- a/OpenAMASE/nbproject/project.properties +++ b/OpenAMASE/nbproject/project.properties @@ -55,8 +55,8 @@ javac.modulepath= javac.processormodulepath= javac.processorpath=\ ${javac.classpath} -javac.source=21 -javac.target=21 +javac.source=11 +javac.target=11 javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir} From bcc120785c855403ba5fb3cb3da7b291312cc021 Mon Sep 17 00:00:00 2001 From: VVCAS-Sean Date: Thu, 11 Jul 2024 05:50:53 -0400 Subject: [PATCH 7/7] Updated readme to reflect requirment of Java JDK 11. --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e5108a7..a95a29a 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,9 @@ The AMASE simulation models 5-DOF (coordinated turning) flight dynamics with sel ## Requirements -*OpenAMASE* is a Java program that will run on any system with [Java][java download] installed. +*OpenAMASE* is a Java program that will run on any system with an appropriate version of Java installed. -[java download]: https://java.com/en/download/ - -To modify *OpenAMASE*, the Java JDK 1.8 or higher is required. All external libraries that *OpenAMASE* +To build or modify *OpenAMASE*, the Java JDK 1.11 or higher is required. All external libraries that *OpenAMASE* requires are included in the `lib` folder. For convenience, Netbeans project files are included to allow developers a quick way to change and re-build *OpenAMASE*.