GithubHelp home page GithubHelp logo

wave-app's Introduction

Gluon Wave Application

This repository contains the Gluon Wave Application, which is using the Signal protocol with Java and JavaFX.

Where can I test it?

We highly recommend to read this README first. Gluon Wave is a technical project, in an experimental phase. We hope it can serve many people and help achieve the goals of the Signal Foundation. At this moment though, you should not expect top-quality from this project. If you're not scared by that, and want to go to the download page immediately, here you go: https://github.com/gluonhq/wave-app/releases/tag/v1.0.5

About Signal

Signal is an encryption tool enabling end-to-end encryption. Messages sent via the Signal Protocol are encrypted by the sender, and decrypted by the recipient, using a combination of clever techniques including Extended Triple Diffie-Hellman and Double Ratchet.

The Signal protocol and its implementations are open-source and free to use (as long as the GPL license is respected). Signal respects users privacy and is not showing ads. Signal is a non-profit organisation, and accepts donations.

Signal on mobile and desktop

In order to use Signal, you need to install it on your phone first. Go to https://signal.org/download/ and follow the links for Android or iOS. Once you are using Signal on your phone, you can pair other devices, e.g. your desktop or laptop, and use Signal on those devices as well -- using the same account as the one you use on your phone. Currently, there is an electron-based desktop application that you can use on your system. The Wave Application in the repository you're currently looking at is a Java and JavaFX based alternative for this electron based application.

Signal and Java

We didn't have to start from scratch when writing this application. There is a Java implementation of the Signal protocol that is (or was) used by the Android client. That implementation served as the basis for the Java API's we needed for the Wave Application. We made a number of changes though, since we don't have to worry about Android restrictions. We rather use the latest Java, as developed in the OpenJDK. We forked the Signal repositories and updated them to Java 17. The access to the Signal Protocol is defined in the Gluon Equation project, which can be found at https://github.com/gluonhq/equation.git .

Wave App

The application in this repository uses the libraries described in the previous section, and creates a JavaFX user interface around them.

Running the Wave App

You can run Gluon Wave in 3 ways:

  • Download and run the native executables for Windows, Mac or Linux
  • Download and run the jpackaged installers for Windows, Mac or Linux
  • Build the code from this repository and run it.

Download and run

The first 2 options don't require a JVM at runtime. You can get the latest development versions and instructions from https://github.com/gluonhq/wave-app/releases/tag/v1.0.5

Keep in mind that this is a developer project, and you should not use this for critical/production purposes

The first option leverages the Java packager that is part of the JDK distributions. The second option leverages GraalVM native-image.

Building and running with the Java packager-based build

  • Set JAVA_HOME to a JDK 11+
  • Install all sub-projects in local maven repository:
mvn clean install
  • Execute the application:
cd App && mvn gluonfx:run

Building and running with the GraalVM Native Image-based build

  • Download the latest version of GraalVM from Gluon and unpack it like you would any other JDK.

  • Set GRAALVM_HOME environment variable to the GraalVM installation directory:

export GRAALVM_HOME=path-to-graalvm-directory
  • Native build the application:
mvn gluonfx:build -pl App
  • Once the build is successful, the native image be executed by:
mvn gluonfx:nativerun -pl App

What to do now?

Issues

There are a bunch of known and unknown issues, which you can report in the issue tracker of this repository.

Missing functionality

  • No support for groups
  • No support for attachments
  • No support for stickers

... but that is just a matter of time.

Known issues:

Below is a list of frequently asked questions / issues one might face during running ChatApp from source:

No Device Found (in the mobile app)

This error comes when the app is started, but you waited too long to scan the QR code

Network Error (in the mobile app)

This error normally occurs due to "Rate Limit Exceeded", which means that scanning was tried too often. You need to allow it to cool down and try again after 1 or 2 minutes.

Scanning done but no contact list shown

If all goes well, after the QR code is scanned, you should see your contact list in a few seconds. Sometimes, the contact sync requests isn't received. Current workaround is to close the application and start it again. If that doesn't work, remove all your linked devices from mobile app, remove ~/.signalfx directory and restart the application.

I want to contribute!

We're excited you're reading until here! We recommend that you fork this repository, and change whatever you want. You can work on a different theme, by modifying the CSS files. You can create a different layout, by modifying the FXML files. Or you can modify the flow and logic, by modifying the Java files.

wave-app's People

Contributors

abhinayagarwal avatar erwin1 avatar eugener avatar johanvos avatar jperedadnr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wave-app's Issues

Add a way to logout

#14 added a way to login using 'FirstName' and 'LastName'. Once the user logs in their name gets added to the ChatList.

There should be a way logout.

This should also enable re-logging in and avoid this problem:

Screenshot

messages sent via other devices are not shown

When a user sends a message from his primary device to a contact, this is not rendered in the chatapp.
(it is a content message-syncMessage instead of a dataMessage and currently ignored.)

NumberFormatException if stored message is multiline

Reading this message:

61eb513a-XXXXX-ed5f321
sorry
this is multiline

test
1634562152638

there is this exception that prevents the view from loading:

Caused by: java.lang.NumberFormatException: For input string: "this is multiline"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.base/java.lang.Long.parseLong(Long.java:692)
        at java.base/java.lang.Long.parseLong(Long.java:817)
        at [email protected]/com.gluonhq.chat.service.WaveService.readMessageForChannel(WaveService.java:151)
        at [email protected]/com.gluonhq.chat.service.WaveService.lambda$retrieveChannels$9(WaveService.java:124)
        at java.base/java.lang.Iterable.forEach(Iterable.java:75)
        at [email protected]/com.gluonhq.chat.service.WaveService.retrieveChannels(WaveService.java:124)
        at [email protected]/com.gluonhq.chat.service.WaveService.getChannels(WaveService.java:114)
        at [email protected]/com.gluonhq.chat.views.ChannelPresenter.createChannelList(ChannelPresenter.java:45)
        at [email protected]/com.gluonhq.chat.views.ChannelPresenter.initialize(ChannelPresenter.java:31)
 ``

app doesn't finish

When closing the application the app doesn't finish, and Ctrl+C is needed (from console) or even force-quit (running a packaged application)

Thread dump

