[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: maven\n    directory: '/'\n    schedule:\n      interval: 'weekly'\n"
  },
  {
    "path": ".gitignore",
    "content": "HELP.md\ntarget/\n!.mvn/wrapper/maven-wrapper.jar\n!**/src/main/**/target/\n!**/src/test/**/target/\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n.sts4-cache\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\n/nbproject/private/\n/nbbuild/\n/dist/\n/nbdist/\n/.nb-gradle/\nbuild/\n!**/src/main/**/build/\n!**/src/test/**/build/\n\n### VS Code ###\n.vscode/\n"
  },
  {
    "path": ".mvn/wrapper/maven-wrapper.properties",
    "content": "distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip\nwrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar\n"
  },
  {
    "path": "README.md",
    "content": "# Spring Boot Web Socket Chat\n\nSpring Boot Web Socket Chat using Java, Javascript and CSS.\n"
  },
  {
    "path": "mvnw",
    "content": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE file\n# distributed with this work for additional information\n# regarding copyright ownership.  The ASF licenses this file\n# to you under the Apache License, Version 2.0 (the\n# \"License\"); you may not use this file except in compliance\n# with the License.  You may obtain a copy of the License at\n#\n#    https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied.  See the License for the\n# specific language governing permissions and limitations\n# under the License.\n# ----------------------------------------------------------------------------\n\n# ----------------------------------------------------------------------------\n# Apache Maven Wrapper startup batch script, version 3.2.0\n#\n# Required ENV vars:\n# ------------------\n#   JAVA_HOME - location of a JDK home dir\n#\n# Optional ENV vars\n# -----------------\n#   MAVEN_OPTS - parameters passed to the Java VM when running Maven\n#     e.g. to debug Maven itself, use\n#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n# ----------------------------------------------------------------------------\n\nif [ -z \"$MAVEN_SKIP_RC\" ] ; then\n\n  if [ -f /usr/local/etc/mavenrc ] ; then\n    . /usr/local/etc/mavenrc\n  fi\n\n  if [ -f /etc/mavenrc ] ; then\n    . /etc/mavenrc\n  fi\n\n  if [ -f \"$HOME/.mavenrc\" ] ; then\n    . \"$HOME/.mavenrc\"\n  fi\n\nfi\n\n# OS specific support.  $var _must_ be set to either true or false.\ncygwin=false;\ndarwin=false;\nmingw=false\ncase \"$(uname)\" in\n  CYGWIN*) cygwin=true ;;\n  MINGW*) mingw=true;;\n  Darwin*) darwin=true\n    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home\n    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html\n    if [ -z \"$JAVA_HOME\" ]; then\n      if [ -x \"/usr/libexec/java_home\" ]; then\n        JAVA_HOME=\"$(/usr/libexec/java_home)\"; export JAVA_HOME\n      else\n        JAVA_HOME=\"/Library/Java/Home\"; export JAVA_HOME\n      fi\n    fi\n    ;;\nesac\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  if [ -r /etc/gentoo-release ] ; then\n    JAVA_HOME=$(java-config --jre-home)\n  fi\nfi\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched\nif $cygwin ; then\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=$(cygpath --unix \"$JAVA_HOME\")\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=$(cygpath --path --unix \"$CLASSPATH\")\nfi\n\n# For Mingw, ensure paths are in UNIX format before anything is touched\nif $mingw ; then\n  [ -n \"$JAVA_HOME\" ] && [ -d \"$JAVA_HOME\" ] &&\n    JAVA_HOME=\"$(cd \"$JAVA_HOME\" || (echo \"cannot cd into $JAVA_HOME.\"; exit 1); pwd)\"\nfi\n\nif [ -z \"$JAVA_HOME\" ]; then\n  javaExecutable=\"$(which javac)\"\n  if [ -n \"$javaExecutable\" ] && ! [ \"$(expr \"\\\"$javaExecutable\\\"\" : '\\([^ ]*\\)')\" = \"no\" ]; then\n    # readlink(1) is not available as standard on Solaris 10.\n    readLink=$(which readlink)\n    if [ ! \"$(expr \"$readLink\" : '\\([^ ]*\\)')\" = \"no\" ]; then\n      if $darwin ; then\n        javaHome=\"$(dirname \"\\\"$javaExecutable\\\"\")\"\n        javaExecutable=\"$(cd \"\\\"$javaHome\\\"\" && pwd -P)/javac\"\n      else\n        javaExecutable=\"$(readlink -f \"\\\"$javaExecutable\\\"\")\"\n      fi\n      javaHome=\"$(dirname \"\\\"$javaExecutable\\\"\")\"\n      javaHome=$(expr \"$javaHome\" : '\\(.*\\)/bin')\n      JAVA_HOME=\"$javaHome\"\n      export JAVA_HOME\n    fi\n  fi\nfi\n\nif [ -z \"$JAVACMD\" ] ; then\n  if [ -n \"$JAVA_HOME\"  ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n      # IBM's JDK on AIX uses strange locations for the executables\n      JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n      JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n  else\n    JAVACMD=\"$(\\unset -f command 2>/dev/null; \\command -v java)\"\n  fi\nfi\n\nif [ ! -x \"$JAVACMD\" ] ; then\n  echo \"Error: JAVA_HOME is not defined correctly.\" >&2\n  echo \"  We cannot execute $JAVACMD\" >&2\n  exit 1\nfi\n\nif [ -z \"$JAVA_HOME\" ] ; then\n  echo \"Warning: JAVA_HOME environment variable is not set.\"\nfi\n\n# traverses directory structure from process work directory to filesystem root\n# first directory with .mvn subdirectory is considered project base directory\nfind_maven_basedir() {\n  if [ -z \"$1\" ]\n  then\n    echo \"Path not specified to find_maven_basedir\"\n    return 1\n  fi\n\n  basedir=\"$1\"\n  wdir=\"$1\"\n  while [ \"$wdir\" != '/' ] ; do\n    if [ -d \"$wdir\"/.mvn ] ; then\n      basedir=$wdir\n      break\n    fi\n    # workaround for JBEAP-8937 (on Solaris 10/Sparc)\n    if [ -d \"${wdir}\" ]; then\n      wdir=$(cd \"$wdir/..\" || exit 1; pwd)\n    fi\n    # end of workaround\n  done\n  printf '%s' \"$(cd \"$basedir\" || exit 1; pwd)\"\n}\n\n# concatenates all lines of a file\nconcat_lines() {\n  if [ -f \"$1\" ]; then\n    # Remove \\r in case we run on Windows within Git Bash\n    # and check out the repository with auto CRLF management\n    # enabled. Otherwise, we may read lines that are delimited with\n    # \\r\\n and produce $'-Xarg\\r' rather than -Xarg due to word\n    # splitting rules.\n    tr -s '\\r\\n' ' ' < \"$1\"\n  fi\n}\n\nlog() {\n  if [ \"$MVNW_VERBOSE\" = true ]; then\n    printf '%s\\n' \"$1\"\n  fi\n}\n\nBASE_DIR=$(find_maven_basedir \"$(dirname \"$0\")\")\nif [ -z \"$BASE_DIR\" ]; then\n  exit 1;\nfi\n\nMAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-\"$BASE_DIR\"}; export MAVEN_PROJECTBASEDIR\nlog \"$MAVEN_PROJECTBASEDIR\"\n\n##########################################################################################\n# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central\n# This allows using the maven wrapper in projects that prohibit checking in binary data.\n##########################################################################################\nwrapperJarPath=\"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar\"\nif [ -r \"$wrapperJarPath\" ]; then\n    log \"Found $wrapperJarPath\"\nelse\n    log \"Couldn't find $wrapperJarPath, downloading it ...\"\n\n    if [ -n \"$MVNW_REPOURL\" ]; then\n      wrapperUrl=\"$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar\"\n    else\n      wrapperUrl=\"https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar\"\n    fi\n    while IFS=\"=\" read -r key value; do\n      # Remove '\\r' from value to allow usage on windows as IFS does not consider '\\r' as a separator ( considers space, tab, new line ('\\n'), and custom '=' )\n      safeValue=$(echo \"$value\" | tr -d '\\r')\n      case \"$key\" in (wrapperUrl) wrapperUrl=\"$safeValue\"; break ;;\n      esac\n    done < \"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties\"\n    log \"Downloading from: $wrapperUrl\"\n\n    if $cygwin; then\n      wrapperJarPath=$(cygpath --path --windows \"$wrapperJarPath\")\n    fi\n\n    if command -v wget > /dev/null; then\n        log \"Found wget ... using wget\"\n        [ \"$MVNW_VERBOSE\" = true ] && QUIET=\"\" || QUIET=\"--quiet\"\n        if [ -z \"$MVNW_USERNAME\" ] || [ -z \"$MVNW_PASSWORD\" ]; then\n            wget $QUIET \"$wrapperUrl\" -O \"$wrapperJarPath\" || rm -f \"$wrapperJarPath\"\n        else\n            wget $QUIET --http-user=\"$MVNW_USERNAME\" --http-password=\"$MVNW_PASSWORD\" \"$wrapperUrl\" -O \"$wrapperJarPath\" || rm -f \"$wrapperJarPath\"\n        fi\n    elif command -v curl > /dev/null; then\n        log \"Found curl ... using curl\"\n        [ \"$MVNW_VERBOSE\" = true ] && QUIET=\"\" || QUIET=\"--silent\"\n        if [ -z \"$MVNW_USERNAME\" ] || [ -z \"$MVNW_PASSWORD\" ]; then\n            curl $QUIET -o \"$wrapperJarPath\" \"$wrapperUrl\" -f -L || rm -f \"$wrapperJarPath\"\n        else\n            curl $QUIET --user \"$MVNW_USERNAME:$MVNW_PASSWORD\" -o \"$wrapperJarPath\" \"$wrapperUrl\" -f -L || rm -f \"$wrapperJarPath\"\n        fi\n    else\n        log \"Falling back to using Java to download\"\n        javaSource=\"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java\"\n        javaClass=\"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class\"\n        # For Cygwin, switch paths to Windows format before running javac\n        if $cygwin; then\n          javaSource=$(cygpath --path --windows \"$javaSource\")\n          javaClass=$(cygpath --path --windows \"$javaClass\")\n        fi\n        if [ -e \"$javaSource\" ]; then\n            if [ ! -e \"$javaClass\" ]; then\n                log \" - Compiling MavenWrapperDownloader.java ...\"\n                (\"$JAVA_HOME/bin/javac\" \"$javaSource\")\n            fi\n            if [ -e \"$javaClass\" ]; then\n                log \" - Running MavenWrapperDownloader.java ...\"\n                (\"$JAVA_HOME/bin/java\" -cp .mvn/wrapper MavenWrapperDownloader \"$wrapperUrl\" \"$wrapperJarPath\") || rm -f \"$wrapperJarPath\"\n            fi\n        fi\n    fi\nfi\n##########################################################################################\n# End of extension\n##########################################################################################\n\n# If specified, validate the SHA-256 sum of the Maven wrapper jar file\nwrapperSha256Sum=\"\"\nwhile IFS=\"=\" read -r key value; do\n  case \"$key\" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;\n  esac\ndone < \"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties\"\nif [ -n \"$wrapperSha256Sum\" ]; then\n  wrapperSha256Result=false\n  if command -v sha256sum > /dev/null; then\n    if echo \"$wrapperSha256Sum  $wrapperJarPath\" | sha256sum -c > /dev/null 2>&1; then\n      wrapperSha256Result=true\n    fi\n  elif command -v shasum > /dev/null; then\n    if echo \"$wrapperSha256Sum  $wrapperJarPath\" | shasum -a 256 -c > /dev/null 2>&1; then\n      wrapperSha256Result=true\n    fi\n  else\n    echo \"Checksum validation was requested but neither 'sha256sum' or 'shasum' are available.\"\n    echo \"Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties.\"\n    exit 1\n  fi\n  if [ $wrapperSha256Result = false ]; then\n    echo \"Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.\" >&2\n    echo \"Investigate or delete $wrapperJarPath to attempt a clean download.\" >&2\n    echo \"If you updated your Maven version, you need to update the specified wrapperSha256Sum property.\" >&2\n    exit 1\n  fi\nfi\n\nMAVEN_OPTS=\"$(concat_lines \"$MAVEN_PROJECTBASEDIR/.mvn/jvm.config\") $MAVEN_OPTS\"\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin; then\n  [ -n \"$JAVA_HOME\" ] &&\n    JAVA_HOME=$(cygpath --path --windows \"$JAVA_HOME\")\n  [ -n \"$CLASSPATH\" ] &&\n    CLASSPATH=$(cygpath --path --windows \"$CLASSPATH\")\n  [ -n \"$MAVEN_PROJECTBASEDIR\" ] &&\n    MAVEN_PROJECTBASEDIR=$(cygpath --path --windows \"$MAVEN_PROJECTBASEDIR\")\nfi\n\n# Provide a \"standardized\" way to retrieve the CLI args that will\n# work with both Windows and non-Windows executions.\nMAVEN_CMD_LINE_ARGS=\"$MAVEN_CONFIG $*\"\nexport MAVEN_CMD_LINE_ARGS\n\nWRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\n# shellcheck disable=SC2086 # safe args\nexec \"$JAVACMD\" \\\n  $MAVEN_OPTS \\\n  $MAVEN_DEBUG_OPTS \\\n  -classpath \"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar\" \\\n  \"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}\" \\\n  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG \"$@\"\n"
  },
  {
    "path": "mvnw.cmd",
    "content": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software Foundation (ASF) under one\n@REM or more contributor license agreements.  See the NOTICE file\n@REM distributed with this work for additional information\n@REM regarding copyright ownership.  The ASF licenses this file\n@REM to you under the Apache License, Version 2.0 (the\n@REM \"License\"); you may not use this file except in compliance\n@REM with the License.  You may obtain a copy of the License at\n@REM\n@REM    https://www.apache.org/licenses/LICENSE-2.0\n@REM\n@REM Unless required by applicable law or agreed to in writing,\n@REM software distributed under the License is distributed on an\n@REM \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n@REM KIND, either express or implied.  See the License for the\n@REM specific language governing permissions and limitations\n@REM under the License.\n@REM ----------------------------------------------------------------------------\n\n@REM ----------------------------------------------------------------------------\n@REM Apache Maven Wrapper startup batch script, version 3.2.0\n@REM\n@REM Required ENV vars:\n@REM JAVA_HOME - location of a JDK home dir\n@REM\n@REM Optional ENV vars\n@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands\n@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending\n@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven\n@REM     e.g. to debug Maven itself, use\n@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\n@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files\n@REM ----------------------------------------------------------------------------\n\n@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'\n@echo off\n@REM set title of command window\ntitle %0\n@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'\n@if \"%MAVEN_BATCH_ECHO%\" == \"on\"  echo %MAVEN_BATCH_ECHO%\n\n@REM set %HOME% to equivalent of $HOME\nif \"%HOME%\" == \"\" (set \"HOME=%HOMEDRIVE%%HOMEPATH%\")\n\n@REM Execute a user defined script before this one\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPre\n@REM check for pre script, once with legacy .bat ending and once with .cmd ending\nif exist \"%USERPROFILE%\\mavenrc_pre.bat\" call \"%USERPROFILE%\\mavenrc_pre.bat\" %*\nif exist \"%USERPROFILE%\\mavenrc_pre.cmd\" call \"%USERPROFILE%\\mavenrc_pre.cmd\" %*\n:skipRcPre\n\n@setlocal\n\nset ERROR_CODE=0\n\n@REM To isolate internal variables from possible post scripts, we use another setlocal\n@setlocal\n\n@REM ==== START VALIDATION ====\nif not \"%JAVA_HOME%\" == \"\" goto OkJHome\n\necho.\necho Error: JAVA_HOME not found in your environment. >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n:OkJHome\nif exist \"%JAVA_HOME%\\bin\\java.exe\" goto init\n\necho.\necho Error: JAVA_HOME is set to an invalid directory. >&2\necho JAVA_HOME = \"%JAVA_HOME%\" >&2\necho Please set the JAVA_HOME variable in your environment to match the >&2\necho location of your Java installation. >&2\necho.\ngoto error\n\n@REM ==== END VALIDATION ====\n\n:init\n\n@REM Find the project base dir, i.e. the directory that contains the folder \".mvn\".\n@REM Fallback to current working directory if not found.\n\nset MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%\nIF NOT \"%MAVEN_PROJECTBASEDIR%\"==\"\" goto endDetectBaseDir\n\nset EXEC_DIR=%CD%\nset WDIR=%EXEC_DIR%\n:findBaseDir\nIF EXIST \"%WDIR%\"\\.mvn goto baseDirFound\ncd ..\nIF \"%WDIR%\"==\"%CD%\" goto baseDirNotFound\nset WDIR=%CD%\ngoto findBaseDir\n\n:baseDirFound\nset MAVEN_PROJECTBASEDIR=%WDIR%\ncd \"%EXEC_DIR%\"\ngoto endDetectBaseDir\n\n:baseDirNotFound\nset MAVEN_PROJECTBASEDIR=%EXEC_DIR%\ncd \"%EXEC_DIR%\"\n\n:endDetectBaseDir\n\nIF NOT EXIST \"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\" goto endReadAdditionalConfig\n\n@setlocal EnableExtensions EnableDelayedExpansion\nfor /F \"usebackq delims=\" %%a in (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a\n@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%\n\n:endReadAdditionalConfig\n\nSET MAVEN_JAVA_EXE=\"%JAVA_HOME%\\bin\\java.exe\"\nset WRAPPER_JAR=\"%MAVEN_PROJECTBASEDIR%\\.mvn\\wrapper\\maven-wrapper.jar\"\nset WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\n\nset WRAPPER_URL=\"https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar\"\n\nFOR /F \"usebackq tokens=1,2 delims==\" %%A IN (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\wrapper\\maven-wrapper.properties\") DO (\n    IF \"%%A\"==\"wrapperUrl\" SET WRAPPER_URL=%%B\n)\n\n@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central\n@REM This allows using the maven wrapper in projects that prohibit checking in binary data.\nif exist %WRAPPER_JAR% (\n    if \"%MVNW_VERBOSE%\" == \"true\" (\n        echo Found %WRAPPER_JAR%\n    )\n) else (\n    if not \"%MVNW_REPOURL%\" == \"\" (\n        SET WRAPPER_URL=\"%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar\"\n    )\n    if \"%MVNW_VERBOSE%\" == \"true\" (\n        echo Couldn't find %WRAPPER_JAR%, downloading it ...\n        echo Downloading from: %WRAPPER_URL%\n    )\n\n    powershell -Command \"&{\"^\n\t\t\"$webclient = new-object System.Net.WebClient;\"^\n\t\t\"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {\"^\n\t\t\"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');\"^\n\t\t\"}\"^\n\t\t\"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')\"^\n\t\t\"}\"\n    if \"%MVNW_VERBOSE%\" == \"true\" (\n        echo Finished downloading %WRAPPER_JAR%\n    )\n)\n@REM End of extension\n\n@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file\nSET WRAPPER_SHA_256_SUM=\"\"\nFOR /F \"usebackq tokens=1,2 delims==\" %%A IN (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\wrapper\\maven-wrapper.properties\") DO (\n    IF \"%%A\"==\"wrapperSha256Sum\" SET WRAPPER_SHA_256_SUM=%%B\n)\nIF NOT %WRAPPER_SHA_256_SUM%==\"\" (\n    powershell -Command \"&{\"^\n       \"$hash = (Get-FileHash \\\"%WRAPPER_JAR%\\\" -Algorithm SHA256).Hash.ToLower();\"^\n       \"If('%WRAPPER_SHA_256_SUM%' -ne $hash){\"^\n       \"  Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';\"^\n       \"  Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';\"^\n       \"  Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';\"^\n       \"  exit 1;\"^\n       \"}\"^\n       \"}\"\n    if ERRORLEVEL 1 goto error\n)\n\n@REM Provide a \"standardized\" way to retrieve the CLI args that will\n@REM work with both Windows and non-Windows executions.\nset MAVEN_CMD_LINE_ARGS=%*\n\n%MAVEN_JAVA_EXE% ^\n  %JVM_CONFIG_MAVEN_PROPS% ^\n  %MAVEN_OPTS% ^\n  %MAVEN_DEBUG_OPTS% ^\n  -classpath %WRAPPER_JAR% ^\n  \"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%\" ^\n  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*\nif ERRORLEVEL 1 goto error\ngoto end\n\n:error\nset ERROR_CODE=1\n\n:end\n@endlocal & set ERROR_CODE=%ERROR_CODE%\n\nif not \"%MAVEN_SKIP_RC%\"==\"\" goto skipRcPost\n@REM check for post script, once with legacy .bat ending and once with .cmd ending\nif exist \"%USERPROFILE%\\mavenrc_post.bat\" call \"%USERPROFILE%\\mavenrc_post.bat\"\nif exist \"%USERPROFILE%\\mavenrc_post.cmd\" call \"%USERPROFILE%\\mavenrc_post.cmd\"\n:skipRcPost\n\n@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'\nif \"%MAVEN_BATCH_PAUSE%\"==\"on\" pause\n\nif \"%MAVEN_TERMINATE_CMD%\"==\"on\" exit %ERROR_CODE%\n\ncmd /C exit /B %ERROR_CODE%\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.1.2</version>\n\t\t<relativePath /> <!-- lookup parent from repository -->\n\t</parent>\n\t<groupId>com.api</groupId>\n\t<artifactId>spring-boot-websocket</artifactId>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<name>spring-boot-websocket</name>\n\t<description>Chat application using Spring Boot and web socket</description>\n\t<properties>\n\t\t<java.version>17</java.version>\n\t</properties>\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-websocket</artifactId>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-reactor-netty</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n</project>\n"
  },
  {
    "path": "src/main/java/com/bernardo/spring/ws/api/SpringBootWebsocketApplication.java",
    "content": "package com.bernardo.spring.ws.api;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class SpringBootWebsocketApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SpringBootWebsocketApplication.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/com/bernardo/spring/ws/api/config/WsConfig.java",
    "content": "package com.bernardo.spring.ws.api.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.messaging.simp.config.MessageBrokerRegistry;\nimport org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;\nimport org.springframework.web.socket.config.annotation.StompEndpointRegistry;\nimport org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;\n\n@Configuration\n@EnableWebSocketMessageBroker\npublic class WsConfig implements WebSocketMessageBrokerConfigurer{\n\t\n\t@Override\n\tpublic void registerStompEndpoints(StompEndpointRegistry registry) {\n\t\tregistry.addEndpoint(\"/bernardo\").withSockJS();\n\t}\n\t\n\t@Override\n\tpublic void configureMessageBroker(MessageBrokerRegistry registry) {\n\t\tregistry.enableSimpleBroker(\"/topic\");\n\t\tregistry.setApplicationDestinationPrefixes(\"/app\");\n\t}\n}"
  },
  {
    "path": "src/main/java/com/bernardo/spring/ws/api/controller/ChatController.java",
    "content": "package com.bernardo.spring.ws.api.controller;\n\nimport org.springframework.messaging.handler.annotation.MessageMapping;\nimport org.springframework.messaging.handler.annotation.Payload;\nimport org.springframework.messaging.handler.annotation.SendTo;\nimport org.springframework.messaging.simp.SimpMessageHeaderAccessor;\nimport org.springframework.stereotype.Controller;\n\nimport com.bernardo.spring.ws.api.model.ChatMessage;\n\n@Controller\npublic class ChatController {\n\n\t@MessageMapping(\"/chat.register\")\n\t@SendTo(\"/topic/public\")\n\tpublic ChatMessage register(@Payload ChatMessage chatMessage, SimpMessageHeaderAccessor headerAccessor) {\n\t\theaderAccessor.getSessionAttributes().put(\"username\", chatMessage.getSender());\n\t\treturn chatMessage;\n\t}\n\n\t@MessageMapping(\"/chat.send\")\n\t@SendTo(\"/topic/public\")\n\tpublic ChatMessage sendMessage(@Payload ChatMessage chatMessage) {\n\t\treturn chatMessage;\n\t}\n\n}"
  },
  {
    "path": "src/main/java/com/bernardo/spring/ws/api/model/ChatMessage.java",
    "content": "package com.bernardo.spring.ws.api.model;\n\npublic class ChatMessage {\n\t\n\tprivate String content;\n\tprivate String sender;\n\tprivate MessageType type;\n\t\n\tpublic enum MessageType{\n\t\tCHAT,LEAVE,JOIN\n\t}\n\n\tpublic String getContent() {\n\t\treturn content;\n\t}\n\n\tpublic void setContent(String content) {\n\t\tthis.content = content;\n\t}\n\n\tpublic String getSender() {\n\t\treturn sender;\n\t}\n\n\tpublic void setSender(String sender) {\n\t\tthis.sender = sender;\n\t}\n\n\tpublic MessageType getType() {\n\t\treturn type;\n\t}\n\n\tpublic void setType(MessageType type) {\n\t\tthis.type = type;\n\t}\n\n\tpublic Object getSender1() {\n\t\t// TODO Auto-generated method stub\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "src/main/resources/application.properties",
    "content": "\n"
  },
  {
    "path": "src/main/resources/static/css/main.css",
    "content": "* {\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n}\n\nhtml,body {\n    height: 100%;\n    overflow: hidden;\n}\n\nbody {\n    margin: 0;\n    padding: 0;\n    font-weight: 400;\n    font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    font-size: 1rem;\n    line-height: 1.58;\n    color: #333;\n   /*  background-color: #f4f4f4; */\n    height: 100%;\n\n\n\n  /* Center and scale the image nicely */\n  background-position: center;\n  background-repeat: no-repeat;\n  background-size: cover;\n}\n\nbody:before {\n    height: 50%;\n    width: 100%;\n    position: absolute;\n    top: 0;\n    left: 0;\n    background-image: url(\"wallpaper.jpg\");\n    content: \"\";\n    z-index: 0;\n}\n\n.clearfix:after {\n    display: block;\n    content: \"\";\n    clear: both;\n}\n\n.hidden {\n    display: none;\n}\n\n.form-control {\n    width: 100%;\n    min-height: 38px;\n    font-size: 15px;\n    border: 1px solid #c8c8c8;\n}\n\n.form-group {\n    margin-bottom: 15px;\n}\n\ninput {\n    padding-left: 10px;\n    outline: none;\n}\n\nh1, h2, h3, h4, h5, h6 {\n    margin-top: 20px;\n    margin-bottom: 20px;\n}\n\nh1 {\n    font-size: 1.7em;\n}\n\na {\n    color: #128ff2;\n}\n\nbutton {\n    box-shadow: none;\n    border: 1px solid transparent;\n    font-size: 14px;\n    outline: none;\n    line-height: 100%;\n    white-space: nowrap;\n    vertical-align: middle;\n    padding: 0.6rem 1rem;\n    border-radius: 2px;\n    transition: all 0.2s ease-in-out;\n    cursor: pointer;\n    min-height: 38px;\n}\n\nbutton.default {\n    background-color: #e8e8e8;\n    color: #333;\n    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12);\n}\n\nbutton.primary {\n    background-color: #25be38;\n    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12);\n    color: #fff;\n}\n\nbutton.accent {\n    background-color: #1778dd;\n    box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.12);\n    color: #fff;\n}\n\n#username-page {\n    text-align: center;\n}\n\n.username-page-container {\n    background: #fff;\n    box-shadow: 0 1px 11px rgba(0, 0, 0, 0.27);\n    border-radius: 2px;\n    width: 100%;\n    max-width: 500px;\n    display: inline-block;\n    margin-top: 42px;\n    vertical-align: middle;\n    position: relative;\n    padding: 35px 55px 35px;\n    min-height: 250px;\n    position: absolute;\n    top: 50%;\n    left: 0;\n    right: 0;\n    margin: 0 auto;\n    margin-top: -160px;\n}\n\n.username-page-container .username-submit {\n    margin-top: 10px;\n}\n\n\n#chat-page {\n    position: relative;\n    height: 100%;\n}\n\n.chat-container {\n    max-width: 700px;\n    margin-left: auto;\n    margin-right: auto;\n    background-color: #fff;\n    box-shadow: 0 1px 11px rgba(0, 0, 0, 0.27);\n    margin-top: 30px;\n    height: calc(100% - 60px);\n    max-height: 600px;\n    position: relative;\n}\n\n#chat-page ul {\n    list-style-type: none;\n    background-color: #FFF;\n    margin: 0;\n    overflow: auto;\n    overflow-y: scroll;\n    padding: 0 20px 0px 20px;\n    height: calc(100% - 150px);\n}\n\n#chat-page #messageForm {\n    padding: 20px;\n}\n\n#chat-page ul li {\n    line-height: 1.5rem;\n    padding: 10px 20px;\n    margin: 0;\n    border-bottom: 1px solid #f4f4f4;\n}\n\n#chat-page ul li p {\n    margin: 0;\n}\n\n#chat-page .event-message {\n    width: 100%;\n    text-align: center;\n    clear: both;\n}\n\n#chat-page .event-message p {\n    color: #777;\n    font-size: 14px;\n    word-wrap: break-word;\n}\n\n#chat-page .chat-message {\n    padding-left: 68px;\n    position: relative;\n}\n\n#chat-page .chat-message i {\n    position: absolute;\n    width: 42px;\n    height: 42px;\n    overflow: hidden;\n    left: 10px;\n    display: inline-block;\n    vertical-align: middle;\n    font-size: 18px;\n    line-height: 42px;\n    color: #fff;\n    text-align: center;\n    border-radius: 50%;\n    font-style: normal;\n    text-transform: uppercase;\n}\n\n#chat-page .chat-message span {\n    color: #333;\n    font-weight: 600;\n}\n\n#chat-page .chat-message p {\n    color: #43464b;\n}\n\n#messageForm .input-group input {\n    float: left;\n    width: calc(100% - 85px);\n}\n\n#messageForm .input-group button {\n    float: left;\n    width: 80px;\n    height: 38px;\n    margin-left: 5px;\n}\n\n.chat-header {\n    text-align: center;\n    padding: 15px;\n    border-bottom: 1px solid #ececec;\n}\n\n.chat-header h2 {\n    margin: 0;\n    font-weight: 500;\n}\n\n.connecting {\n    padding-top: 5px;\n    text-align: center;\n    color: #777;\n    position: absolute;\n    top: 65px;\n    width: 100%;\n}\n\n\n@media screen and (max-width: 730px) {\n\n    .chat-container {\n        margin-left: 10px;\n        margin-right: 10px;\n        margin-top: 10px;\n    }\n}\n\n@media screen and (max-width: 480px) {\n    .chat-container {\n        height: calc(100% - 30px);\n    }\n\n    .username-page-container {\n        width: auto;\n        margin-left: 15px;\n        margin-right: 15px;\n        padding: 25px;\n    }\n\n    #chat-page ul {\n        height: calc(100% - 120px);\n    }\n\n    #messageForm .input-group button {\n        width: 65px;\n    }\n\n    #messageForm .input-group input {\n        width: calc(100% - 70px);\n    }\n\n    .chat-header {\n        padding: 10px;\n    }\n\n    .connecting {\n        top: 60px;\n    }\n\n    .chat-header h2 {\n        font-size: 1.1em;\n    }\n}"
  },
  {
    "path": "src/main/resources/static/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta name=\"viewport\"\n\tcontent=\"width=device-width, initial-scale=1.0, minimum-scale=1.0\">\n<title>Spring Boot WebSocket</title>\n<link rel=\"stylesheet\" href=\"/css/main.css\" />\n</head>\n<body background=\"wallpaper.jpg\"\n\tstyle=\"background-position: center; background-repeat: no-repeat; background-size: cover;\">\n\t<noscript>\n\t\t<h2>Seu navegador não suporta JavaScript!</h2>\n\t</noscript>\n\n\t<div id=\"username-page\">\n\t\t<div class=\"username-page-container\">\n\t\t\t<h1 class=\"title\">Escreve o seu nome</h1>\n\t\t\t<form id=\"usernameForm\" name=\"usernameForm\">\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<input type=\"text\" id=\"name\" placeholder=\"Nome\"\n\t\t\t\t\t\tautocomplete=\"off\" class=\"form-control\" />\n\t\t\t\t</div>\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<button type=\"submit\" class=\"accent username-submit\">Entrar no Chat</button>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n\n\t<div id=\"chat-page\" class=\"hidden\">\n\t\t<div class=\"chat-container\">\n\t\t\t<div class=\"chat-header\">\n\t\t\t\t<h2>Chat</h2>\n\t\t\t</div>\n\t\t\t<div class=\"connecting\">Entrando...</div>\n\t\t\t<ul id=\"messageArea\">\n\n\t\t\t</ul>\n\t\t\t<form id=\"messageForm\" name=\"messageForm\" nameForm=\"messageForm\">\n\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t<div class=\"input-group clearfix\">\n\t\t\t\t\t\t<input type=\"text\" id=\"message\" placeholder=\"Escreva uma mensagem...\"\n\t\t\t\t\t\t\tautocomplete=\"off\" class=\"form-control\" />\n\t\t\t\t\t\t<button type=\"submit\" class=\"primary\">Enviar</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n\n\t<script\n\t\tsrc=\"https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.1.4/sockjs.min.js\"></script>\n\t<script\n\t\tsrc=\"https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js\"></script>\n\t<script src=\"/js/main.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/static/js/main.js",
    "content": "'use strict';\n\nvar usernamePage = document.querySelector('#username-page');\nvar chatPage = document.querySelector('#chat-page');\nvar usernameForm = document.querySelector('#usernameForm');\nvar messageForm = document.querySelector('#messageForm');\nvar messageInput = document.querySelector('#message');\nvar messageArea = document.querySelector('#messageArea');\nvar connectingElement = document.querySelector('.connecting');\n\nvar stompClient = null;\nvar username = null;\n\nvar colors = [\n    '#2196F3', '#32c787', '#00BCD4', '#ff5652',\n    '#ffc107', '#ff85af', '#FF9800', '#39bbb0'\n];\n\nfunction connect(event) {\n    username = document.querySelector('#name').value.trim();\n\n    if(username) {\n        usernamePage.classList.add('hidden');\n        chatPage.classList.remove('hidden');\n\n        var socket = new SockJS('/bernardo');\n        stompClient = Stomp.over(socket);\n\n        stompClient.connect({}, onConnected, onError);\n    }\n    event.preventDefault();\n}\n\n\nfunction onConnected() {\n    stompClient.subscribe('/topic/public', onMessageReceived);\n\n    stompClient.send(\"/app/chat.register\",\n        {},\n        JSON.stringify({sender: username, type: 'JOIN'})\n    )\n\n    connectingElement.classList.add('hidden');\n}\n\n\nfunction onError(error) {\n    connectingElement.textContent = 'Could not connect to WebSocket server. Please refresh this page to try again!';\n    connectingElement.style.color = 'red';\n}\n\n\nfunction send(event) {\n    var messageContent = messageInput.value.trim();\n\n    if(messageContent && stompClient) {\n        var chatMessage = {\n            sender: username,\n            content: messageInput.value,\n            type: 'CHAT'\n        };\n\n        stompClient.send(\"/app/chat.send\", {}, JSON.stringify(chatMessage));\n        messageInput.value = '';\n    }\n    event.preventDefault();\n}\n\n\nfunction onMessageReceived(payload) {\n    var message = JSON.parse(payload.body);\n\n    var messageElement = document.createElement('li');\n\n    if(message.type === 'JOIN') {\n        messageElement.classList.add('event-message');\n        message.content = message.sender + ' entrou!';\n    } else if (message.type === 'LEAVE') {\n        messageElement.classList.add('event-message');\n        message.content = message.sender + ' saiu!';\n    } else {\n        messageElement.classList.add('chat-message');\n\n        var avatarElement = document.createElement('i');\n        var avatarText = document.createTextNode(message.sender[0]);\n        avatarElement.appendChild(avatarText);\n        avatarElement.style['background-color'] = getAvatarColor(message.sender);\n\n        messageElement.appendChild(avatarElement);\n\n        var usernameElement = document.createElement('span');\n        var usernameText = document.createTextNode(message.sender);\n        usernameElement.appendChild(usernameText);\n        messageElement.appendChild(usernameElement);\n    }\n\n    var textElement = document.createElement('p');\n    var messageText = document.createTextNode(message.content);\n    textElement.appendChild(messageText);\n\n    messageElement.appendChild(textElement);\n\n    messageArea.appendChild(messageElement);\n    messageArea.scrollTop = messageArea.scrollHeight;\n}\n\n\nfunction getAvatarColor(messageSender) {\n    var hash = 0;\n    for (var i = 0; i < messageSender.length; i++) {\n        hash = 31 * hash + messageSender.charCodeAt(i);\n    }\n\n    var index = Math.abs(hash % colors.length);\n    return colors[index];\n}\n\nusernameForm.addEventListener('submit', connect, true)\nmessageForm.addEventListener('submit', send, true)\n"
  },
  {
    "path": "src/test/java/com/bernardo/spring/ws/api/SpringBootWebsocketApplicationTests.java",
    "content": "package com.bernardo.spring.ws.api;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.boot.test.context.SpringBootTest;\n\n@SpringBootTest\nclass SpringBootWebsocketApplicationTests {\n\n\t@Test\n\tvoid contextLoads() {\n\t}\n\n}\n"
  }
]