diff --git a/.gitignore b/.gitignore
index f35a1af429..84ba101d16 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
### Gradle ###
.gradle
build/
@@ -233,3 +234,93 @@ fabric.properties
# Sonarlint plugin
.idea/sonarlint
+=======
+# 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
+
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index c847011b3a..0000000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Datasource local storage ignored files
-/../../../../../../:\WorkDir\GitHub\cwiki-us-demo\java-tutorials\.idea/dataSources/
-/dataSources.local.xml
-# Editor-based HTTP Client requests
-/httpRequests/
diff --git a/.idea/.name b/.idea/.name
deleted file mode 100644
index 872918e6ae..0000000000
--- a/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-parent-modules
\ No newline at end of file
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index 919ce1f1f7..0000000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index a55e7a179b..0000000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index d0319230e1..0000000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index 89fa6713f9..0000000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
deleted file mode 100644
index 712ab9d985..0000000000
--- a/.idea/jarRepositories.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1ddfbb..0000000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index 92ee8234d9..c2d39d08e8 100644
--- a/README.md
+++ b/README.md
@@ -1,60 +1,12 @@
-**UPDATE**: The price of "Learn Spring Security OAuth" will permanently change on the 11th of December, along with the upcoming OAuth2 material: http://bit.ly/github-lss
-
-CWIKI.US
-==============================
-我们专注于开源信息的分享和文档的更新,并根据需求提供定制和软件开发咨询服务。
-**[>> 访问 CWIKI.US](https://www.cwiki.us/)**
-
-
-The Courses
-==============================
-
-
-Here's the new "Learn Spring" course:
-**[>> LEARN SPRING - THE MASTER CLASS](https://www.baeldung.com/learn-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=ls#master-class)**
-
-Here's the Master Class of "REST With Spring" (along with the new announced Boot 2 material):
-**[>> THE REST WITH SPRING - MASTER CLASS](https://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)**
-
-And here's the Master Class of "Learn Spring Security":
-**[>> LEARN SPRING SECURITY - MASTER CLASS](https://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)**
-
-
-
-Java and Spring Tutorials
-================
-
-This project is **a collection of small and focused tutorials** - each covering a single and well defined area of development in the Java ecosystem.
-A strong focus of these is, of course, the Spring Framework - Spring, Spring Boot and Spring Security.
-In additional to Spring, the modules here are covering a number of aspects in Java.
-
-
-构建(build)项目
-====================
-如果你希望运行一个完整的构建(build),请运行命令:`mvn clean install`
-
-
-构建(Building)一个单独模块(module)
-====================
-如果你希望构建一个特定的模块(module)的话,请在模块目录中运行命令:`mvn clean install`
-
-
-运行一个 Spring Boot 模块
-====================
-如果你希望运行一个 Spring Boot 模块(module)请在模块目录中(module directory)运行命令: `mvn spring-boot:run`
-
-
-与 IDE 协同进行工作
-====================
-本仓库中包含有大量的模块。
-When you're working with an individual module, there's no need to import all of them (or build all of them) - you can simply import that particular module in either Eclipse or IntelliJ.
-
-
-运行测试
-=============
-运行 `mvn clean install` 将会在模块中运行单元测试(unit tests)。
-如果你希望运行整合测试(integration tests),请使用命令 `mvn clean install -Pintegration-lite-first`
-
+
+
+
+
+
提供 CWIKI.US 项目中使用的代码
+
+所有的 Java 代码使用的是 JDK 8。
+你可以通过单击下面连接后访问我们网站,并且访问我们提供的最新有关 Java 的开发资料。
+* [概述](https://www.cwiki.us/pages/viewpage.action?pageId=37492282)
\ 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/pom.xml b/pom.xml
index f66d8a30ff..4fb8d8c3c2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,15 @@
+<<<<<<< HEAD
4.0.0
+=======
+
+
+
+4.0.0
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
com.ossez
lang-tutorial
0.0.1
@@ -38,17 +47,26 @@
+<<<<<<< HEAD
com.ossez
reoc-common
0.0.1
+=======
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ 2.11.0
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
org.apache.commons
commons-compress
+<<<<<<< HEAD
1.10
@@ -57,6 +75,17 @@
velocity
1.6
+=======
+ 1.19
+
+
+
+ org.apache.commons
+ commons-math3
+ 3.6.1
+
+
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
antlr
antlr
@@ -174,6 +203,7 @@
1.3.2
+<<<<<<< HEAD
com.ossez.rets-io
@@ -181,6 +211,24 @@
0.1.0
+=======
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
@@ -248,4 +296,8 @@
-
\ No newline at end of file
+<<<<<<< HEAD
+
+=======
+
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
diff --git a/src/main/java/com/ossez/lang/tutorial/Main.java b/src/main/java/com/ossez/lang/tutorial/Main.java
new file mode 100644
index 0000000000..3e743ee941
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/Main.java
@@ -0,0 +1,91 @@
+package com.ossez.lang.tutorial;
+
+import java.util.Properties;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.Options;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Main {
+ private static final Logger logger = LoggerFactory.getLogger(Main.class);
+
+ private static Options options = new Options();
+ private static Properties properties = new Properties();
+
+ private static CommandLine cl = null;
+
+ private static boolean dryRun = false;
+ private static int limit = 0;
+ private static boolean force = false;
+
+ public static void main(String[] args) {
+
+ // get the idx feed properties file
+ Main.parseProperties();
+
+ // load console options
+ Main.parseCommandLine(args);
+
+ logger.debug("Starting feeds...");
+ System.out.println("starting feeds...");
+
+ // execute the feeds
+ Main.executeFeeds();
+
+ }
+
+ /**
+ * Executes the feeds specified in the feeds.properties file.
+ */
+ private static void executeFeeds() {
+
+ }
+
+ /**
+ * Parses the properties file to get a list of all feeds.
+ */
+ private static void parseProperties() {
+ try {
+ // load the properties file
+ logger.debug("Parsing properties");
+ Main.properties.load(Main.class.getClassLoader().getResourceAsStream("rets.properties"));
+
+ // load the feeds
+
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ logger.error("Could not parse feed properties", ex);
+ }
+ }
+
+ /**
+ * Handles creation of console options.
+ */
+ private static void parseCommandLine(String[] args) {
+
+ // parse command line options
+ CommandLineParser parser = new GnuParser();
+
+ try {
+ Main.cl = parser.parse(Main.options, args);
+
+ // get the dry run option
+ Main.dryRun = Main.cl.hasOption("d");
+ logger.trace("Value of dryRun: " + dryRun);
+
+ // get the limit option
+ // Main.limit = Utility.parseInt(Main.cl.getOptionValue("l", "0"));
+ logger.trace("Value of limit: " + Main.limit);
+
+ // get the force option
+ Main.force = Main.cl.hasOption("u");
+ logger.trace("Value of force: " + Main.force);
+ } catch (Exception ex) {
+ logger.error("An error ocurred parsing command line arguments", ex);
+ }
+ }
+}
diff --git a/src/main/java/com/ossez/lang/tutorial/models/ListNode.java b/src/main/java/com/ossez/lang/tutorial/models/ListNode.java
new file mode 100644
index 0000000000..d4fffc8cd5
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/models/ListNode.java
@@ -0,0 +1,16 @@
+package com.ossez.lang.tutorial.models;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class ListNode {
+ public int val;
+ public ListNode next;
+
+ public ListNode(int x) {
+ val = x;
+ next = null;
+ }
+}
diff --git a/src/main/java/com/ossez/lang/tutorial/models/TreeNode.java b/src/main/java/com/ossez/lang/tutorial/models/TreeNode.java
new file mode 100644
index 0000000000..8051f395f4
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/models/TreeNode.java
@@ -0,0 +1,16 @@
+package com.ossez.lang.tutorial.models;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class TreeNode {
+ public int val;
+ public TreeNode left, right;
+
+ public TreeNode(int val) {
+ this.val = val;
+ this.left = this.right = null;
+ }
+}
diff --git a/src/main/java/com/ossez/lang/tutorial/objplusclass/CreateObject.java b/src/main/java/com/ossez/lang/tutorial/objplusclass/CreateObject.java
new file mode 100644
index 0000000000..ed62dfaf9c
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/objplusclass/CreateObject.java
@@ -0,0 +1,18 @@
+package com.ossez.lang.tutorial.objplusclass;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class CreateObject {
+ public CreateObject(String name) {
+ // This constructor has one parameter, name
+ System.out.println("小狗的名字是: " + name);
+ }
+
+ public static void main(String[] args) {
+ // Following statement would create an object myPuppy
+ CreateObject myPuppy = new CreateObject("Tomcat");
+ }
+}
diff --git a/src/main/java/com/ossez/lang/tutorial/overview/FreshJuiceEnums.java b/src/main/java/com/ossez/lang/tutorial/overview/FreshJuiceEnums.java
new file mode 100644
index 0000000000..d4d868528e
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/overview/FreshJuiceEnums.java
@@ -0,0 +1,22 @@
+package com.ossez.lang.tutorial.overview;
+
+/**
+ * Java Tutorial
+ *
+ * @author YuCheng
+ *
+ */
+class FreshJuice {
+ enum FreshJuiceSize {
+ SMALL, MEDIUM, LARGE
+ }
+
+ FreshJuiceSize size;
+}
+
+public class FreshJuiceEnums {
+ public static void main(String[] args) {
+ FreshJuice juice = new FreshJuice();
+ juice.size = FreshJuice.FreshJuiceSize.MEDIUM;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ossez/lang/tutorial/overview/HelloWorld.java b/src/main/java/com/ossez/lang/tutorial/overview/HelloWorld.java
index 51b395da04..84e2b7d662 100644
--- a/src/main/java/com/ossez/lang/tutorial/overview/HelloWorld.java
+++ b/src/main/java/com/ossez/lang/tutorial/overview/HelloWorld.java
@@ -3,11 +3,25 @@ package com.ossez.lang.tutorial.overview;
/**
* Java Tutorial
*
+<<<<<<< HEAD
+=======
+ * This is my first java program. This will print 'Hello World' as the output This is an example of multi-line comments
+ *
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
* @author YuCheng
*
*/
public class HelloWorld {
public static void main(String[] args) {
+<<<<<<< HEAD
System.out.println("Hello World");
}
-}
\ No newline at end of file
+}
+=======
+ // This is an example of single line comment
+ /* This is also an example of single line comment. */
+
+ System.out.println("Hello World");
+ }
+}
+>>>>>>> 361e407d91e00158295aadeaca0a91d84a534820
diff --git a/src/main/java/com/ossez/lang/tutorial/usecases/VarargsCase.java b/src/main/java/com/ossez/lang/tutorial/usecases/VarargsCase.java
new file mode 100644
index 0000000000..d300821e4d
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/usecases/VarargsCase.java
@@ -0,0 +1,37 @@
+package com.ossez.lang.tutorial.usecases;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * variable arguments use case
+ */
+public class VarargsCase {
+ private static final Logger logger = LoggerFactory.getLogger(VarargsCase.class);
+
+ /**
+ * sumVarargs
+ *
+ * @param intArrays
+ * @return
+ */
+ static int sumVarargs(int... intArrays) {
+ int sum, i;
+ sum = 0;
+ for (i = 0; i < intArrays.length; i++) {
+ sum += intArrays[i];
+ }
+ return (sum);
+ }
+
+ /**
+ * Main Function
+ *
+ * @param args
+ */
+ public static void main(String args[]) {
+ int sum = 0;
+ sum = sumVarargs(new int[]{10, 12, 33, 7});
+ logger.debug("The Sum of the arrays: {}", sum);
+ }
+}
diff --git a/src/main/java/com/ossez/lang/tutorial/utils/TreeUtils.java b/src/main/java/com/ossez/lang/tutorial/utils/TreeUtils.java
new file mode 100644
index 0000000000..ead47224c0
--- /dev/null
+++ b/src/main/java/com/ossez/lang/tutorial/utils/TreeUtils.java
@@ -0,0 +1,55 @@
+package com.ossez.lang.tutorial.utils;
+
+import java.util.ArrayList;
+
+import com.ossez.lang.tutorial.models.TreeNode;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class TreeUtils {
+
+ public static TreeNode initTree(String data) {
+ // NULL CHECK
+ if (data.equals("{}")) {
+ return null;
+ }
+
+ ArrayList treeList = new ArrayList();
+
+ data = data.replace("{", "");
+ data = data.replace("}", "");
+ String[] vals = data.split(",");
+
+ // INSERT ROOT
+ TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
+ treeList.add(root);
+
+ int index = 0;
+ boolean isLeftChild = true;
+ for (int i = 1; i < vals.length; i++) {
+ if (!vals[i].equals("#")) {
+ TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
+ if (isLeftChild) {
+ treeList.get(index).left = node;
+ } else {
+ treeList.get(index).right = node;
+ }
+ treeList.add(node);
+ }
+
+ // LEVEL
+ if (!isLeftChild) {
+ index++;
+ }
+
+ // MOVE TO RIGHT OR NEXT LEVEL
+ isLeftChild = !isLeftChild;
+ }
+
+ return root;
+
+ }
+}
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000..4a910c253f
--- /dev/null
+++ b/src/main/resources/log4j2.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+ /home/logs/reoc/services/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/BitOperationTest.java b/src/test/java/com/ossez/lang/tutorial/tests/BitOperationTest.java
new file mode 100644
index 0000000000..eb570df0dd
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/BitOperationTest.java
@@ -0,0 +1,36 @@
+package com.ossez.lang.tutorial.tests;
+
+import org.apache.commons.math3.util.FastMath;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class BitOperationTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(BitOperationTest.class);
+
+ /**
+ * 35 https://www.lintcode.com/problem/reverse-linked-list/description
+ */
+ @Test
+ public void testInt2Bit() {
+ logger.debug("BEGIN");
+ System.out.println(Integer.toBinaryString(5));
+ System.out.println(Integer.toBinaryString(2));
+
+ System.out.println(Integer.toBinaryString(2 << 2));
+
+ System.out.println(Integer.parseInt(Integer.toBinaryString(2 << 2), 2));
+
+ System.out.println(5 / 3);
+ System.out.println(5 % 3);
+ FastMath.pow(2, 3);
+
+ }
+
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/DiscourseImportTest.java b/src/test/java/com/ossez/lang/tutorial/tests/DiscourseImportTest.java
new file mode 100644
index 0000000000..27cce33d49
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/DiscourseImportTest.java
@@ -0,0 +1,137 @@
+package com.ossez.lang.tutorial.tests;
+
+import com.google.gson.Gson;
+import com.ossez.edtestbank.common.dao.Factory;
+import com.ossez.edtestbank.common.dao.factories.PostFactory;
+import com.ossez.edtestbank.common.model.entity.BBSOssezForumAttach;
+import com.ossez.edtestbank.common.model.entity.BBSOssezForumPost;
+import com.ossez.edtestbank.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 PostTest {
+ private static Logger logger = LoggerFactory.getLogger(PostTest.class);
+
+
+ @BeforeAll
+ protected void setUp() throws Exception {
+ Factory.beginTransaction();
+ }
+
+ @AfterAll
+ protected void tearDown() throws Exception {
+ Factory.rollbackTransaction();
+ }
+
+ /**
+ * 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 {
+ 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", "XXXXXX");
+ httpPost.setHeader("Api-Username", "XXXXXX");
+
+ 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/src/test/java/com/ossez/lang/tutorial/tests/LintcodeTest.java b/src/test/java/com/ossez/lang/tutorial/tests/LintcodeTest.java
new file mode 100644
index 0000000000..7cf699092d
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/LintcodeTest.java
@@ -0,0 +1,293 @@
+package com.ossez.lang.tutorial.tests;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.management.ListenerNotFoundException;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ossez.lang.tutorial.models.ListNode;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class LintcodeTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintcodeTest.class);
+
+ /**
+ * 35 https://www.lintcode.com/problem/reverse-linked-list/description
+ */
+ @Test
+ public void test0035Reverse() {
+ // INIT LINKED LIST
+ ListNode head = new ListNode(1);
+ head.next = new ListNode(2);
+ head.next.next = new ListNode(3);
+
+ // CHECK BEFORE
+ System.out.println(head.val);
+ System.out.println(head.next.val);
+ System.out.println(head.next.next.val);
+
+ // REVERSE
+ ListNode prev = null;
+ while (head != null) {
+ ListNode temp = head.next;
+ head.next = prev;
+ prev = head;
+ head = temp;
+ }
+
+ // CHECK AFTER
+ System.out.println(prev.val);
+ System.out.println(prev.next.val);
+ System.out.println(prev.next.next.val);
+ }
+
+ /**
+ * 1480 https://www.lintcode.com/problem/dot-product/description
+ */
+ @Test
+ public void test0044minSubArray() {
+
+ List nums = new ArrayList();
+ nums.add(1);
+ nums.add(1);
+
+ int min_ending_here = 0;
+ int retStatus = 0;
+
+ for (int i = 0; i < nums.size(); i++) {
+ if (min_ending_here > 0) {
+ min_ending_here = nums.get(i);
+ } else {
+ min_ending_here += nums.get(i);
+ }
+ retStatus = Math.min(retStatus, min_ending_here);
+ }
+
+ System.out.println(retStatus);
+
+ }
+
+ /**
+ * 53 https://www.lintcode.com/problem/reverse-words-in-a-string/description
+ */
+ @Test
+ public void test0053ReverseWords() {
+
+ String s = " Life doesn't always give us the joys we want.";
+
+ String retStr = "";
+ String[] inStr = s.split(" ");
+
+ for (int i = inStr.length - 1; i >= 0; i--) {
+ String cStr = inStr[i].trim();
+ if (!cStr.isEmpty()) {
+ retStr = retStr + " " + cStr;
+ }
+ }
+ retStr = retStr.trim();
+ System.out.println(retStr);
+ // return retStr;
+ }
+
+ /**
+ * 56 https://www.lintcode.com/problem/two-sum/description
+ */
+ @Test
+ public void test0056TwoSum() {
+ int[] numbers = { 2, 7, 11, 15 };
+ int target = 9;
+
+ int[] retArray = new int[2];
+
+ for (int i = 0; i < numbers.length; i++) {
+ int intA = numbers[i];
+ int intB = 0;
+
+ for (int j = 1 + i; j < numbers.length; j++) {
+ intB = numbers[j];
+ // SUM CHECK
+ if (target == intA + intB && i < j) {
+ retArray[0] = i;
+ retArray[1] = j;
+ break;
+ }
+ }
+ }
+
+ System.out.println(Arrays.toString(retArray));
+ }
+
+ /**
+ * 209 https://www.lintcode.com/problem/first-unique-character-in-a-string
+ */
+ @Test
+ public void test0209FirstUniqChar() {
+ String str = "ddjdz";
+
+ char retStatus = 0;
+
+ // LOOP CHECK
+ for (int i = 0; i < 30; i++) {
+ char c = str.charAt(0);
+ if (str.indexOf(Character.toString(c)) == str.lastIndexOf(Character.toString(c))) {
+ retStatus = c;
+ break;
+ }
+ str = str.replaceAll(Character.toString(c), "");
+ }
+
+ System.out.println("" + retStatus);
+ }
+
+ /**
+ * 411
+ *
+ *
+ *
+ *
+ *
+ */
+ @Test
+ public void test0411GrayCode() {
+ int n = 2;
+
+ List retArray = new ArrayList<>();
+
+ if (n == 0) {
+ retArray.add(0);
+ }
+
+ for (int i = 0; i < (2 << (n - 1)); i++) {
+ int g = i ^ (i / 2);
+ retArray.add(g);
+ }
+
+ System.out.println(retArray);
+ }
+
+ /**
+ * 1480 https://www.lintcode.com/problem/dot-product/description
+ */
+ @Test
+ public void test0423IsValidParentheses() {
+ String s = "([)]";
+
+ boolean retStatus = false;
+ for (int i = 0; i < 3; i++) {
+ s = s.replace("()", "");
+ s = s.replace("{}", "");
+ s = s.replace("[]", "");
+
+ if (s.length() == 0) {
+ retStatus = true;
+ break;
+ }
+ }
+
+ System.out.println(retStatus);
+
+ }
+
+ /**
+ * 646 https://www.lintcode.com/problem/first-position-unique-character/description
+ */
+ @Test
+ public void test0646FirstUniqChar() {
+ String s = "saau";
+
+ int retStatus = -1;
+ boolean breakLoop = false;
+
+ int[] iArray = new int[256];
+
+ // NULL CHECK
+ if (s == null || s.length() == 0) {
+ retStatus = -1;
+ }
+
+ // LOOP CHECK
+ for (char c : s.toCharArray()) {
+ iArray[c]++;
+ }
+ for (int i = 0; i < s.length(); i++) {
+ if (iArray[s.charAt(i)] == 1) {
+ retStatus = i;
+ breakLoop = true;
+ break;
+ }
+ }
+
+ // LOOP BREAK CHECK
+ if (!breakLoop) {
+ retStatus = -1;
+ }
+
+ System.out.println(retStatus);
+ }
+
+ /**
+ * 767 https://www.lintcode.com/problem/reverse-array/description
+ */
+ @Test
+ public void test0767ReverseArray() {
+ int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
+
+ for (int i = 0; i < nums.length / 2; i++) {
+ int tmp = nums[i];
+ nums[i] = nums[nums.length - 1 - i];
+ nums[nums.length - 1 - i] = tmp;
+ }
+
+ System.out.println(Arrays.toString(nums));
+
+ }
+
+ /**
+ * 1480 https://www.lintcode.com/problem/dot-product/description
+ */
+ @Test
+ public void test1377findSubstring() {
+ String str = "";
+ int k = 5;
+
+ HashSet strSet = new HashSet();
+
+ for (int i = 0; i <= str.length() - k; i++) {
+ String subStr = str.substring(i, i + k);
+
+ String pattern = ".*(.).*\\1.*";
+
+ Pattern r = Pattern.compile(pattern);
+
+ Matcher m = r.matcher(subStr);
+ if (!m.find()) {
+ strSet.add(subStr);
+ }
+
+ }
+
+ System.out.println(strSet.size());
+ }
+
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/SingletonTest.java b/src/test/java/com/ossez/lang/tutorial/tests/SingletonTest.java
new file mode 100644
index 0000000000..a6cd888777
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/SingletonTest.java
@@ -0,0 +1,69 @@
+package com.ossez.lang.tutorial.tests;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Eager Singleton
+ *
+ * @author YuCheng
+ *
+ */
+class EagerSingleton {
+ private static final EagerSingleton INSTANCE = new EagerSingleton();
+
+ // Private constructor suppresses
+ private EagerSingleton() {
+ }
+
+ // default public constructor
+ public static EagerSingleton getInstance() {
+ return INSTANCE;
+ }
+}
+
+/**
+ * Lazy Singleton
+ *
+ * @author YuCheng
+ *
+ */
+class LazySingleton {
+ private static volatile LazySingleton INSTANCE = null;
+
+ // Private constructor suppresses
+ // default LazySingleton constructor
+ private LazySingleton() {
+ }
+
+ // thread safe and performance promote
+ public static LazySingleton getInstance() {
+ if (INSTANCE == null) {
+ synchronized (LazySingleton.class) {
+ // when more than two threads run into the first null check same time, to avoid instanced more than one time, it needs to be
+ // checked again.
+ if (INSTANCE == null) {
+ INSTANCE = new LazySingleton();
+ }
+ }
+ }
+ return INSTANCE;
+ }
+}
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class SingletonTest {
+ private final static Logger logger = LoggerFactory.getLogger(SingletonTest.class);
+
+ @Test
+ public void testSingleton() {
+ logger.debug("TEST Singleton");
+
+ }
+
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/TreeTest.java b/src/test/java/com/ossez/lang/tutorial/tests/TreeTest.java
new file mode 100644
index 0000000000..ee67e07c05
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/TreeTest.java
@@ -0,0 +1,85 @@
+package com.ossez.lang.tutorial.tests;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ossez.lang.tutorial.models.TreeNode;
+import com.ossez.lang.tutorial.utils.TreeUtils;
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class TreeTest {
+ private final static Logger logger = LoggerFactory.getLogger(TreeTest.class);
+ private static List loopList = new ArrayList();
+
+ @Test
+ public void testMain() {
+ logger.debug("TREE TEST");
+ String data = "{1,2,3,4,5,#,6,#,#,7,8,#,#}";
+ TreeNode treeNode = TreeUtils.initTree(data);
+
+ // PRE
+ loopList = new ArrayList();
+ preOrderTraverselRecursion(treeNode);
+ System.out.println(loopList);
+
+ // IN
+ loopList = new ArrayList();
+ inOrderTraverselRecursion(treeNode);
+ System.out.println(loopList);
+
+ // POST
+ loopList = new ArrayList();
+ postOrderTraversalRecursion(treeNode);
+ System.out.println(loopList);
+ }
+
+
+
+
+ /**
+ *
+ * @param root
+ */
+ public void preOrderTraverselRecursion(TreeNode root) {
+ if (root != null) {
+ loopList.add(root.val);
+ preOrderTraverselRecursion(root.left);
+ preOrderTraverselRecursion(root.right);
+ }
+ }
+
+ /**
+ *
+ * @param root
+ */
+ public void inOrderTraverselRecursion(TreeNode root) {
+ if (root != null) {
+ inOrderTraverselRecursion(root.left);
+ loopList.add(root.val);
+ inOrderTraverselRecursion(root.right);
+ }
+
+ }
+
+ /**
+ *
+ * @param root
+ */
+ public void postOrderTraversalRecursion(TreeNode root) {
+ if (root != null) {
+ postOrderTraversalRecursion(root.left);
+ postOrderTraversalRecursion(root.right);
+ loopList.add(root.val);
+ }
+
+ }
+
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/VariableTest.java b/src/test/java/com/ossez/lang/tutorial/tests/VariableTest.java
new file mode 100644
index 0000000000..a7112e3aea
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/VariableTest.java
@@ -0,0 +1,49 @@
+package com.ossez.lang.tutorial.tests;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import junit.framework.TestCase;
+
+/**
+ * Object of VariableOssez
+ *
+ * @author YuCheng
+ *
+ */
+class OssezVariable {
+ int s1, s2;
+ static int s3;
+
+ OssezVariable(int x, int y, int z) {
+ s1 = x;
+ s2 = y;
+ s3 = z;
+ }
+}
+
+/**
+ *
+ * @author YuCheng
+ *
+ */
+public class VariableTest extends TestCase {
+
+ private final static Logger logger = LoggerFactory.getLogger(VariableTest.class);
+
+ /**
+ * Do RetsServerConnection Test
+ */
+ @Test
+ public void testStaticVariableChange() {
+
+ OssezVariable objA = new OssezVariable(1, 2, 3);
+ logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objA.s1, objA.s2, OssezVariable.s3);
+
+ OssezVariable objB = new OssezVariable(4, 5, 6);
+ logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objA.s1, objA.s2, OssezVariable.s3);
+ logger.debug("s1/s2/s3 - [{}]/[{}]/[{}]", objB.s1, objB.s2, OssezVariable.s3);
+ }
+
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/codility/CodilityBinaryGapTest.java b/src/test/java/com/ossez/lang/tutorial/tests/codility/CodilityBinaryGapTest.java
new file mode 100644
index 0000000000..f430a4f5d0
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/codility/CodilityBinaryGapTest.java
@@ -0,0 +1,56 @@
+package com.ossez.lang.tutorial.tests.codility;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * More details about question see link below
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class CodilityBinaryGapTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(CodilityBinaryGapTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+
+ int N = 529;
+ String intStr = Integer.toBinaryString(N);
+
+ intStr = intStr.replace("1", "#1#");
+
+ String[] strArray = intStr.split("1");
+
+ int maxCount = 0;
+ for (int i = 0; i < strArray.length; i++) {
+ String checkStr = strArray[i];
+ int countLength = 0;
+
+ if (checkStr.length() > 2 && checkStr.startsWith("#") && checkStr.endsWith("#")) {
+ checkStr = checkStr.replace("#", "");
+ countLength = checkStr.length();
+
+ if (maxCount < countLength) {
+ maxCount = countLength;
+ }
+
+ }
+ }
+
+ logger.debug("MAX COUNT: [{}]", maxCount);
+ }
+
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserializeTest.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserializeTest.java
new file mode 100644
index 0000000000..cb900c3f37
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserializeTest.java
@@ -0,0 +1,131 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ossez.lang.tutorial.models.TreeNode;
+
+/**
+ *
+ * 7
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode0007SerializeAndDeserializeTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode0007SerializeAndDeserializeTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+ String data = "{3,9,20,#,#,15,7}";
+
+ System.out.println(serialize(deserialize(data)));
+
+ }
+
+ /**
+ * Deserialize from array to tree
+ *
+ * @param data
+ * @return
+ */
+ private TreeNode deserialize(String data) {
+ // NULL CHECK
+ if (data.equals("{}")) {
+ return null;
+ }
+
+ ArrayList treeList = new ArrayList();
+
+ data = data.replace("{", "");
+ data = data.replace("}", "");
+ String[] vals = data.split(",");
+
+ // INSERT ROOT
+ TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
+ treeList.add(root);
+
+ int index = 0;
+ boolean isLeftChild = true;
+ for (int i = 1; i < vals.length; i++) {
+ if (!vals[i].equals("#")) {
+ TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
+ if (isLeftChild) {
+ treeList.get(index).left = node;
+ } else {
+ treeList.get(index).right = node;
+ }
+ treeList.add(node);
+ }
+
+ // LEVEL
+ if (!isLeftChild) {
+ index++;
+ }
+
+ // MOVE TO RIGHT OR NEXT LEVEL
+ isLeftChild = !isLeftChild;
+ }
+
+ return root;
+
+ }
+
+ /**
+ *
+ * @param root
+ * @return
+ */
+ public String serialize(TreeNode root) {
+ // write your code here
+ if (root == null) {
+ return "{}";
+ }
+
+ ArrayList queue = new ArrayList();
+ queue.add(root);
+
+ for (int i = 0; i < queue.size(); i++) {
+ TreeNode node = queue.get(i);
+ if (node == null) {
+ continue;
+ }
+ queue.add(node.left);
+ queue.add(node.right);
+ }
+
+ while (queue.get(queue.size() - 1) == null) {
+ queue.remove(queue.size() - 1);
+ }
+
+ StringBuilder sb = new StringBuilder();
+ sb.append("{");
+ sb.append(queue.get(0).val);
+ for (int i = 1; i < queue.size(); i++) {
+ if (queue.get(i) == null) {
+ sb.append(",#");
+ } else {
+ sb.append(",");
+ sb.append(queue.get(i).val);
+ }
+ }
+ sb.append("}");
+ return sb.toString();
+ }
+
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0069LevelOrderTest.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0069LevelOrderTest.java
new file mode 100644
index 0000000000..f0f661947a
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0069LevelOrderTest.java
@@ -0,0 +1,124 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ossez.lang.tutorial.models.TreeNode;
+
+/**
+ *
+ * 69
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode0069LevelOrderTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode0069LevelOrderTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+ String data = "{3,9,20,#,#,15,7}";
+
+ TreeNode tn = deserialize(data);
+ System.out.println(levelOrder(tn));
+
+ }
+
+ /**
+ * Deserialize from array to tree
+ *
+ * @param data
+ * @return
+ */
+ private TreeNode deserialize(String data) {
+ // NULL CHECK
+ if (data.equals("{}")) {
+ return null;
+ }
+
+ ArrayList treeList = new ArrayList();
+
+ data = data.replace("{", "");
+ data = data.replace("}", "");
+ String[] vals = data.split(",");
+
+ // INSERT ROOT
+ TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
+ treeList.add(root);
+
+ int index = 0;
+ boolean isLeftChild = true;
+ for (int i = 1; i < vals.length; i++) {
+ if (!vals[i].equals("#")) {
+ TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
+ if (isLeftChild) {
+ treeList.get(index).left = node;
+ } else {
+ treeList.get(index).right = node;
+ }
+ treeList.add(node);
+ }
+
+ // LEVEL
+ if (!isLeftChild) {
+ index++;
+ }
+
+ // MOVE TO RIGHT OR NEXT LEVEL
+ isLeftChild = !isLeftChild;
+ }
+
+ return root;
+
+ }
+
+ private List> levelOrder(TreeNode root) {
+ Queue queue = new LinkedList();
+ List> rs = new ArrayList>();
+
+ // NULL CHECK
+ if (root == null) {
+ return rs;
+ }
+
+ queue.offer(root);
+
+ while (!queue.isEmpty()) {
+ int length = queue.size();
+ List list = new ArrayList();
+
+ for (int i = 0; i < length; i++) {
+ TreeNode curTN = queue.poll();
+ list.add(curTN.val);
+ if (curTN.left != null) {
+ queue.offer(curTN.left);
+ }
+ if (curTN.right != null) {
+ queue.offer(curTN.right);
+ }
+ }
+
+ rs.add(list);
+ }
+
+ return rs;
+ }
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0102HasCycleTest.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0102HasCycleTest.java
new file mode 100644
index 0000000000..7ded09697e
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0102HasCycleTest.java
@@ -0,0 +1,63 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ossez.lang.tutorial.models.ListNode;
+
+/**
+ *
+ * 102
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode0102HasCycleTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode0102HasCycleTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+ // INIT LINKED LIST
+ ListNode head = new ListNode(1);
+ head.next = new ListNode(2);
+ head.next.next = new ListNode(3);
+ head.next.next.next = new ListNode(4);
+
+ // CREATE A LOOP
+ head.next.next.next.next = head.next.next.next;
+
+ boolean retResult = false;
+
+ // LIKED LIST MAY NULL:
+ if (!(head == null || head.next == null)) {
+ ListNode s = head;
+ ListNode f = head.next;
+
+ while (f.next != null && f.next.next != null) {
+
+ s = s.next;
+ f = f.next.next;
+
+ if (f == s) {
+ retResult = true;
+ break;
+ }
+ }
+ }
+
+ System.out.println(retResult);
+
+ }
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0165MergeTwoListsTest.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0165MergeTwoListsTest.java
new file mode 100644
index 0000000000..5bfac549d6
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0165MergeTwoListsTest.java
@@ -0,0 +1,89 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.ossez.lang.tutorial.models.ListNode;
+
+/**
+ *
+ * 102
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode0165MergeTwoListsTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode0165MergeTwoListsTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+ // INIT LINKED LIST l1
+ ListNode l1 = new ListNode(1);
+ l1.next = new ListNode(3);
+ l1.next.next = new ListNode(8);
+ l1.next.next.next = new ListNode(11);
+ l1.next.next.next.next = new ListNode(15);
+
+ // INIT LINKED LIST l2
+ ListNode l2 = new ListNode(2);
+
+ // RETURN RESULT
+ ListNode retResult = new ListNode(0);
+
+ // NULL CHECK
+ // if (l1 == null && l2 == null) {
+ // retResult = null;
+ // }
+ //
+ // if (l1 == null) {
+ // retResult = l2;
+ // }
+ //
+ // if (l2 == null) {
+ // retResult = l1;
+ // }
+
+ // MERGE
+ retResult = new ListNode(0);
+ ListNode tmpNode = new ListNode(0);
+ retResult = tmpNode;
+ while (l1 != null & l2 != null) {
+ if (l1.val <= l2.val) {
+ tmpNode.next = l1;
+ l1 = l1.next;
+ } else {
+ tmpNode.next = l2;
+ l2 = l2.next;
+ }
+
+ tmpNode = tmpNode.next;
+ }
+
+ if (l1 == null) {
+ tmpNode.next = l2;
+ }
+
+ if (l2 == null) {
+ tmpNode.next = l1;
+ }
+
+ retResult = retResult.next;
+
+ System.out.println(retResult.val);
+ System.out.println(retResult.next.val);
+ System.out.println(retResult.next.next.val);
+
+ }
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0425LetterCombinationsTest.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0425LetterCombinationsTest.java
new file mode 100644
index 0000000000..7312cbb993
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0425LetterCombinationsTest.java
@@ -0,0 +1,78 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * 425
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode0425LetterCombinationsTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode0425LetterCombinationsTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("LetterCombinationsTest");
+ String digits = "23";
+
+ HashMap phoneKeyMap = new HashMap();
+ phoneKeyMap.put("0", "");
+ phoneKeyMap.put("1", "");
+ phoneKeyMap.put("2", "abc");
+ phoneKeyMap.put("3", "def");
+ phoneKeyMap.put("4", "ghi");
+ phoneKeyMap.put("5", "jkl");
+ phoneKeyMap.put("6", "mno");
+ phoneKeyMap.put("7", "pqrs");
+ phoneKeyMap.put("8", "tuv");
+ phoneKeyMap.put("9", "wxyz");
+
+ List retStatus = new ArrayList<>();
+
+ if (digits != null && digits.length() != 0) {
+ phoneRecursive(digits, retStatus, phoneKeyMap, "", 0);
+ }
+
+ System.out.println(retStatus);
+ }
+
+ /**
+ * phoneRecursive
+ *
+ * @param digits
+ * @param retStatus
+ * @param phoneKeyMap
+ * @param comb
+ * @param index
+ */
+ private void phoneRecursive(String digits, List retStatus, HashMap phoneKeyMap, String comb, int index) {
+ if (index == digits.length()) {
+ retStatus.add(comb);
+ return;
+ }
+
+ char pos = digits.charAt(index);
+ for (char c : ((String) phoneKeyMap.get(String.valueOf(pos))).toCharArray()) {
+ phoneRecursive(digits, retStatus, phoneKeyMap, comb + c, index + 1);
+ }
+ }
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0433NumIslandsTest.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0433NumIslandsTest.java
new file mode 100644
index 0000000000..534bc9f4d6
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0433NumIslandsTest.java
@@ -0,0 +1,94 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * 433
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode0433NumIslandsTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode0433NumIslandsTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+ // INIT GRID
+ boolean[][] grid = { { true, true, false, false, false }, { false, true, false, false, true }, { false, false, false, true, true },
+ { false, false, false, false, false }, { false, false, false, false, true }
+
+ };
+
+ // NULL CHECK
+ if (grid.length == 0 || grid[0].length == 0) {
+ System.out.println("NULL");
+ // return 0;
+ }
+
+ // GET SIZE
+ int n = grid.length;
+ int m = grid[0].length;
+
+ // ARRAY FOR VISITED LOG
+ boolean[][] visited = new boolean[n][m];
+
+ int count = 0;
+
+ // LOOP FOR GRID
+ for (int i = 0; i < n; i++) {
+ for (int j = 0; j < m; j++) {
+ if (grid[i][j] && !visited[i][j]) {
+ numIslandsDFS(grid, visited, i, j);
+ count++;
+ }
+ }
+ }
+
+ System.out.println(count);
+
+ }
+
+ /**
+ *
+ * @param grid
+ * @param visited
+ * @param x
+ * @param y
+ */
+ public void numIslandsDFS(boolean[][] grid, boolean[][] visited, int x, int y) {
+ if (x < 0 || x >= grid.length) {
+ return;
+ }
+
+ if (y < 0 || y >= grid[0].length) {
+ return;
+ }
+
+ if (grid[x][y] != true || visited[x][y]) {
+ return;
+ }
+
+ visited[x][y] = true;
+
+ // Recursive call
+ numIslandsDFS(grid, visited, x - 1, y);
+ numIslandsDFS(grid, visited, x + 1, y);
+ numIslandsDFS(grid, visited, x, y - 1);
+ numIslandsDFS(grid, visited, x, y + 1);
+
+ }
+}
diff --git a/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode1480DotProductTest.java b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode1480DotProductTest.java
new file mode 100644
index 0000000000..fb62a811a0
--- /dev/null
+++ b/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode1480DotProductTest.java
@@ -0,0 +1,35 @@
+package com.ossez.lang.tutorial.tests.lintcode;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * 1480
+ *
+ *
+ *
+ * @author YuCheng
+ *
+ */
+public class LintCode1480DotProductTest {
+
+ private final static Logger logger = LoggerFactory.getLogger(LintCode1480DotProductTest.class);
+
+ /**
+ *
+ */
+ @Test
+ public void testMain() {
+ logger.debug("BEGIN");
+ int t = 87;
+ int[] dur = { 20, 25, 19, 37 };
+ // Write your code here
+ }
+
+}
diff --git a/src/test/resources/log4j2.xml b/src/test/resources/log4j2.xml
new file mode 100644
index 0000000000..4a910c253f
--- /dev/null
+++ b/src/test/resources/log4j2.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+ /home/logs/reoc/services/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %-d{yyyy/MM/dd HH:mm:ss} %-5p [%c] - %m%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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/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
+
+
+