Full thread dump OpenJDK 64-Bit Server VM (17+35-2724 mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x00007f9b18070bc0, length=14, elements={
0x00007f9b1300d800, 0x00007f9b148f9200, 0x00007f9b1480da00, 0x00007f9b1400a200,
0x00007f9b14811a00, 0x00007f9b148f9e00, 0x00007f9b148fa400, 0x00007f9b1381d000,
0x00007f9b1381be00, 0x00007f9b148faa00, 0x00007f9b148f3200, 0x00007f9b14219200,
0x00007f9b13c8d800, 0x00007f9b13e5b600
}

"main" #1 prio=5 os_prio=31 cpu=2346.39ms elapsed=91.30s tid=0x00007f9b1300d800 nid=0x1903 in Object.wait()  [0x000070000b336000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x000000070df41760> (a java.lang.ProcessImpl)
        at java.lang.Object.wait(java.base@17/Object.java:338)
        at java.lang.ProcessImpl.waitFor(java.base@17/ProcessImpl.java:434)
        - locked <0x000000070df41760> (a java.lang.ProcessImpl)
        at org.codehaus.plexus.util.cli.CommandLineUtils$2.call(CommandLineUtils.java:183)
        at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:108)
        at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:75)
        at org.apache.maven.shared.invoker.DefaultInvoker.executeCommandLine(DefaultInvoker.java:159)
        at org.apache.maven.shared.invoker.DefaultInvoker.execute(DefaultInvoker.java:112)
        at com.gluonhq.RunMojo.execute(RunMojo.java:131)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@17/Native Method)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@17/NativeMethodAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@17/DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(java.base@17/Method.java:568)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.54ms elapsed=91.26s tid=0x00007f9b148f9200 nid=0x4603 waiting on condition  [0x000070000ba4c000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@17/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@17/Reference.java:253)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@17/Reference.java:215)

"Finalizer" #3 daemon prio=8 os_prio=31 cpu=0.33ms elapsed=91.26s tid=0x00007f9b1480da00 nid=0x4403 in Object.wait()  [0x000070000bb4f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x000000070663fe38> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x000000070663fe38> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@17/Finalizer.java:172)

"Signal Dispatcher" #4 daemon prio=9 os_prio=31 cpu=0.25ms elapsed=91.24s tid=0x00007f9b1400a200 nid=0xa603 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #5 daemon prio=9 os_prio=31 cpu=0.26ms elapsed=91.24s tid=0x00007f9b14811a00 nid=0xa403 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #6 daemon prio=9 os_prio=31 cpu=3.39ms elapsed=91.24s tid=0x00007f9b148f9e00 nid=0xa303 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=31 cpu=1963.10ms elapsed=91.24s tid=0x00007f9b148fa400 nid=0x5b03 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #10 daemon prio=9 os_prio=31 cpu=1341.55ms elapsed=91.24s tid=0x00007f9b1381d000 nid=0x5d03 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #11 daemon prio=9 os_prio=31 cpu=4.67ms elapsed=91.25s tid=0x00007f9b1381be00 nid=0x5e03 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Notification Thread" #12 daemon prio=9 os_prio=31 cpu=0.11ms elapsed=91.24s tid=0x00007f9b148faa00 nid=0x6003 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #13 daemon prio=8 os_prio=31 cpu=0.54ms elapsed=91.24s tid=0x00007f9b148f3200 nid=0x9f03 in Object.wait()  [0x000070000c570000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x000000070669f958> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x000000070669f958> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@17/CleanerImpl.java:140)
        at java.lang.Thread.run(java.base@17/Thread.java:833)
        at jdk.internal.misc.InnocuousThread.run(java.base@17/InnocuousThread.java:162)

"process reaper" #16 daemon prio=10 os_prio=31 cpu=0.17ms elapsed=88.70s tid=0x00007f9b14219200 nid=0x6c03 runnable  [0x000070000ceb2000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ProcessHandleImpl.waitForProcessExit0(java.base@17/Native Method)
        at java.lang.ProcessHandleImpl$1.run(java.base@17/ProcessHandleImpl.java:147)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1136)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"Thread-2" #18 prio=5 os_prio=31 cpu=14.39ms elapsed=88.69s tid=0x00007f9b13c8d800 nid=0x9303 runnable  [0x000070000cfb5000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileInputStream.readBytes(java.base@17/Native Method)
        at java.io.FileInputStream.read(java.base@17/FileInputStream.java:276)
        at java.io.BufferedInputStream.read1(java.base@17/BufferedInputStream.java:282)
        at java.io.BufferedInputStream.read(java.base@17/BufferedInputStream.java:343)
        - locked <0x000000070df6ac20> (a java.lang.ProcessImpl$ProcessPipeInputStream)
        at sun.nio.cs.StreamDecoder.readBytes(java.base@17/StreamDecoder.java:270)
        at sun.nio.cs.StreamDecoder.implRead(java.base@17/StreamDecoder.java:313)
        at sun.nio.cs.StreamDecoder.read(java.base@17/StreamDecoder.java:188)
        - locked <0x000000070df8ca90> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(java.base@17/InputStreamReader.java:177)
        at java.io.BufferedReader.fill(java.base@17/BufferedReader.java:162)
        at java.io.BufferedReader.readLine(java.base@17/BufferedReader.java:329)
        - locked <0x000000070df8ca90> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(java.base@17/BufferedReader.java:396)
        at org.codehaus.plexus.util.cli.StreamPumper.run(StreamPumper.java:130)

"Thread-3" #19 prio=5 os_prio=31 cpu=59.90ms elapsed=88.69s tid=0x00007f9b13e5b600 nid=0x9103 runnable  [0x000070000d0b8000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileInputStream.readBytes(java.base@17/Native Method)
        at java.io.FileInputStream.read(java.base@17/FileInputStream.java:276)
        at java.io.BufferedInputStream.read1(java.base@17/BufferedInputStream.java:282)
        at java.io.BufferedInputStream.read(java.base@17/BufferedInputStream.java:343)
        - locked <0x000000070df6cd40> (a java.lang.ProcessImpl$ProcessPipeInputStream)
        at sun.nio.cs.StreamDecoder.readBytes(java.base@17/StreamDecoder.java:270)
        at sun.nio.cs.StreamDecoder.implRead(java.base@17/StreamDecoder.java:313)
        at sun.nio.cs.StreamDecoder.read(java.base@17/StreamDecoder.java:188)
        - locked <0x000000070df8f728> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(java.base@17/InputStreamReader.java:177)
        at java.io.BufferedReader.fill(java.base@17/BufferedReader.java:162)
        at java.io.BufferedReader.readLine(java.base@17/BufferedReader.java:329)
        - locked <0x000000070df8f728> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(java.base@17/BufferedReader.java:396)
        at org.codehaus.plexus.util.cli.StreamPumper.run(StreamPumper.java:130)

