diff --git a/.gitignore b/.gitignore
index 999bc0fbfb..b83d22266a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,88 +1 @@
-# Binaries
-*.7z
-*.dmg
-*.gz
-*.iso
-*.jar
-*.rar
-*.tar
-*.zip
-*.war
-*.ear
-*.sar
-*.class
-
-# Maven
-target/
-
-# eclipse project file
-.settings/
-.classpath
-.project
-
-
-# IntelliJ project files
-*.iml
-*.iws
-*.ipr
-.idea/
-
-
-
-# NetBeans specific
-nbproject/private/
-build/
-nbbuild/
-dist/
-nbdist/
-nbactions.xml
-nb-configuration.xml
-
-# Windows image file caches
-Thumbs.db
-ehthumbs.db
-
-# Folder config file
-Desktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Windows Installer files
-*.cab
-*.msi
-*.msm
-*.msp
-
-# Windows shortcuts
-*.lnk
-
-# =========================
-# Operating System Files
-# =========================
-
-# OSX
-# =========================
-
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
+/target/
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000000..c65826db88
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000000..aa00ffab78
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000000..712ab9d985
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml
new file mode 100644
index 0000000000..cdd79598ea
--- /dev/null
+++ b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml
new file mode 100644
index 0000000000..6c2a7607f1
--- /dev/null
+++ b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_7.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__commons_cli_commons_cli_1_2.xml b/.idea/libraries/Maven__commons_cli_commons_cli_1_2.xml
new file mode 100644
index 0000000000..cec24931ef
--- /dev/null
+++ b/.idea/libraries/Maven__commons_cli_commons_cli_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_8_15.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_8_15.xml
new file mode 100644
index 0000000000..c7e234c123
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_8_15.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_8_15.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_8_15.xml
new file mode 100644
index 0000000000..a0c169abac
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_8_15.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_11.xml b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_11.xml
new file mode 100644
index 0000000000..7a30e6e396
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_11.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml
new file mode 100644
index 0000000000..ebfe0a8655
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_maven_surefire_surefire_logger_api_2_21_0.xml b/.idea/libraries/Maven__org_apache_maven_surefire_surefire_logger_api_2_21_0.xml
new file mode 100644
index 0000000000..7ee7fe0883
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_maven_surefire_surefire_logger_api_2_21_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml
new file mode 100644
index 0000000000..f854ab00fd
--- /dev/null
+++ b/.idea/libraries/Maven__org_apiguardian_apiguardian_api_1_1_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_all_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_all_1_3.xml
new file mode 100644
index 0000000000..56193163f3
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_all_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000000..f58bbc1127
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
new file mode 100644
index 0000000000..78dbe458d4
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_7_0.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_7_0.xml
new file mode 100644
index 0000000000..cc01e3f539
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_api_5_7_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_7_0.xml b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_7_0.xml
new file mode 100644
index 0000000000..f198e4bb85
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_jupiter_junit_jupiter_engine_5_7_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_7_0.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_7_0.xml
new file mode 100644
index 0000000000..cde8a482a9
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_platform_junit_platform_commons_1_7_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_7_0.xml b/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_7_0.xml
new file mode 100644
index 0000000000..3391deb2a7
--- /dev/null
+++ b/.idea/libraries/Maven__org_junit_platform_junit_platform_engine_1_7_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mockito_mockito_core_2_21_0.xml b/.idea/libraries/Maven__org_mockito_mockito_core_2_21_0.xml
new file mode 100644
index 0000000000..f3bb7f6b81
--- /dev/null
+++ b/.idea/libraries/Maven__org_mockito_mockito_core_2_21_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml b/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
new file mode 100644
index 0000000000..af41e3b617
--- /dev/null
+++ b/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml
new file mode 100644
index 0000000000..fbc1b1635a
--- /dev/null
+++ b/.idea/libraries/Maven__org_opentest4j_opentest4j_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml b/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
new file mode 100644
index 0000000000..2f93a6301e
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_21.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml
new file mode 100644
index 0000000000..1b644dd840
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_21.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000..17e19eb41d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000..da24bb41a5
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000..94a25f7f4c
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000000..155c4e0c7e
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1618145802441
+
+
+ 1618145802441
+
+
+
+
+
+ 1618147556538
+
+
+
+ 1618147556538
+
+
+ 1618147882644
+
+
+
+ 1618147882644
+
+
+ 1618151038853
+
+
+
+ 1618151038853
+
+
+ 1618157753954
+
+
+
+ 1618157753954
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lang-tutorial.iml b/lang-tutorial.iml
new file mode 100644
index 0000000000..2792130f76
--- /dev/null
+++ b/lang-tutorial.iml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/.gitignore b/toolkits/.gitignore
new file mode 100644
index 0000000000..f35a1af429
--- /dev/null
+++ b/toolkits/.gitignore
@@ -0,0 +1,235 @@
+### Gradle ###
+.gradle
+build/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+# Cache of project
+.gradletasknamecache
+
+# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
+# gradle/wrapper/gradle-wrapper.properties
+
+### Gradle Patch ###
+**/build/
+
+### Intellij ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+.idea/sonarlint
+
+
+### Intellij+iml ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij+iml Patch ###
+# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
+
+*.iml
+modules.xml
+.idea/misc.xml
+*.ipr
+
+### Maven ###
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+.flattened-pom.xml
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij Patch ###
+# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
+
+# *.iml
+# modules.xml
+# .idea/misc.xml
+# *.ipr
+
+# Sonarlint plugin
+.idea/sonarlint
diff --git a/toolkits/.idea/.gitignore b/toolkits/.idea/.gitignore
new file mode 100644
index 0000000000..cf75470660
--- /dev/null
+++ b/toolkits/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/../../../../../../../:\WorkDir\GitHub\cwiki-us-docs\java-tutorials\toolkits\.idea/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/toolkits/.idea/codeStyles/Project.xml b/toolkits/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000000..919ce1f1f7
--- /dev/null
+++ b/toolkits/.idea/codeStyles/Project.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/.idea/codeStyles/codeStyleConfig.xml b/toolkits/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000000..a55e7a179b
--- /dev/null
+++ b/toolkits/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/.idea/compiler.xml b/toolkits/.idea/compiler.xml
new file mode 100644
index 0000000000..3c6a21132c
--- /dev/null
+++ b/toolkits/.idea/compiler.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/.idea/encodings.xml b/toolkits/.idea/encodings.xml
new file mode 100644
index 0000000000..44b56b318b
--- /dev/null
+++ b/toolkits/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/.idea/jarRepositories.xml b/toolkits/.idea/jarRepositories.xml
new file mode 100644
index 0000000000..712ab9d985
--- /dev/null
+++ b/toolkits/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/.idea/vcs.xml b/toolkits/.idea/vcs.xml
new file mode 100644
index 0000000000..6c0b863585
--- /dev/null
+++ b/toolkits/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/discourse/pom.xml b/toolkits/discourse/pom.xml
new file mode 100644
index 0000000000..cdc23f2d83
--- /dev/null
+++ b/toolkits/discourse/pom.xml
@@ -0,0 +1,79 @@
+
+
+ 4.0.0
+ com.ossez
+ discourse
+ 0.1.0-SNAPSHOT
+ discourse
+ jar
+
+
+ com.ossez
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.11
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+
+ com.google.code.gson
+ gson
+ 2.8.6
+
+
+ joda-time
+ joda-time
+ 2.10.10
+
+
+
+ javax.persistence
+ javax.persistence-api
+ 2.2
+
+
+
+
+ discourse
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.6.1
+ 1.8.9
+ 1.19
+ 1.19
+
+ 2.22.1
+
+
+
diff --git a/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/entity/BBSOssezForumAttach.java b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/entity/BBSOssezForumAttach.java
new file mode 100644
index 0000000000..9f478fb32f
--- /dev/null
+++ b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/entity/BBSOssezForumAttach.java
@@ -0,0 +1,55 @@
+package com.ossez.toolkits.discourse.common.model.entity;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+
+@Entity
+@Table(catalog = "ossez_bbs", name = "bbsossez_forum_attach")
+public class BBSOssezForumAttach implements Serializable {
+ private static final long serialVersionUID = 5530454436970805656L;
+
+ private static Logger logger = LoggerFactory.getLogger(BBSOssezForumAttach.class);
+
+
+ @Id
+ @Column(name = "aid")
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id = 0;
+
+ @Column(name = "attachment")
+ private String attachment;
+
+
+
+ /**
+ * Constructor
+ */
+ public BBSOssezForumAttach() {
+
+ }
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+
+ public String getAttachment() {
+ return attachment;
+ }
+
+ public void setAttachment(String attachment) {
+ this.attachment = attachment;
+ }
+}
\ No newline at end of file
diff --git a/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/entity/BBSOssezForumPost.java b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/entity/BBSOssezForumPost.java
new file mode 100644
index 0000000000..153e6136ad
--- /dev/null
+++ b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/entity/BBSOssezForumPost.java
@@ -0,0 +1,87 @@
+package com.ossez.toolkits.discourse.common.model.entity;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+
+@Entity
+@Table(catalog = "ossez_bbs", name = "bbsossez_forum_post")
+public class BBSOssezForumPost implements Serializable {
+ private static final long serialVersionUID = 5530454436970805656L;
+
+ private static Logger logger = LoggerFactory.getLogger(BBSOssezForumPost.class);
+
+
+ @Id
+ @Column(name = "pid")
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id = 0;
+
+ @Column(name = "subject")
+ private String subject;
+
+ @Column(name = "message")
+ private String message;
+
+ @Column(name = "tid")
+ private Long tid;
+
+ @Column(name = "dateline")
+ private Long dateline;
+
+
+
+ /**
+ * Constructor
+ */
+ public BBSOssezForumPost() {
+
+ }
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public Long getTid() {
+ return tid;
+ }
+
+ public void setTid(Long tid) {
+ this.tid = tid;
+ }
+
+ public Long getDateline() {
+ return dateline;
+ }
+
+ public void setDateline(Long dateline) {
+ this.dateline = dateline;
+ }
+}
\ No newline at end of file
diff --git a/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/request/TopicRequest.java b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/request/TopicRequest.java
new file mode 100644
index 0000000000..4922afe57f
--- /dev/null
+++ b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/request/TopicRequest.java
@@ -0,0 +1,82 @@
+package com.ossez.toolkits.discourse.common.model.request;
+
+import java.io.Serializable;
+
+
+/**
+ * SearchRequest Object, UI can send search String and related pagination
+ *
+ * @author YuCheng Hu
+ */
+public class TopicRequest implements Serializable {
+ private static final long serialVersionUID = 6474765081240948885L;
+
+
+ private String title;
+ private Integer topic_id;
+ private String raw;
+ private Integer category;
+ private String target_recipients;
+ private String archetype;
+ private String created_at;
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public Integer getTopic_id() {
+ return topic_id;
+ }
+
+ public void setTopic_id(Integer topic_id) {
+ this.topic_id = topic_id;
+ }
+
+ public String getRaw() {
+ return raw;
+ }
+
+ public void setRaw(String raw) {
+ this.raw = raw;
+ }
+
+ public Integer getCategory() {
+ return category;
+ }
+
+ public void setCategory(Integer category) {
+ this.category = category;
+ }
+
+ public String getTarget_recipients() {
+ return target_recipients;
+ }
+
+ public void setTarget_recipients(String target_recipients) {
+ this.target_recipients = target_recipients;
+ }
+
+ public String getArchetype() {
+ return archetype;
+ }
+
+ public void setArchetype(String archetype) {
+ this.archetype = archetype;
+ }
+
+ public String getCreated_at() {
+ return created_at;
+ }
+
+ public void setCreated_at(String created_at) {
+ this.created_at = created_at;
+ }
+}
diff --git a/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/response/MyFileResponse.java b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/response/MyFileResponse.java
new file mode 100644
index 0000000000..86b519589f
--- /dev/null
+++ b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/response/MyFileResponse.java
@@ -0,0 +1,130 @@
+package discourse.common.model.response;
+
+import java.io.Serializable;
+
+/**
+ * MyFileResponse for API my file response
+ *
+ * @author YuCheng Hu
+ */
+public class MyFileResponse implements Serializable {
+ private static final long serialVersionUID = -5103349220463423614L;
+
+ private Long id;
+ private String azureInputFileUUID;
+ private String azureInputFileETag;
+ private String azureOutputFileUUID;
+ private String azureOutputFileETag;
+ private String customerName;
+ private String inputFileName;
+ private Integer fileCountRow;
+ private Integer fileCountAliasMatch;
+ private Integer fileCountDirectMatch;
+ private Integer fileCountNoMatch;
+ private String dateCreated;
+ private String uuid;
+
+ public String getAzureInputFileUUID() {
+ return azureInputFileUUID;
+ }
+
+ public void setAzureInputFileUUID(String azureInputFileUUID) {
+ this.azureInputFileUUID = azureInputFileUUID;
+ }
+
+ public String getAzureInputFileETag() {
+ return azureInputFileETag;
+ }
+
+ public void setAzureInputFileETag(String azureInputFileETag) {
+ this.azureInputFileETag = azureInputFileETag;
+ }
+
+ public String getAzureOutputFileUUID() {
+ return azureOutputFileUUID;
+ }
+
+ public void setAzureOutputFileUUID(String azureOutputFileUUID) {
+ this.azureOutputFileUUID = azureOutputFileUUID;
+ }
+
+ public String getAzureOutputFileETag() {
+ return azureOutputFileETag;
+ }
+
+ public void setAzureOutputFileETag(String azureOutputFileETag) {
+ this.azureOutputFileETag = azureOutputFileETag;
+ }
+
+ public String getCustomerName() {
+ return customerName;
+ }
+
+ public void setCustomerName(String customerName) {
+ this.customerName = customerName;
+ }
+
+ public String getInputFileName() {
+ return inputFileName;
+ }
+
+ public void setInputFileName(String inputFileName) {
+ this.inputFileName = inputFileName;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Integer getFileCountRow() {
+ return fileCountRow;
+ }
+
+ public void setFileCountRow(Integer fileCountRow) {
+ this.fileCountRow = fileCountRow;
+ }
+
+ public Integer getFileCountAliasMatch() {
+ return fileCountAliasMatch;
+ }
+
+ public void setFileCountAliasMatch(Integer fileCountAliasMatch) {
+ this.fileCountAliasMatch = fileCountAliasMatch;
+ }
+
+ public Integer getFileCountDirectMatch() {
+ return fileCountDirectMatch;
+ }
+
+ public void setFileCountDirectMatch(Integer fileCountDirectMatch) {
+ this.fileCountDirectMatch = fileCountDirectMatch;
+ }
+
+ public Integer getFileCountNoMatch() {
+ return fileCountNoMatch;
+ }
+
+ public void setFileCountNoMatch(Integer fileCountNoMatch) {
+ this.fileCountNoMatch = fileCountNoMatch;
+ }
+
+ public String getDateCreated() {
+ return dateCreated;
+ }
+
+ public void setDateCreated(String dateCreated) {
+ this.dateCreated = dateCreated;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+}
diff --git a/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/response/SearchResponse.java b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/response/SearchResponse.java
new file mode 100644
index 0000000000..a990ac0f70
--- /dev/null
+++ b/toolkits/discourse/src/main/java/com/ossez/toolkits/discourse/common/model/response/SearchResponse.java
@@ -0,0 +1,37 @@
+package discourse.common.model.response;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * SearchResponse from Remote Source
+ *
+ * @author YuCheng Hu
+ */
+public class SearchResponse implements Serializable {
+ private static final long serialVersionUID = -2014480627591149391L;
+
+
+ private String uuid;
+ private Date currentDate;
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public Date getCurrentDate() {
+ return currentDate;
+ }
+
+ public void setCurrentDate(Date currentDate) {
+ this.currentDate = currentDate;
+ }
+}
diff --git a/toolkits/discourse/src/test/java/com/ossez/toolkits/discourse/DiscourseTopicsImportTest.java b/toolkits/discourse/src/test/java/com/ossez/toolkits/discourse/DiscourseTopicsImportTest.java
new file mode 100644
index 0000000000..281905bf79
--- /dev/null
+++ b/toolkits/discourse/src/test/java/com/ossez/toolkits/discourse/DiscourseTopicsImportTest.java
@@ -0,0 +1,135 @@
+package com.ossez.toolkits.discourse;
+
+import com.google.gson.Gson;
+import com.ossez.toolkits.discourse.common.model.entity.BBSOssezForumAttach;
+import com.ossez.toolkits.discourse.common.model.entity.BBSOssezForumPost;
+import com.ossez.toolkits.discourse.common.model.request.TopicRequest;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.apache.http.HttpHeaders;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.joda.time.DateTime;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * Test Logger and function
+ *
+ * @author YuCheng Hu
+ */
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class DiscourseTopicsImportTest {
+ private static Logger logger = LoggerFactory.getLogger(DiscourseTopicsImportTest.class);
+
+
+ @BeforeAll
+ protected void setUp() throws Exception {
+ }
+
+ @AfterAll
+ protected void tearDown() throws Exception {
+ }
+
+ /**
+ * Tests search functionality for the customer object.
+ */
+ @Test
+ public void testPost() throws IOException, InterruptedException {
+ List idList = FileUtils.readLines(new File("C:\\Users\\yhu\\Pictures\\Pics\\2021-01\\1.txt"));
+ for (String id : idList) {
+ processPost(NumberUtils.toLong(id));
+ Thread.sleep(6000);
+// break;
+
+ }
+
+
+ // make sure the customer was found
+// assertNotNull(bbsOssezForumPost);
+ }
+
+ @Test
+ public void testDateTime() throws IOException {
+ DateTime dateTime = new DateTime(1256834117 * 1000L);
+ System.out.println(dateTime.toString());
+
+ }
+
+ private void processPost(Long tid) throws IOException {
+ String postCtx = StringUtils.EMPTY;
+
+// BBSOssezForumPost bbsOssezForumPost = PostFactory.getBBSOssezForumPostTid(tid);
+// if (bbsOssezForumPost == null)
+// return;
+//
+// logger.debug("Questions Content - {}", bbsOssezForumPost.getSubject());
+//
+// String postCtx = bbsOssezForumPost.getMessage();
+//// logger.debug(">>>>{}", postCtx);
+//
+//
+// String pattern = "\\[attach\\]((\\d)*?)\\[\\/attach\\]";
+//
+// // Create a Pattern object
+// Pattern r = Pattern.compile(pattern);
+//
+// // Now create matcher object.
+// Matcher m = r.matcher(postCtx);
+//
+// while (m.find()) {
+// String attachId = StringUtils.substringBetween(m.group(0), "[attach]", "[/attach]");
+// logger.debug("{}", attachId);
+// BBSOssezForumAttach bbsOssezForumAttach = PostFactory.getBBSOssezForumAttach(NumberUtils.toLong(attachId));
+// if (bbsOssezForumAttach!= null) {
+// String fullURL = " + ")";
+// postCtx = StringUtils.replace(postCtx, m.group(0), fullURL);
+// }
+// }
+
+ logger.debug("{}", postCtx);
+
+
+ CloseableHttpClient client = HttpClients.createDefault();
+
+ HttpPost httpPost = new HttpPost("https://www.ossez.com/posts.json");
+ httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
+ httpPost.setHeader("Api-Key", "8d789c529c4c22bf1dac3de7dbe7b29af10f2429aeb9a1914eff6da70c2265a9");
+ httpPost.setHeader("Api-Username", "honeymoose");
+
+ TopicRequest topicRequest = new TopicRequest();
+ topicRequest.setTitle(bbsOssezForumPost.getSubject());
+ topicRequest.setRaw(postCtx);
+ topicRequest.setCreated_at(new DateTime(bbsOssezForumPost.getDateline() * 1000L).toString() );
+ topicRequest.setCategory(30);
+
+ StringEntity postingString = new StringEntity(new Gson().toJson(topicRequest), StandardCharsets.UTF_8);
+
+ httpPost.setEntity(postingString);
+
+
+ CloseableHttpResponse response = client.execute(httpPost);
+
+ logger.info("{}", EntityUtils.toString(response.getEntity()), StandardCharsets.UTF_8);
+ client.close();
+ }
+
+}
diff --git a/toolkits/discourse/src/test/resources/data/azure_storage.json b/toolkits/discourse/src/test/resources/data/azure_storage.json
new file mode 100644
index 0000000000..eb20d14fae
--- /dev/null
+++ b/toolkits/discourse/src/test/resources/data/azure_storage.json
@@ -0,0 +1,15 @@
+{
+ "id": 16,
+ "uuid": "35057495-bec8-4288-beec-568c552c88e4",
+ "dateModified": "2020-10-29T11:56:06.630+00:00",
+ "userId": "24548d05-5274-4ea0-82aa-f1693cb82045",
+ "userName": "Hu, Yucheng",
+ "userEmail": "Yucheng.Hu@insight.com",
+ "customerName": "license (1).txt",
+ "inputFileName": "license (1).txt",
+ "fileRowCount": null,
+ "fileMatchCount": null,
+ "fileStatus": null,
+ "fileSHA3": "069f7222e83cecec5663c47b0e2736709c425448b47962d1827ca958",
+ "createDate": "2020-10-29T11:56:06.630+00:00"
+}
\ No newline at end of file
diff --git a/toolkits/discourse/src/test/resources/log4j.xml b/toolkits/discourse/src/test/resources/log4j.xml
new file mode 100644
index 0000000000..4c1a066f00
--- /dev/null
+++ b/toolkits/discourse/src/test/resources/log4j.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/toolkits/pom.xml b/toolkits/pom.xml
new file mode 100644
index 0000000000..d0d92c38b4
--- /dev/null
+++ b/toolkits/pom.xml
@@ -0,0 +1,19 @@
+
+
+ 4.0.0
+ toolkits
+ toolkits
+ pom
+
+
+ com.ossez
+ parent-modules
+ 1.0.0
+
+
+
+ discourse
+
+
+