"VM Thread" os_prio=31 cpu=9.06ms elapsed=91.29s tid=0x00007f9b12d15900 nid=0x4703 runnable  

"GC Thread#0" os_prio=31 cpu=6.69ms elapsed=91.35s tid=0x00007f9b12f0d160 nid=0x5003 runnable  

"GC Thread#1" os_prio=31 cpu=14.44ms elapsed=90.71s tid=0x00007f9b12fc6db0 nid=0x6503 runnable  

"GC Thread#2" os_prio=31 cpu=14.87ms elapsed=90.71s tid=0x00007f9b12fc7650 nid=0x9b03 runnable  

"GC Thread#3" os_prio=31 cpu=14.46ms elapsed=90.71s tid=0x00007f9b12e51c40 nid=0x9a03 runnable  

"GC Thread#4" os_prio=31 cpu=14.36ms elapsed=90.71s tid=0x00007f9b12e52310 nid=0x9903 runnable  

"GC Thread#5" os_prio=31 cpu=14.23ms elapsed=90.71s tid=0x00007f9b12d62c80 nid=0x9803 runnable  

"GC Thread#6" os_prio=31 cpu=8.79ms elapsed=90.14s tid=0x00007f9b12dd7cd0 nid=0x9703 runnable  

"GC Thread#7" os_prio=31 cpu=0.23ms elapsed=88.94s tid=0x00007f9b12cde2b0 nid=0x6b03 runnable  

"G1 Main Marker" os_prio=31 cpu=0.05ms elapsed=91.35s tid=0x00007f9b12f0dfd0 nid=0x3403 runnable  

"G1 Conc#0" os_prio=31 cpu=0.04ms elapsed=91.35s tid=0x00007f9b12f0ed70 nid=0x4e03 runnable  

"G1 Refine#0" os_prio=31 cpu=0.06ms elapsed=91.35s tid=0x00007f9b12f295e0 nid=0x3803 runnable  

"G1 Service" os_prio=31 cpu=21.97ms elapsed=91.35s tid=0x00007f9b12f2a340 nid=0x3a03 runnable  

"VM Periodic Task Thread" os_prio=31 cpu=79.45ms elapsed=91.26s tid=0x00007f9b12f451e0 nid=0x6203 waiting on condition  

2021-10-15 11:15JNI global refs: 9, weak refs: 0

:45
Full thread dump OpenJDK 64-Bit Server VHeap
M (17+35 garbage-first heap  -27 total 266240K, used 52683K24 [0x0000000700000000, 0x0000000800000000) m
ix  region size 2048K, ed25 young (51200K),  m6 survivors (12288K)od
e,  Metaspace       used 16105K, committed 16320K, reserved 1064960K
sh  class space    used 1783K, committed 1920K, reserved 1048576K
ar
ing):

Threads class SMR info:
_java_thread_list=0x00007fb5d43deae0, length=15, elements={
0x00007fb5d3808a00, 0x00007fb5d482c000, 0x00007fb5d482e800, 0x00007fb5d4830000,
0x00007fb5d482cc00, 0x00007fb5d482d200, 0x00007fb5d482d800, 0x00007fb5d20c8e00,
0x00007fb5d20c8000, 0x00007fb5d5811600, 0x00007fb5d580f000, 0x00007fb5d60a1c00,
0x00007fb5d1c7a200, 0x00007fb5d3831000, 0x00007fb5d3829600
}

"main" #1 prio=5 os_prio=31 cpu=2301.97ms elapsed=88.62s tid=0x00007fb5d3808a00 nid=0x1703 in Object.wait()  [0x0000700006dd9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x000000070e1d10a0> (a java.lang.ProcessImpl)
        at java.lang.Object.wait(java.base@17/Object.java:338)
        at java.lang.ProcessImpl.waitFor(java.base@17/ProcessImpl.java:434)
        - locked <0x000000070e1d10a0> (a java.lang.ProcessImpl)
        at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:364)
        at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
        at org.openjfx.JavaFXBaseMojo.executeCommandLine(JavaFXBaseMojo.java:567)
        at org.openjfx.JavaFXBaseMojo.executeCommandLine(JavaFXBaseMojo.java:434)
        at org.openjfx.JavaFXRunMojo.execute(JavaFXRunMojo.java:105)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:193)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@17/Native Method)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@17/NativeMethodAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@17/DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(java.base@17/Method.java:568)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)

"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=0.46ms elapsed=88.61s tid=0x00007fb5d482c000 nid=0x3e03 waiting on condition  [0x00007000074ef000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@17/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@17/Reference.java:253)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@17/Reference.java:215)

"Finalizer" #3 daemon prio=8 os_prio=31 cpu=0.22ms elapsed=88.61s tid=0x00007fb5d482e800 nid=0x3f03 in Object.wait()  [0x00007000075f2000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x000000070661ef28> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x000000070661ef28> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@17/Finalizer.java:172)

"Signal Dispatcher" #4 daemon prio=9 os_prio=31 cpu=0.21ms elapsed=88.60s tid=0x00007fb5d4830000 nid=0xa703 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #5 daemon prio=9 os_prio=31 cpu=0.17ms elapsed=88.60s tid=0x00007fb5d482cc00 nid=0xa503 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #6 daemon prio=9 os_prio=31 cpu=3.76ms elapsed=88.60s tid=0x00007fb5d482d200 nid=0xa403 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=31 cpu=1882.47ms elapsed=88.60s tid=0x00007fb5d482d800 nid=0x5c03 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #10 daemon prio=9 os_prio=31 cpu=1337.03ms elapsed=88.60s tid=0x00007fb5d20c8e00 nid=0x5e03 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #11 daemon prio=9 os_prio=31 cpu=3.73ms elapsed=88.60s tid=0x00007fb5d20c8000 nid=0x5f03 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Notification Thread" #12 daemon prio=9 os_prio=31 cpu=0.06ms elapsed=88.60s tid=0x00007fb5d5811600 nid=0x6003 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #13 daemon prio=8 os_prio=31 cpu=0.52ms elapsed=88.59s tid=0x00007fb5d580f000 nid=0xa003 in Object.wait()  [0x0000700008013000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x000000070661f0e0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x000000070661f0e0> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@17/CleanerImpl.java:140)
        at java.lang.Thread.run(java.base@17/Thread.java:833)
        at jdk.internal.misc.InnocuousThread.run(java.base@17/InnocuousThread.java:162)

"process reaper" #16 daemon prio=10 os_prio=31 cpu=0.18ms elapsed=86.25s tid=0x00007fb5d60a1c00 nid=0x9203 runnable  [0x0000700008955000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ProcessHandleImpl.waitForProcessExit0(java.base@17/Native Method)
        at java.lang.ProcessHandleImpl$1.run(java.base@17/ProcessHandleImpl.java:147)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1136)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"Exec Stream Pumper" #18 daemon prio=5 os_prio=31 cpu=0.17ms elapsed=86.25s tid=0x00007fb5d1c7a200 nid=0x9103 runnable  [0x0000700008a58000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileInputStream.readBytes(java.base@17/Native Method)
        at java.io.FileInputStream.read(java.base@17/FileInputStream.java:276)
        at java.io.BufferedInputStream.fill(java.base@17/BufferedInputStream.java:244)
        at java.io.BufferedInputStream.read1(java.base@17/BufferedInputStream.java:284)
        at java.io.BufferedInputStream.read(java.base@17/BufferedInputStream.java:343)
        - locked <0x000000070e1fb298> (a java.lang.ProcessImpl$ProcessPipeInputStream)
        at java.io.FilterInputStream.read(java.base@17/FilterInputStream.java:106)
        at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:107)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"Exec Stream Pumper" #19 daemon prio=5 os_prio=31 cpu=11.16ms elapsed=86.25s tid=0x00007fb5d3831000 nid=0x8f03 runnable  [0x0000700008b5b000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileInputStream.readBytes(java.base@17/Native Method)
        at java.io.FileInputStream.read(java.base@17/FileInputStream.java:276)
        at java.io.BufferedInputStream.fill(java.base@17/BufferedInputStream.java:244)
        at java.io.BufferedInputStream.read1(java.base@17/BufferedInputStream.java:284)
        at java.io.BufferedInputStream.read(java.base@17/BufferedInputStream.java:343)
        - locked <0x000000070e1fd3b8> (a java.lang.ProcessImpl$ProcessPipeInputStream)
        at java.io.FilterInputStream.read(java.base@17/FilterInputStream.java:106)
        at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:107)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"Exec Input Stream Pumper" #17 daemon prio=5 os_prio=31 cpu=67.41ms elapsed=86.25s tid=0x00007fb5d3829600 nid=0x8e03 waiting on condition  [0x0000700008c5e000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(java.base@17/Native Method)
        at org.apache.commons.exec.InputStreamPumper.run(InputStreamPumper.java:69)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"VM Thread" os_prio=31 cpu=8.02ms elapsed=88.61s tid=0x00007fb5d3013890 nid=0x4603 runnable  

"GC Thread#0" os_prio=31 cpu=14.00ms elapsed=88.62s tid=0x00007fb5d41052d0 nid=0x5003 runnable  

"GC Thread#1" os_prio=31 cpu=15.27ms elapsed=88.19s tid=0x00007fb5d435fbf0 nid=0x6603 runnable  

"GC Thread#2" os_prio=31 cpu=15.44ms elapsed=88.19s tid=0x00007fb5d15b1950 nid=0x9b03 runnable  

"GC Thread#3" os_prio=31 cpu=15.12ms elapsed=88.19s tid=0x00007fb5d15b2150 nid=0x9903 runnable  

"GC Thread#4" os_prio=31 cpu=5.85ms elapsed=88.19s tid=0x00007fb5d15b29b0 nid=0x9703 runnable  

"GC Thread#5" os_prio=31 cpu=13.54ms elapsed=88.19s tid=0x00007fb5d15b3250 nid=0x6703 runnable  

"GC Thread#6" os_prio=31 cpu=8.46ms elapsed=87.68s tid=0x00007fb5d14e6090 nid=0x9503 runnable  

"GC Thread#7" os_prio=31 cpu=0.24ms elapsed=86.39s tid=0x00007fb5d784f6b0 nid=0x6903 runnable  

"G1 Main Marker" os_prio=31 cpu=0.10ms elapsed=88.62s tid=0x00007fb5d4106100 nid=0x4f03 runnable  

"G1 Conc#0" os_prio=31 cpu=0.06ms elapsed=88.62s tid=0x00007fb5d42040d0 nid=0x3503 runnable  

"G1 Refine#0" os_prio=31 cpu=0.06ms elapsed=88.62s tid=0x00007fb5d1521160 nid=0x3703 runnable  

"G1 Service" os_prio=31 cpu=21.58ms elapsed=88.62s tid=0x00007fb5d1521eb0 nid=0x4a03 runnable  

"VM Periodic Task Thread" os_prio=31 cpu=77.01ms elapsed=88.60s tid=0x00007fb5d430eee0 nid=0x6203 waiting on condition  

JNI global refs: 9, weak refs: 0

2021-10-15 11:15:45
Heap
Full thread dump OpenJDK 64-Bit Server VM (17+35-2724 mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x00007fee3096e000, length=24, elements={
 garbage-first heap   total 266240K, used 48662K0x00007fee32816200, 0x00007fee32844e00, 0x00007fee32848c00, 0x00007fee3284ac00,
 [0x0000000700000000, 0x0000000800000000)
0x00007fee3284b200, 0x00007fee32847000, 0x00007fee32847600, 0x00007fee3284c200,
  region size 2048K, 24 young (49152K), 0x00007fee3284e200, 0x00007fee3180a200, 0x00007fee328a4a00, 0x00007fee329a0a00,
6 survivors (12288K)
0x00007fee3202e000, 0x00007fee321cba00, 0x00007fee2fdcde00, 0x00007fee33813000,
 Metaspace       used 16598K, committed 16896K, reserved 1064960K
  class space    used 1910K, committed 2048K, reserved 1048576K
0x00007fee321cb400, 0x00007fee313df000, 0x00007fee31a31600, 0x00007fee3255b400,

0x00007fee313e3000, 0x00007fee2fde4600, 0x00007fee321a5400, 0x00007fee321ba200
}

"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=1.29ms elapsed=86.22s tid=0x00007fee32816200 nid=0x4003 waiting on condition  [0x0000700008ab1000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@17/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@17/Reference.java:253)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@17/Reference.java:215)

"Finalizer" #3 daemon prio=8 os_prio=31 cpu=0.24ms elapsed=86.22s tid=0x00007fee32844e00 nid=0x3f03 in Object.wait()  [0x0000700008bb4000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x0000000700202768> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x0000000700202768> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@17/Finalizer.java:172)

"Signal Dispatcher" #4 daemon prio=9 os_prio=31 cpu=0.19ms elapsed=86.21s tid=0x00007fee32848c00 nid=0x5b03 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #5 daemon prio=9 os_prio=31 cpu=0.46ms elapsed=86.21s tid=0x00007fee3284ac00 nid=0x5c03 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #6 daemon prio=9 os_prio=31 cpu=3.32ms elapsed=86.21s tid=0x00007fee3284b200 nid=0x5d03 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=31 cpu=2678.16ms elapsed=86.21s tid=0x00007fee32847000 nid=0xa403 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #10 daemon prio=9 os_prio=31 cpu=1505.02ms elapsed=86.21s tid=0x00007fee32847600 nid=0xa203 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #11 daemon prio=9 os_prio=31 cpu=4.71ms elapsed=86.21s tid=0x00007fee3284c200 nid=0xa003 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #12 daemon prio=8 os_prio=31 cpu=2.01ms elapsed=86.19s tid=0x00007fee3284e200 nid=0x5f03 in Object.wait()  [0x00007000093cf000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x0000000700204d58> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x0000000700204d58> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@17/CleanerImpl.java:140)
        at java.lang.Thread.run(java.base@17/Thread.java:833)
        at jdk.internal.misc.InnocuousThread.run(java.base@17/InnocuousThread.java:162)

"Notification Thread" #13 daemon prio=9 os_prio=31 cpu=0.07ms elapsed=85.99s tid=0x00007fee3180a200 nid=0x9d03 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"InvokeLaterDispatcher" #16 daemon prio=5 os_prio=31 cpu=6.25ms elapsed=85.78s tid=0x00007fee328a4a00 nid=0x750f waiting on condition  [0x0000700009ded000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@17/Native Method)
        - parking to wait for  <0x00000007008e98d8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@17/LockSupport.java:341)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@17/AbstractQueuedSynchronizer.java:506)
        at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@17/ForkJoinPool.java:3463)
        at java.util.concurrent.ForkJoinPool.managedBlock(java.base@17/ForkJoinPool.java:3434)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@17/AbstractQueuedSynchronizer.java:1623)
        at java.util.concurrent.LinkedBlockingDeque.takeFirst(java.base@17/LinkedBlockingDeque.java:485)
        at com.sun.glass.ui.InvokeLaterDispatcher.run(javafx.graphics/InvokeLaterDispatcher.java:109)

"Prism Font Disposer" #23 daemon prio=10 os_prio=31 cpu=0.22ms elapsed=84.79s tid=0x00007fee329a0a00 nid=0x11203 in Object.wait()  [0x000070000a302000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x0000000700202918> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x0000000700202918> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:176)
        at com.sun.javafx.font.Disposer.run(javafx.graphics/Disposer.java:94)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"OkHttp https://textsecure-service.whispersystems.org/..." #25 prio=5 os_prio=31 cpu=157.27ms elapsed=84.18s tid=0x00007fee3202e000 nid=0x10f03 runnable  [0x000070000a70d000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.Net.poll(java.base@17/Native Method)
        at sun.nio.ch.NioSocketImpl.park(java.base@17/NioSocketImpl.java:181)
        at sun.nio.ch.NioSocketImpl.park(java.base@17/NioSocketImpl.java:190)
        at sun.nio.ch.NioSocketImpl.implRead(java.base@17/NioSocketImpl.java:314)
        at sun.nio.ch.NioSocketImpl.read(java.base@17/NioSocketImpl.java:350)
        at sun.nio.ch.NioSocketImpl$1.read(java.base@17/NioSocketImpl.java:803)
        at java.net.Socket$SocketInputStream.read(java.base@17/Socket.java:966)
        at sun.security.ssl.SSLSocketInputRecord.read(java.base@17/SSLSocketInputRecord.java:478)
        at sun.security.ssl.SSLSocketInputRecord.readHeader(java.base@17/SSLSocketInputRecord.java:472)
        at sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(java.base@17/SSLSocketInputRecord.java:70)
        at sun.security.ssl.SSLSocketImpl.readApplicationRecord(java.base@17/SSLSocketImpl.java:1455)
        at sun.security.ssl.SSLSocketImpl$AppInputStream.read(java.base@17/SSLSocketImpl.java:1059)
        at okio.Okio$2.read([email protected]/Okio.java:140)
        at okio.AsyncTimeout$2.read([email protected]/AsyncTimeout.java:237)
        at okio.RealBufferedSource.request([email protected]/RealBufferedSource.java:68)
        at okio.RealBufferedSource.require([email protected]/RealBufferedSource.java:61)
        at okio.RealBufferedSource.readByte([email protected]/RealBufferedSource.java:74)
        at okhttp3.internal.ws.WebSocketReader.readHeader([email protected]/WebSocketReader.java:117)
        at okhttp3.internal.ws.WebSocketReader.processNextFrame([email protected]/WebSocketReader.java:101)
        at okhttp3.internal.ws.RealWebSocket.loopReader([email protected]/RealWebSocket.java:274)
        at okhttp3.internal.ws.RealWebSocket$2.onResponse([email protected]/RealWebSocket.java:214)
        at okhttp3.RealCall$AsyncCall.execute([email protected]/RealCall.java:206)
        at okhttp3.internal.NamedRunnable.run([email protected]/NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1136)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"OkHttp https://textsecure-service.whispersystems.org/..." #26 prio=5 os_prio=31 cpu=128.42ms elapsed=84.18s tid=0x00007fee321cba00 nid=0x10e03 runnable  [0x000070000a810000]
   java.lang.Thread.State: RUNNABLE
        at sun.nio.ch.Net.poll(java.base@17/Native Method)
        at sun.nio.ch.NioSocketImpl.park(java.base@17/NioSocketImpl.java:181)
        at sun.nio.ch.NioSocketImpl.park(java.base@17/NioSocketImpl.java:190)
        at sun.nio.ch.NioSocketImpl.implRead(java.base@17/NioSocketImpl.java:314)
        at sun.nio.ch.NioSocketImpl.read(java.base@17/NioSocketImpl.java:350)
        at sun.nio.ch.NioSocketImpl$1.read(java.base@17/NioSocketImpl.java:803)
        at java.net.Socket$SocketInputStream.read(java.base@17/Socket.java:966)
        at sun.security.ssl.SSLSocketInputRecord.read(java.base@17/SSLSocketInputRecord.java:478)
        at sun.security.ssl.SSLSocketInputRecord.readHeader(java.base@17/SSLSocketInputRecord.java:472)
        at sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(java.base@17/SSLSocketInputRecord.java:70)
        at sun.security.ssl.SSLSocketImpl.readApplicationRecord(java.base@17/SSLSocketImpl.java:1455)
        at sun.security.ssl.SSLSocketImpl$AppInputStream.read(java.base@17/SSLSocketImpl.java:1059)
        at okio.Okio$2.read([email protected]/Okio.java:140)
        at okio.AsyncTimeout$2.read([email protected]/AsyncTimeout.java:237)
        at okio.RealBufferedSource.request([email protected]/RealBufferedSource.java:68)
        at okio.RealBufferedSource.require([email protected]/RealBufferedSource.java:61)
        at okio.RealBufferedSource.readByte([email protected]/RealBufferedSource.java:74)
        at okhttp3.internal.ws.WebSocketReader.readHeader([email protected]/WebSocketReader.java:117)
        at okhttp3.internal.ws.WebSocketReader.processNextFrame([email protected]/WebSocketReader.java:101)
        at okhttp3.internal.ws.RealWebSocket.loopReader([email protected]/RealWebSocket.java:274)
        at okhttp3.internal.ws.RealWebSocket$2.onResponse([email protected]/RealWebSocket.java:214)
        at okhttp3.RealCall$AsyncCall.execute([email protected]/RealCall.java:206)
        at okhttp3.internal.NamedRunnable.run([email protected]/NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1136)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"OkHttp ConnectionPool" #27 daemon prio=5 os_prio=31 cpu=0.19ms elapsed=83.71s tid=0x00007fee2fdcde00 nid=0xf437 in Object.wait()  [0x000070000aa17000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x0000000700204da0> (a okhttp3.ConnectionPool)
        at java.lang.Object.wait(java.base@17/Object.java:472)
        at okhttp3.ConnectionPool$1.run([email protected]/ConnectionPool.java:67)
        - locked <0x0000000700204da0> (a okhttp3.ConnectionPool)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1136)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"OkHttp ConnectionPool" #28 daemon prio=5 os_prio=31 cpu=0.13ms elapsed=83.71s tid=0x00007fee33813000 nid=0x10303 in Object.wait()  [0x000070000ab1a000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x00000007002018c0> (a okhttp3.ConnectionPool)
        at java.lang.Object.wait(java.base@17/Object.java:472)
        at okhttp3.ConnectionPool$1.run([email protected]/ConnectionPool.java:67)
        - locked <0x00000007002018c0> (a okhttp3.ConnectionPool)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1136)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"Okio Watchdog" #29 daemon prio=5 os_prio=31 cpu=0.32ms elapsed=83.71s tid=0x00007fee321cb400 nid=0xf517 in Object.wait()  [0x000070000ac1d000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x0000000700207748> (a java.lang.Class for okio.AsyncTimeout)
        at okio.AsyncTimeout.awaitTimeout([email protected]/AsyncTimeout.java:347)
        at okio.AsyncTimeout$Watchdog.run([email protected]/AsyncTimeout.java:312)
        - locked <0x0000000700207748> (a java.lang.Class for okio.AsyncTimeout)

"Thread-6" #31 prio=5 os_prio=31 cpu=1.18ms elapsed=83.59s tid=0x00007fee313df000 nid=0x10127 waiting on condition  [0x000070000ad20000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(java.base@17/Native Method)
        at com.gluonhq.wave.WaveManager.lambda$createMessageReceiver$1(com.gluonhq.wave/WaveManager.java:366)
        at com.gluonhq.wave.WaveManager$$Lambda$302/0x0000000800e29b78.sleep(com.gluonhq.wave/Unknown Source)
        at org.whispersystems.signalservice.internal.websocket.WebSocketConnection$KeepAliveSender.run([email protected]/WebSocketConnection.java:393)

"Thread-5" #30 prio=5 os_prio=31 cpu=1.02ms elapsed=83.59s tid=0x00007fee31a31600 nid=0xf703 waiting on condition  [0x000070000ae23000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(java.base@17/Native Method)
        at com.gluonhq.wave.WaveManager.lambda$createMessageReceiver$1(com.gluonhq.wave/WaveManager.java:366)
        at com.gluonhq.wave.WaveManager$$Lambda$302/0x0000000800e29b78.sleep(com.gluonhq.wave/Unknown Source)
        at org.whispersystems.signalservice.internal.websocket.WebSocketConnection$KeepAliveSender.run([email protected]/WebSocketConnection.java:393)

"Thread-7" #32 prio=5 os_prio=31 cpu=4.61ms elapsed=82.96s tid=0x00007fee3255b400 nid=0xf80f in Object.wait()  [0x000070000af26000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x00000007003ea9a0> (a org.whispersystems.signalservice.internal.websocket.WebSocketConnection)
        at org.whispersystems.signalservice.internal.util.Util.wait([email protected]/Util.java:137)
        at org.whispersystems.signalservice.internal.websocket.WebSocketConnection.readRequest([email protected]/WebSocketConnection.java:194)
        - locked <0x00000007003ea9a0> (a org.whispersystems.signalservice.internal.websocket.WebSocketConnection)
        at org.whispersystems.signalservice.api.SignalServiceMessagePipe.readOrEmpty([email protected]/SignalServiceMessagePipe.java:150)
        at org.whispersystems.signalservice.api.SignalServiceMessagePipe.read([email protected]/SignalServiceMessagePipe.java:124)
        at org.whispersystems.signalservice.api.SignalServiceMessagePipe.read([email protected]/SignalServiceMessagePipe.java:100)
        at com.gluonhq.wave.WaveManager$1.run(com.gluonhq.wave/WaveManager.java:408)

"OkHttp WebSocket https://textsecure-service.whispersystems.org/..." #33 prio=5 os_prio=31 cpu=2.11ms elapsed=82.95s tid=0x00007fee313e3000 nid=0xfa03 waiting on condition  [0x000070000b029000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@17/Native Method)
        - parking to wait for  <0x00000007011b39b0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@17/LockSupport.java:341)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@17/AbstractQueuedSynchronizer.java:506)
        at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@17/ForkJoinPool.java:3463)
        at java.util.concurrent.ForkJoinPool.managedBlock(java.base@17/ForkJoinPool.java:3434)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@17/AbstractQueuedSynchronizer.java:1623)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@17/ScheduledThreadPoolExecutor.java:1170)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@17/ScheduledThreadPoolExecutor.java:899)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@17/ThreadPoolExecutor.java:1062)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1122)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"Cleaner-0" #34 daemon prio=5 os_prio=31 cpu=0.17ms elapsed=82.70s tid=0x00007fee2fde4600 nid=0x1fc1f in Object.wait()  [0x000070000b12c000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@17/Native Method)
        - waiting on <0x00000007032e5ea0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@17/ReferenceQueue.java:155)
        - locked <0x00000007032e5ea0> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@17/CleanerImpl.java:140)
        at java.lang.Thread.run(java.base@17/Thread.java:833)
        at jdk.internal.misc.InnocuousThread.run(java.base@17/InnocuousThread.java:162)

"DestroyJavaVM" #37 prio=5 os_prio=31 cpu=747.98ms elapsed=78.08s tid=0x00007fee321a5400 nid=0x2703 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"OkHttp WebSocket https://textsecure-service.whispersystems.org/..." #38 prio=5 os_prio=31 cpu=0.71ms elapsed=28.59s tid=0x00007fee321ba200 nid=0x5917 waiting on condition  [0x0000700008cb7000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@17/Native Method)
        - parking to wait for  <0x00000007011b59a0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@17/LockSupport.java:341)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@17/AbstractQueuedSynchronizer.java:506)
        at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@17/ForkJoinPool.java:3463)
        at java.util.concurrent.ForkJoinPool.managedBlock(java.base@17/ForkJoinPool.java:3434)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@17/AbstractQueuedSynchronizer.java:1623)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@17/ScheduledThreadPoolExecutor.java:1170)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@17/ScheduledThreadPoolExecutor.java:899)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@17/ThreadPoolExecutor.java:1062)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17/ThreadPoolExecutor.java:1122)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17/ThreadPoolExecutor.java:635)
        at java.lang.Thread.run(java.base@17/Thread.java:833)

"VM Thread" os_prio=31 cpu=13.67ms elapsed=86.23s tid=0x00007fee30913e40 nid=0x4203 runnable  

"GC Thread#0" os_prio=31 cpu=28.16ms elapsed=86.23s tid=0x00007fee30c0f4a0 nid=0x2d03 runnable  

"GC Thread#1" os_prio=31 cpu=26.01ms elapsed=85.97s tid=0x00007fee3093a470 nid=0x9b03 runnable  

"GC Thread#2" os_prio=31 cpu=27.97ms elapsed=85.97s tid=0x00007fee3093ad70 nid=0x6403 runnable  

"GC Thread#3" os_prio=31 cpu=22.16ms elapsed=85.97s tid=0x00007fee3093b670 nid=0x9903 runnable  

"GC Thread#4" os_prio=31 cpu=26.06ms elapsed=85.97s tid=0x00007fee30c43960 nid=0x9703 runnable  

"GC Thread#5" os_prio=31 cpu=27.13ms elapsed=85.97s tid=0x00007fee30c44190 nid=0x9503 runnable  

"GC Thread#6" os_prio=31 cpu=19.22ms elapsed=84.69s tid=0x00007fee309d9250 nid=0xe703 runnable  

"GC Thread#7" os_prio=31 cpu=19.85ms elapsed=84.69s tid=0x00007fee309d9a30 nid=0xe903 runnable  

"G1 Main Marker" os_prio=31 cpu=0.39ms elapsed=86.23s tid=0x00007fee30b06840 nid=0x4a03 runnable  

"G1 Conc#0" os_prio=31 cpu=12.29ms elapsed=86.23s tid=0x00007fee30b07570 nid=0x3103 runnable  

"G1 Conc#1" os_prio=31 cpu=11.00ms elapsed=84.04s tid=0x00007fee35870f50 nid=0xed03 runnable  

"G1 Refine#0" os_prio=31 cpu=1.00ms elapsed=86.23s tid=0x00007fee30908770 nid=0x4703 runnable  

"G1 Refine#1" os_prio=31 cpu=0.37ms elapsed=84.69s tid=0x00007fee2ec34cd0 nid=0x11103 runnable  

"G1 Service" os_prio=31 cpu=22.25ms elapsed=86.23s tid=0x00007fee30909480 nid=0x4603 runnable  

"VM Periodic Task Thread" os_prio=31 cpu=77.32ms elapsed=86.00s tid=0x00007fee30b0fcc0 nid=0x6103 waiting on condition  

JNI global refs: 44, weak refs: 0

Heap
 garbage-first heap   total 81920K, used 57802K [0x0000000700000000, 0x0000000800000000)
  region size 2048K, 16 young (32768K), 1 survivors (2048K)
 Metaspace       used 34038K, committed 34432K, reserved 1081344K
  class space    used 4992K, committed 5184K, reserved 1048576K

add UI support for "isTyping"

Assuming that we receive messages "startedTyping" and "stoppedTyping", we need to visualize them.
The Channel class can have an Observable property for this, that is set by the service.
It can be a BooleanProperty that is true when the sender starts to type, and false when a stoppedTyping is received. That is an easy approach, but it can not be extended.

There is no way to release your application to Google Play!

Starting August 1, 2019, your apps published on Google Play will need to support 64-bit architectures. 64-bit CPUs deliver faster, richer experiences for your users. Adding a 64-bit version of your app provides performance improvements, makes way for future innovation, and sets you up for devices with 64-bit-only hardware.

https://developer.android.com/distribute/best-practices/develop/64-bit

Currently there is no way to rellease your application to Google Play.
uploading apk after apkRelease, zipalignRelease gives you this:
image

Create installers

Use jpackage to create installers for the three desktop platforms.

ConcurrentException on Linux

After pairing device, while retrieving contacts, several exceptions are thrown:

Exception in thread "JavaFX Application Thread" java.util.ConcurrentModificationException
        at java.base/java.util.AbstractList$RandomAccessSpliterator.checkAbstractListModCount(AbstractList.java:743)
        at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
        at [email protected]/com.gluonhq.chat.service.WaveService$2.lambda$invalidated$1(WaveService.java:113)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:290)
        at java.base/java.lang.Thread.run(Thread.java:834)

avatar images not retrieved

If user contacts have avatars, these should be rendered by the app.
Currently, all avatars in the contact list are null

NPE while posting first message using Cloudlink

This issue is not always reproducible.

While running ChatApp, a NPE is thrown while posting a Text message:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
        at [email protected]/com.gluonhq.chat.views.ChatPresenter.lambda$initialize$4(ChatPresenter.java:82)
        at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
        at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
        at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8889)
        at javafx.controls/javafx.scene.control.Button.fire(Button.java:203)
        at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:208)
        at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
        at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:247)
        at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:234)
        at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
        at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3856)
        at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1851)
        at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2584)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:409)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:299)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:447)
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
        at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:446)
        at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
        at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
        at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
        at java.base/java.lang.Thread.run(Thread.java:829)

This is because the backing messages list is initialized once messages are fetched from the service. To avoid this, we can either disable the TextArea and only enable it once the messages list has been initialized.

don't depend on SNAPSHOTs

The App component depends on SNAPSHOT versions of the components that are also in this repository.
It is better to depend on tagged versions only.

Outdated README

The prerequisites section does not apply to latest version any more. The app has been deprecated by web app.

hard timeout after 15 minutes

The loop in the message receiver code will terminate after 15 minutes of inactivity, with no way of recovering.
Either we should really disconnect and reconnect on action, or we should not terminate after 15 minutes.

Store prekeys

prekeys should be stored locally on persistent storage (temporary)

remove finest logging by default

When starting the application, there are a large number of messages similar to
FINEST: Property has_img_emojione not defined on json object for class class com.gluonhq.emoji.Emoji.
Oct 15, 2021 10:38:03 AM com.gluonhq.connect.converter.JsonConverter readFromJson

Can be fixed by changing the logging.properties (which is committed into this repo)

Add a unique identifier for login

#14 uses the name of a user to log them in. This can be easily duplicated. A better way to login would be to use an email which is unique for each user and cannot be duplicated.

UI feedback

  • Message list scrolling is sluggish almost all the time.
  • Title always has “[Portrait]” in it. I assumed it is for testing the orientation, but it does not change in Landscape mode
  • Entry field/plus button and “enter” button have to be smaller. Just slightly bigger then text size
  • “Enter” button probbaly needs to appear only where there a text in the field

Use Maven profiles

Using Maven profiles can be convenient to deal with different targets, where different set of properties and/or dependencies can be used.

A default profile can be set (typically host/desktop).

To run on host by default:
mvn clean client:build
mvn client:run

To run on other target like ios:
mvn clean -Pios client:compile
mvn -Pios client:link
mvn -Pios client:run
(note client:build doesn't work yet with profiles)

Add support for "is typing"

When a sender is typing a message, we want to be able to detect this.
Note: this issue is not about visualization of the "is typing" (which should be a separate issue)

Native-image: NoSuchMethodException: com.gluonhq.emoji.Emoji

Running native-image:

Starting Gluon VM...
Oct 18, 2021 5:45:51 PM com.gluonhq.connect.converter.JsonConverter readFromJson
WARNING: Failed to create object of type class com.gluonhq.emoji.Emoji from the following json object {"name":"HASH KEY","unified":"0023-FE0F-20E3","non_qualified":"0023-20E3","docomo":"E6E0","au":"EB84","softbank":"E210","google":"FE82C","image":"0023-fe0f-20e3.png","sheet_x":0,"sheet_y":0,"short_name":"hash","short_names":["hash"],"text":null,"texts":null,"category":"Symbols","sort_order":131,"added_in":"3.0","has_img_apple":true,"has_img_google":true,"has_img_twitter":true,"has_img_facebook":false,"has_img_messenger":false}
java.lang.NoSuchMethodException: com.gluonhq.emoji.Emoji.<init>()
	at java.lang.Class.getConstructor0(DynamicHub.java:3349)
	at java.lang.Class.getDeclaredConstructor(DynamicHub.java:2553)
	at com.gluonhq.connect.converter.JsonConverter.readFromJson(JsonConverter.java:115)
	at com.gluonhq.connect.converter.JsonIterableInputConverter.next(JsonIterableInputConverter.java:108)
	at com.gluonhq.emoji.EmojiData.<clinit>(EmojiData.java:36)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:375)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:295)
	at com.gluonhq.chat.GluonChat.<clinit>(GluonChat.java:40)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:375)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:295)

Exception in thread "main" java.lang.ExceptionInInitializerError
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:315)
	at com.gluonhq.chat.GluonChat.<clinit>(GluonChat.java:40)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:375)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:295)
Caused by: java.lang.NullPointerException
	at com.gluonhq.emoji.EmojiData.<clinit>(EmojiData.java:37)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.invokeClassInitializer(ClassInitializationInfo.java:375)
	at com.oracle.svm.core.classinitialization.ClassInitializationInfo.initialize(ClassInitializationInfo.java:295)
	... 3 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.