From 9fdbdcf2a0e37bf210fd9f2b9660bb8190094636 Mon Sep 17 00:00:00 2001 From: socra167 Date: Mon, 23 Dec 2024 14:07:00 +0900 Subject: [PATCH 1/3] feat --- .gitignore | 31 +++ .gradle/8.2/checksums/checksums.lock | Bin 0 -> 17 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../8.2/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/8.2/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/8.2/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/8.2/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 18713 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 8 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/discord.xml | 7 + .idea/gradle.xml | 15 ++ .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 5 + .idea/vcs.xml | 6 + README.md | 6 +- build.gradle.kts | 20 ++ ...m.ll.wiseSaying.WiseSayingServiceTest.html | 134 ++++++++++ build/reports/tests/test/css/base-style.css | 179 ++++++++++++++ build/reports/tests/test/css/style.css | 84 +++++++ build/reports/tests/test/index.html | 133 ++++++++++ build/reports/tests/test/js/report.js | 194 +++++++++++++++ .../test/packages/com.ll.wiseSaying.html | 103 ++++++++ ...om.ll.wiseSaying.WiseSayingServiceTest.xml | 13 + build/test-results/test/binary/output.bin | 0 build/test-results/test/binary/output.bin.idx | Bin 0 -> 1 bytes build/test-results/test/binary/results.bin | Bin 0 -> 592 bytes .../stash-dir/App$1.class.uniqueId2 | Bin 0 -> 875 bytes .../stash-dir/App.class.uniqueId5 | Bin 0 -> 7247 bytes .../stash-dir/FileUtil.class.uniqueId4 | Bin 0 -> 4218 bytes .../stash-dir/Main.class.uniqueId1 | Bin 0 -> 554 bytes .../WiseSayingController.class.uniqueId0 | Bin 0 -> 4731 bytes .../WiseSayingJSONRepository.class.uniqueId3 | Bin 0 -> 7629 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 1097 bytes .../previous-compilation-data.bin | Bin 0 -> 25002 bytes db/wiseSaying/1.json | 5 + db/wiseSaying/10.json | 5 + db/wiseSaying/11.json | 5 + db/wiseSaying/12.json | 5 + db/wiseSaying/13.json | 5 + db/wiseSaying/14.json | 5 + db/wiseSaying/15.json | 5 + db/wiseSaying/16.json | 5 + db/wiseSaying/2.json | 5 + db/wiseSaying/3.json | 5 + db/wiseSaying/4.json | 5 + db/wiseSaying/5.json | 5 + db/wiseSaying/6.json | 5 + db/wiseSaying/7.json | 5 + db/wiseSaying/8.json | 5 + db/wiseSaying/9.json | 5 + db/wiseSaying/create_dummy.sh | 36 +++ db/wiseSaying/lastId.txt | 1 + gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 234 ++++++++++++++++++ gradlew.bat | 89 +++++++ settings.gradle.kts | 2 + src/main/java/com/ll/wiseSaying/App.java | 197 +++++++++++++++ .../java/com/ll/wiseSaying/Attribute.java | 25 ++ .../com/ll/wiseSaying/CommandLineMenu.java | 100 ++++++++ src/main/java/com/ll/wiseSaying/FileUtil.java | 85 +++++++ src/main/java/com/ll/wiseSaying/Main.java | 8 + .../java/com/ll/wiseSaying/MenuOption.java | 29 +++ src/main/java/com/ll/wiseSaying/Status.java | 10 + .../java/com/ll/wiseSaying/WiseSaying.java | 31 +++ .../ll/wiseSaying/WiseSayingController.java | 129 ++++++++++ .../ll/wiseSaying/WiseSayingJSONMapper.java | 66 +++++ .../wiseSaying/WiseSayingJSONRepository.java | 142 +++++++++++ .../wiseSaying/WiseSayingMapRepository.java | 112 +++++++++ .../com/ll/wiseSaying/WiseSayingPage.java | 43 ++++ .../com/ll/wiseSaying/WiseSayingReponse.java | 63 +++++ .../ll/wiseSaying/WiseSayingRepository.java | 12 + .../com/ll/wiseSaying/WiseSayingService.java | 56 +++++ .../ll/wiseSaying/WiseSayingServiceTest.java | 159 ++++++++++++ 79 files changed, 2681 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .gradle/8.2/checksums/checksums.lock create mode 100644 .gradle/8.2/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/8.2/dependencies-accessors/gc.properties create mode 100644 .gradle/8.2/executionHistory/executionHistory.lock create mode 100644 .gradle/8.2/fileChanges/last-build.bin create mode 100644 .gradle/8.2/fileHashes/fileHashes.lock create mode 100644 .gradle/8.2/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/discord.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 build.gradle.kts create mode 100644 build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html create mode 100644 build/reports/tests/test/css/base-style.css create mode 100644 build/reports/tests/test/css/style.css create mode 100644 build/reports/tests/test/index.html create mode 100644 build/reports/tests/test/js/report.js create mode 100644 build/reports/tests/test/packages/com.ll.wiseSaying.html create mode 100644 build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml create mode 100644 build/test-results/test/binary/output.bin create mode 100644 build/test-results/test/binary/output.bin.idx create mode 100644 build/test-results/test/binary/results.bin create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/App$1.class.uniqueId2 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/App.class.uniqueId5 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/FileUtil.class.uniqueId4 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingController.class.uniqueId0 create mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingJSONRepository.class.uniqueId3 create mode 100644 build/tmp/compileJava/previous-compilation-data.bin create mode 100644 build/tmp/compileTestJava/previous-compilation-data.bin create mode 100644 db/wiseSaying/1.json create mode 100644 db/wiseSaying/10.json create mode 100644 db/wiseSaying/11.json create mode 100644 db/wiseSaying/12.json create mode 100644 db/wiseSaying/13.json create mode 100644 db/wiseSaying/14.json create mode 100644 db/wiseSaying/15.json create mode 100644 db/wiseSaying/16.json create mode 100644 db/wiseSaying/2.json create mode 100644 db/wiseSaying/3.json create mode 100644 db/wiseSaying/4.json create mode 100644 db/wiseSaying/5.json create mode 100644 db/wiseSaying/6.json create mode 100644 db/wiseSaying/7.json create mode 100644 db/wiseSaying/8.json create mode 100644 db/wiseSaying/9.json create mode 100644 db/wiseSaying/create_dummy.sh create mode 100644 db/wiseSaying/lastId.txt create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts create mode 100644 src/main/java/com/ll/wiseSaying/App.java create mode 100644 src/main/java/com/ll/wiseSaying/Attribute.java create mode 100644 src/main/java/com/ll/wiseSaying/CommandLineMenu.java create mode 100644 src/main/java/com/ll/wiseSaying/FileUtil.java create mode 100644 src/main/java/com/ll/wiseSaying/Main.java create mode 100644 src/main/java/com/ll/wiseSaying/MenuOption.java create mode 100644 src/main/java/com/ll/wiseSaying/Status.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSaying.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingController.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingJSONMapper.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingJSONRepository.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingMapRepository.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingPage.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingReponse.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingRepository.java create mode 100644 src/main/java/com/ll/wiseSaying/WiseSayingService.java create mode 100644 src/test/java/com/ll/wiseSaying/WiseSayingServiceTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee354fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Created by https://www.toptal.com/developers/gitignore/api/java +# Edit at https://www.toptal.com/developers/gitignore?templates=java + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar +*.DS_Store + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# End of https://www.toptal.com/developers/gitignore/api/java \ No newline at end of file diff --git a/.gradle/8.2/checksums/checksums.lock b/.gradle/8.2/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..df380481acb05bc27d6f6163d45263695330763e GIT binary patch literal 17 TcmZSnDpeGQj&GXUs7@za)K^SDT30V*>MdVoBanFM^G#BxG;eGGrdk1&#XT51-!hug2raeOKEjt7dKmY** z5I_I{1Q0*~0R#|0009ILKmY**5cn?w3-&>J+{1)NI-HF^Wz4A0-uQM(&6<_4>P|Ig z=0N`+Sa;FI@^!2xJ)ym@{dkpJX_ehR+oip;@KLNB1vB#ely+|^A2{5P4@;ld9xTpT zo1v$)^py7grM02^t@xnybL|6tyLEt~s8(ke<;#nf7mFUs@IE$J%2j z+12Rs<*oFp_Vwqp>S-hAmHwbzuf}-B+ + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..30bab2a --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..f9163b4 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f5db0c5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 4444cb9..1b167af 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -# code-review \ No newline at end of file +## 기능 구현 +- 등록 / 수정 / 삭제 +- 페이징 조회 +- author / content 검색 +- 빌드 파일 내보내기 \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..4d1bf9c --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + id("java") +} + +group = "org.example" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(platform("org.junit:junit-bom:5.9.1")) + testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation("org.assertj:assertj-core:3.26.3") +} + +tasks.test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html b/build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html new file mode 100644 index 0000000..f65c58e --- /dev/null +++ b/build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html @@ -0,0 +1,134 @@ + + + + + +Test results - WiseSayingServiceTest + + + + + +
+

WiseSayingServiceTest

+ +
+ + + + + +
+
+ + + + + + + +
+
+
7
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.574s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Tests

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TestMethod nameDurationResult
명언을 등록할 수 있다addSayingTest()0.001spassed
명언을 ID로 삭제할 수 있다deleteSayingTest()0.066spassed
페이지 번호로 명언을 조회할 수 있다findPageWiseSayingTest()0.382spassed
명언을 ID로 검색할 수 있다findSayingTest()0.065spassed
명언을 ID로 수정할 수 있다modifySayingTest()0.055spassed
작가명으로 명언을 검색할 수 있다searchByAuthorTest()0.003spassed
명언의 내용으로 명언을 검색할 수 있다searchByContentTest()0.002spassed
+
+
+ +
+ + diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css new file mode 100644 index 0000000..4afa73e --- /dev/null +++ b/build/reports/tests/test/css/base-style.css @@ -0,0 +1,179 @@ + +body { + margin: 0; + padding: 0; + font-family: sans-serif; + font-size: 12pt; +} + +body, a, a:visited { + color: #303030; +} + +#content { + padding-left: 50px; + padding-right: 50px; + padding-top: 30px; + padding-bottom: 30px; +} + +#content h1 { + font-size: 160%; + margin-bottom: 10px; +} + +#footer { + margin-top: 100px; + font-size: 80%; + white-space: nowrap; +} + +#footer, #footer a { + color: #a0a0a0; +} + +#line-wrapping-toggle { + vertical-align: middle; +} + +#label-for-line-wrapping-toggle { + vertical-align: middle; +} + +ul { + margin-left: 0; +} + +h1, h2, h3 { + white-space: nowrap; +} + +h2 { + font-size: 120%; +} + +ul.tabLinks { + padding-left: 0; + padding-top: 10px; + padding-bottom: 10px; + overflow: auto; + min-width: 800px; + width: auto !important; + width: 800px; +} + +ul.tabLinks li { + float: left; + height: 100%; + list-style: none; + padding-left: 10px; + padding-right: 10px; + padding-top: 5px; + padding-bottom: 5px; + margin-bottom: 0; + -moz-border-radius: 7px; + border-radius: 7px; + margin-right: 25px; + border: solid 1px #d4d4d4; + background-color: #f0f0f0; +} + +ul.tabLinks li:hover { + background-color: #fafafa; +} + +ul.tabLinks li.selected { + background-color: #c5f0f5; + border-color: #c5f0f5; +} + +ul.tabLinks a { + font-size: 120%; + display: block; + outline: none; + text-decoration: none; + margin: 0; + padding: 0; +} + +ul.tabLinks li h2 { + margin: 0; + padding: 0; +} + +div.tab { +} + +div.selected { + display: block; +} + +div.deselected { + display: none; +} + +div.tab table { + min-width: 350px; + width: auto !important; + width: 350px; + border-collapse: collapse; +} + +div.tab th, div.tab table { + border-bottom: solid #d0d0d0 1px; +} + +div.tab th { + text-align: left; + white-space: nowrap; + padding-left: 6em; +} + +div.tab th:first-child { + padding-left: 0; +} + +div.tab td { + white-space: nowrap; + padding-left: 6em; + padding-top: 5px; + padding-bottom: 5px; +} + +div.tab td:first-child { + padding-left: 0; +} + +div.tab td.numeric, div.tab th.numeric { + text-align: right; +} + +span.code { + display: inline-block; + margin-top: 0em; + margin-bottom: 1em; +} + +span.code pre { + font-size: 11pt; + padding-top: 10px; + padding-bottom: 10px; + padding-left: 10px; + padding-right: 10px; + margin: 0; + background-color: #f7f7f7; + border: solid 1px #d0d0d0; + min-width: 700px; + width: auto !important; + width: 700px; +} + +span.wrapped pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: break-all; +} + +label.hidden { + display: none; +} \ No newline at end of file diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css new file mode 100644 index 0000000..3dc4913 --- /dev/null +++ b/build/reports/tests/test/css/style.css @@ -0,0 +1,84 @@ + +#summary { + margin-top: 30px; + margin-bottom: 40px; +} + +#summary table { + border-collapse: collapse; +} + +#summary td { + vertical-align: top; +} + +.breadcrumbs, .breadcrumbs a { + color: #606060; +} + +.infoBox { + width: 110px; + padding-top: 15px; + padding-bottom: 15px; + text-align: center; +} + +.infoBox p { + margin: 0; +} + +.counter, .percent { + font-size: 120%; + font-weight: bold; + margin-bottom: 8px; +} + +#duration { + width: 125px; +} + +#successRate, .summaryGroup { + border: solid 2px #d0d0d0; + -moz-border-radius: 10px; + border-radius: 10px; +} + +#successRate { + width: 140px; + margin-left: 35px; +} + +#successRate .percent { + font-size: 180%; +} + +.success, .success a { + color: #008000; +} + +div.success, #successRate.success { + background-color: #bbd9bb; + border-color: #008000; +} + +.failures, .failures a { + color: #b60808; +} + +.skipped, .skipped a { + color: #c09853; +} + +div.failures, #successRate.failures { + background-color: #ecdada; + border-color: #b60808; +} + +ul.linkList { + padding-left: 0; +} + +ul.linkList li { + list-style: none; + margin-bottom: 5px; +} diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html new file mode 100644 index 0000000..4b9e187 --- /dev/null +++ b/build/reports/tests/test/index.html @@ -0,0 +1,133 @@ + + + + + +Test results - Test Summary + + + + + +
+

Test Summary

+
+ + + + + +
+
+ + + + + + + +
+
+
7
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.574s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Packages

+ + + + + + + + + + + + + + + + + + + + + +
PackageTestsFailuresIgnoredDurationSuccess rate
+com.ll.wiseSaying +7000.574s100%
+
+
+

Classes

+ + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+com.ll.wiseSaying.WiseSayingServiceTest +7000.574s100%
+
+
+ +
+ + diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js new file mode 100644 index 0000000..83bab4a --- /dev/null +++ b/build/reports/tests/test/js/report.js @@ -0,0 +1,194 @@ +(function (window, document) { + "use strict"; + + var tabs = {}; + + function changeElementClass(element, classValue) { + if (element.getAttribute("className")) { + element.setAttribute("className", classValue); + } else { + element.setAttribute("class", classValue); + } + } + + function getClassAttribute(element) { + if (element.getAttribute("className")) { + return element.getAttribute("className"); + } else { + return element.getAttribute("class"); + } + } + + function addClass(element, classValue) { + changeElementClass(element, getClassAttribute(element) + " " + classValue); + } + + function removeClass(element, classValue) { + changeElementClass(element, getClassAttribute(element).replace(classValue, "")); + } + + function initTabs() { + var container = document.getElementById("tabs"); + + tabs.tabs = findTabs(container); + tabs.titles = findTitles(tabs.tabs); + tabs.headers = findHeaders(container); + tabs.select = select; + tabs.deselectAll = deselectAll; + tabs.select(0); + + return true; + } + + function getCheckBox() { + return document.getElementById("line-wrapping-toggle"); + } + + function getLabelForCheckBox() { + return document.getElementById("label-for-line-wrapping-toggle"); + } + + function findCodeBlocks() { + var spans = document.getElementById("tabs").getElementsByTagName("span"); + var codeBlocks = []; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].className.indexOf("code") >= 0) { + codeBlocks.push(spans[i]); + } + } + return codeBlocks; + } + + function forAllCodeBlocks(operation) { + var codeBlocks = findCodeBlocks(); + + for (var i = 0; i < codeBlocks.length; ++i) { + operation(codeBlocks[i], "wrapped"); + } + } + + function toggleLineWrapping() { + var checkBox = getCheckBox(); + + if (checkBox.checked) { + forAllCodeBlocks(addClass); + } else { + forAllCodeBlocks(removeClass); + } + } + + function initControls() { + if (findCodeBlocks().length > 0) { + var checkBox = getCheckBox(); + var label = getLabelForCheckBox(); + + checkBox.onclick = toggleLineWrapping; + checkBox.checked = false; + + removeClass(label, "hidden"); + } + } + + function switchTab() { + var id = this.id.substr(1); + + for (var i = 0; i < tabs.tabs.length; i++) { + if (tabs.tabs[i].id === id) { + tabs.select(i); + break; + } + } + + return false; + } + + function select(i) { + this.deselectAll(); + + changeElementClass(this.tabs[i], "tab selected"); + changeElementClass(this.headers[i], "selected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var h2 = document.createElement("H2"); + + h2.appendChild(document.createTextNode(this.titles[i])); + this.headers[i].appendChild(h2); + } + + function deselectAll() { + for (var i = 0; i < this.tabs.length; i++) { + changeElementClass(this.tabs[i], "tab deselected"); + changeElementClass(this.headers[i], "deselected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + var a = document.createElement("A"); + + a.setAttribute("id", "ltab" + i); + a.setAttribute("href", "#tab" + i); + a.onclick = switchTab; + a.appendChild(document.createTextNode(this.titles[i])); + + this.headers[i].appendChild(a); + } + } + + function findTabs(container) { + return findChildElements(container, "DIV", "tab"); + } + + function findHeaders(container) { + var owner = findChildElements(container, "UL", "tabLinks"); + return findChildElements(owner[0], "LI", null); + } + + function findTitles(tabs) { + var titles = []; + + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + var header = findChildElements(tab, "H2", null)[0]; + + header.parentNode.removeChild(header); + + if (header.innerText) { + titles.push(header.innerText); + } else { + titles.push(header.textContent); + } + } + + return titles; + } + + function findChildElements(container, name, targetClass) { + var elements = []; + var children = container.childNodes; + + for (var i = 0; i < children.length; i++) { + var child = children.item(i); + + if (child.nodeType === 1 && child.nodeName === name) { + if (targetClass && child.className.indexOf(targetClass) < 0) { + continue; + } + + elements.push(child); + } + } + + return elements; + } + + // Entry point. + + window.onload = function() { + initTabs(); + initControls(); + }; +} (window, window.document)); \ No newline at end of file diff --git a/build/reports/tests/test/packages/com.ll.wiseSaying.html b/build/reports/tests/test/packages/com.ll.wiseSaying.html new file mode 100644 index 0000000..aeda5a2 --- /dev/null +++ b/build/reports/tests/test/packages/com.ll.wiseSaying.html @@ -0,0 +1,103 @@ + + + + + +Test results - Package com.ll.wiseSaying + + + + + +
+

Package com.ll.wiseSaying

+ +
+ + + + + +
+
+ + + + + + + +
+
+
7
+

tests

+
+
+
+
0
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.574s
+

duration

+
+
+
+
+
+
100%
+

successful

+
+
+
+
+ +
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+WiseSayingServiceTest +7000.574s100%
+
+
+ +
+ + diff --git a/build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml b/build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml new file mode 100644 index 0000000..c17e5ce --- /dev/null +++ b/build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin new file mode 100644 index 0000000..e69de29 diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin new file mode 100644 index 0000000000000000000000000000000000000000..5aa9e6088e96fa58ebf1a8ca9294dc1fcd93f185 GIT binary patch literal 592 zcmZQ(WLlA&pR1RXqgS3;oEn^1nVFZa7Y=6zrxulECZ~p^7MD!JD$2mXIQirJ)2G=P zXQpN5r356Vry|sWv}tHgecLzV&DFw9&Z2A0VwsX3`7P(MQqod`3uMZwbrWZIjiwQm;8 zK{LY%>b8Cc)`=ibLqZLQ30Pg>2sPm%1KU)X?;J}@GV+Tcrc8b_Z{n*B4ItML(*`*sR%L=aY%KW3KbQ7p)r}P#Kk?3bf5`u?7ACPytGT(LHtC% zRuf~4;RE;;{4U0GCrM2tn)Lq9`JJA7?zs=&e||j$@EDs#EaGYbQ&=jHcTM85it7@} zQdXqgkg_VpRB=;9g`r|PCw}4$+wREp!Xr}%^Tdz2ds_@{A!{t?e-=Tj78+%(VP~cg9D39`)S5pvY`1^jxv$M!w{;;Ixyt-dkGhjEhb< zjy%5Y%NbgIG+IA&k6kKf2c8IHYN5@OVK`7xrT-lsCojS{QBl)z8+UX}N0Yu+n{7)QP#lpf`hn zM_a;;V;(aYY58vdkb4Qk{JC=(mi~_ad6xNOSBz!Jm1=Fj^{?C~bkOxigJJo9X=)e^ z{J<5Ho1v>xT1}_Nkl)>D)O$8L4ZCGaC-;1}*`kVy{kqvR%JgP*dPB@8$>WqBG|a#t zdy(h|vg85$3)tzm;wNN2$}jsFiqd@#<>dtPgt-(|!hDJvp_*cWP)o5$X#CFpfIJGA z!vbm3`GSnwCZ_c`O;*@_{d5>oArr8;nmZOEL&_*p`h6PB876mNd9EGnwhJ zQBHC~AcTb75Fp0_A!s2^7DE_}$r3i3V>ip@-XjOO$$gNMBoN5^-96JIYb+AW>i$*r z>;0pC{a@Ak+zY232e46H9>s3lsN?NXXt=QkL%2!DJEExa8aGS#JEi+wLfs;de~7aA zk2>Bhja#eno+upLCY`s-UBzy(@}5?ykWHagR_Rl7V~W zF)5?}ECct+!2R<0usn{-=tl(kqr&np)p#I^?Kly|gLp`KK30o|QPA;76zw=E+>Z)% zN~p(ld|clDT8(j;^>{T>GUpQ_=m~lJn>0Tu)V~Ykr=`Kv>9}cMW@eMp_B+GQSd!|`t01W>lOcL_&M~tNX_`imv-+<#kD48} znHufry(VsDoMbvhwz^@*j2{^=Gd^x8n@^FurHp;p$4Wzwk}jX9@+)xm=7 zwOlqaE^Q}*eucAVoW}{vJ-zcz((V{c59i}!y|y(@Jpz~M_^FPcDb#1oY|iR(=$ylO zhf1xhJcjW++Z;cfFq@}NXkM?dp_0EV$dw2k z@qm^fiKPw2UP@eB+h-4PQzVy#*wuOt12x>1vw0B z!kXg@v8~*`-kyvOr}NpkwJRw*u$tRwjYPac?Vy!&1}xd0IRh^Py|avQe_D3%*QmJJ z4IIGb3M;2G2GJQL90U7tnSr0<3IoH~XW$n?{Sv=2kN~x54EA0rEDby(s%S62(7>

Q<&l~s)UeNKP!91Z1rKymi!m7$p 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 Qy42V3b$r9``!>GwSG$B>#sB~S literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FileUtil.class.uniqueId4 b/build/tmp/compileJava/compileTransaction/stash-dir/FileUtil.class.uniqueId4 new file mode 100644 index 0000000000000000000000000000000000000000..b0a67c81524d6c6c3e9939bdb270f9f9900cf990 GIT binary patch literal 4218 zcma)9Yg-iO8NO#vGYo?W24$7tA;f^Nl8^)q7*oNRXjY^yN>S5v*d1YH+1bp_D)f{d z(xm5;J(;#in;z)FwwShHv^8x%$r?7@;IYnR!0*)uHq9qw&9bq{V5$s@M&@Sf?Pf$m(QyBoQ_uU)QZo`Wk$p= z*5C_xNkY7=;fo^qk{Ewk!&hYes*10v__~6`A-iCEhZRKIJI*SI4LUhXL4DdTSVQIM zamyVs$Mcjlrk$*rKWnIlfZJvipM90e)FIujZJ54W^tDrfkg0=&zc36o*{ifyZ;oIrzs|B>IH^mZQP=h)*?X3=5jTO9j%$jhOC*lk zR8hl>6c_^3h&AH{A@^<&azmsNVkglw2|esnDv`7DmM3^@MON_>`%OuEh$87&5W zfnQdNWI0u&GcbpgfnSOJujTR^{MNvATs81JsdQBm0W}Q#UV!)muBwx; zbpz+b@=th8L43bV6$5|9c?H|=KFx^c3O1+4FL7e55(OiTJ?3jIkF>jxhTN{TOXO^2 z@Nfp7)3Ja>d1c(>a5l5jZ%nB@_5FSq#-&9cr0fe!}%dzIZ%;NRPN?md2Xr zRE{pjw~~aJu)JY^rUs_P^}y)F;?da^5VJw?z%EDYdt6JT(R6iQ;^XJ zeQDJ8CRMy?;1=!}xPWK*(paIgUAXK_S>0)Wf^kfk7tQcpSUbJ)q~dR^E$ui{v51(rAFdm^6jTHk?Xq0{AHX>t-h^B8NHbzJBlU)l)T*HyBTMWlpq79|q z#>1&QuVR0yFP4nm>5WHw6HSSx`0Hp%#+nj6eQIY?y@{GPp+_+KVnUf)`gi9%eaHNK z_A)M@Gg>Vg_+{G6Z^}KWXGxoJl#*etXZfWn`96X;WdmX$8MvR2pL4Ej`y1crTRr|7N8o&hTcYFXKDeBH?f7+(YdAnQhv`I znudb4wl9`S#ul(O_0}9TF>3ByKym@w=UG@Y%Ra#353-~uxN10#G(Xp)K6Lw-5RjyF z2Q}{{6I!XiixxYmw}+a$aFWswqiq?!Ry5*iLM6T*qSgr(c9KW&47DRt4xf6tYP1@{ zsSvDgXz!v~MXiduZO2qJEfIer#$ORp0EHLz9VmoyTa0HqOa}o{Lkvc);7m1#b_j3k ziA>8Y(74js^-^FVrilpg2N zHZfG1nO9Ki;o$=vOsSL9>LOk#AE$QKzn{eKB{peN>J;feOiGRT5|B0tdTzsMWQb1< z27P2A^l{kNiBfw7w=*FDStkGWg}7y)zKhlXswHL=_gO{41=zLvs4dZXV$DVcQEiE* z5(zdTH1)APi_s9<3rsS>@@7_8xYDOB*KmP^+H*~y56Ic|2JTx#8~Hgz&>P13VnR>> zxUup6fS~{31_|0sV){3R96&NIu*V3yA%@M$yfQC56_WOlJf{i!2)pn+*PWQarDgd0 z2p9;CMo=0^3KPZ$3oJ^X!$6k zoM6-`%7wJj{WGL((EUY%FQjdtPa$%|@AY2PyoVm2s|3ETIbg6B9tRmL(q+isK}3K~ z@Y9FiaOVT0k!K`nkk$%|)2yEe*K;Al8kfD-qt~esG-o5p0p=o|u#LUYLK;auTLUj) z#x=xC@(gB@2IYTfVLF?2d54CP4+{losWZd_jqMBQkSNvDd{dQY9UrAX`O)#5PsAub e#-|8O{MDB#xQ(~)7dFBKpJg&mGH077VE-RxEZq_S literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 new file mode 100644 index 0000000000000000000000000000000000000000..d1dc45d8df0445198aca6be1040b8f8581b56b5c GIT binary patch literal 554 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 VYMU9;rgaIpY?~5M5kvg^e*s;6%B%nY literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingJSONRepository.class.uniqueId3 b/build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingJSONRepository.class.uniqueId3 new file mode 100644 index 0000000000000000000000000000000000000000..3a83120f6ba42946ed7034cbb5c2dc8b03272d57 GIT binary patch literal 7629 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 literal 0 HcmV?d00001 diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..a0221e16afc95aee69000ec0eb3bf83acb8c3aa8 GIT binary patch literal 1097 zcmYk5Urbw79LIm>Zlgfy<zUOKhoU;E>eDPdwq!;xHJfS@3iEh~a~J~}Q8@>Ke6IQ09<^|j=crpv($5zzYg zyNO~sE5w&TN)kd;YsY8FQHEOn*>t;Lqk1xbnur{fY&4fJ`<6_zu1Z*M2) z&OhIMrJNxuAQcqC)Q7ssbybRWzWQLWvv0rST&0h!lKYC0aEzx;B>HPU$Yi7r&o>pO zME$1DK~%%6C{hF8dgtHUSY1i1B(=i(UbUV%(0$NF)WCdXY%CZas+IQ^=G7GAVBy!g zLg(Ax8(gZ9Rh6NKtdsi=^VH5v{jI6*ZjP$NJ0C3`ueKR|_1?$WL)_yYGG87hSd{k= z6QoEqK_$d@^pigY-pI_ixB2>OCmNXgM)^)fk&jYa%lEF{TsXY7wzOSzwztA*c99qs zBVj2T358^TbLiu*Vskgvf6?4pjnh{?w{S!gq@|z~k5L=@mfpnYuc`jqxmRY~I*@Di zJ;9L8FdGz2)a$K=Lsi$xFaM^^)js&zIo{$UO;mNJ`K`a1#!oXB?yPVB_*xE08Jgn9 z{z(?5zihw0E*-7^!d9ny5@xKF|2}W^8~<`TH2-e?puc~l(1HlF4pl-aLONuI76f}V zRwIyEoZFzWwp8j3MyT9%4G5X{%FGCW2%8Q-i;x^^WDKA~M7a$>FQ)<+71W^EW`)?4 z8K&Wp@u-+avQg5CpYpYNpJoqp?H)UKBtTn^at@2rlB3Ga%ct^`Cvd^sNN_wTrz7Jr z+|lLs*-f308WTgVEPJM_rLzmWmAJ)&pLN->5}Ug*!+G8IVix9t<9sv=i5~8`fUl0@ zdfj9(D>vZ$_<09it#~?H0QYhBBBff>kB|FbaMQ&liqyV{PxuFV>67xuiAlTclt0)@ zoGdww2OV^ol2tl{dG-u5?4oPb1qwOK3d})u!3ZAphumY{FdN}S51l>M!-dcJqwbhj zV&mMnhuGy4c#>&rRLUC?_$79Vp&zaWFXQt*dzE5UUceW9(}=M*n-pzLB0Pf_xi?TGKX*)G4rT;P%QHDi??Mg&uUj_aL6%r#? literal 0 HcmV?d00001 diff --git a/build/tmp/compileTestJava/previous-compilation-data.bin b/build/tmp/compileTestJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..5a73750e8d94e5d5529d0d11ac5e343e181f1871 GIT binary patch literal 25002 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 literal 0 HcmV?d00001 diff --git a/db/wiseSaying/1.json b/db/wiseSaying/1.json new file mode 100644 index 0000000..6b6eda8 --- /dev/null +++ b/db/wiseSaying/1.json @@ -0,0 +1,5 @@ +{ + "id": 1, + "author": "Albert Einstein", + "content": "Life is like riding a bicycle. To keep your balance, you must keep moving." +} diff --git a/db/wiseSaying/10.json b/db/wiseSaying/10.json new file mode 100644 index 0000000..0397da3 --- /dev/null +++ b/db/wiseSaying/10.json @@ -0,0 +1,5 @@ +{ + "id": 10, + "author": "Aristotle", + "content": "Knowing yourself is the beginning of all wisdom." +} diff --git a/db/wiseSaying/11.json b/db/wiseSaying/11.json new file mode 100644 index 0000000..3be6545 --- /dev/null +++ b/db/wiseSaying/11.json @@ -0,0 +1,5 @@ +{ + "id": 11, + "author": "Maya Angelou", + "content": "You may not control all the events that happen to you, but you can decide not to be reduced by them." +} diff --git a/db/wiseSaying/12.json b/db/wiseSaying/12.json new file mode 100644 index 0000000..8b9c4d8 --- /dev/null +++ b/db/wiseSaying/12.json @@ -0,0 +1,5 @@ +{ + "id": 12, + "author": "John Lennon", + "content": "Life is what happens when you’re busy making other plans." +} diff --git a/db/wiseSaying/13.json b/db/wiseSaying/13.json new file mode 100644 index 0000000..be23083 --- /dev/null +++ b/db/wiseSaying/13.json @@ -0,0 +1,5 @@ +{ + "id": 13, + "author": "Vincent Van Gogh", + "content": "I dream my painting and I paint my dream." +} diff --git a/db/wiseSaying/14.json b/db/wiseSaying/14.json new file mode 100644 index 0000000..84666b2 --- /dev/null +++ b/db/wiseSaying/14.json @@ -0,0 +1,5 @@ +{ + "id": 14, + "author": "Albert Einstein", + "content": "Imagination is more important than knowledge." +} diff --git a/db/wiseSaying/15.json b/db/wiseSaying/15.json new file mode 100644 index 0000000..b329166 --- /dev/null +++ b/db/wiseSaying/15.json @@ -0,0 +1,5 @@ +{ + "id": 15, + "author": "Leonardo da Vinci", + "content": "Learning never exhausts the mind." +} diff --git a/db/wiseSaying/16.json b/db/wiseSaying/16.json new file mode 100644 index 0000000..7748612 --- /dev/null +++ b/db/wiseSaying/16.json @@ -0,0 +1,5 @@ +{ + "id": 16, + "author": "Yoda", + "content": "Do, or do not. There is no try." +} diff --git a/db/wiseSaying/2.json b/db/wiseSaying/2.json new file mode 100644 index 0000000..490a27d --- /dev/null +++ b/db/wiseSaying/2.json @@ -0,0 +1,5 @@ +{ + "id": 2, + "author": "Oscar Wilde", + "content": "Be yourself; everyone else is already taken." +} diff --git a/db/wiseSaying/3.json b/db/wiseSaying/3.json new file mode 100644 index 0000000..f9a23ae --- /dev/null +++ b/db/wiseSaying/3.json @@ -0,0 +1,5 @@ +{ + "id": 3, + "author": "Nelson Mandela", + "content": "It always seems impossible until it’s done." +} diff --git a/db/wiseSaying/4.json b/db/wiseSaying/4.json new file mode 100644 index 0000000..f1a0b82 --- /dev/null +++ b/db/wiseSaying/4.json @@ -0,0 +1,5 @@ +{ + "id": 4, + "author": "Mahatma Gandhi", + "content": "Be the change that you wish to see in the world." +} diff --git a/db/wiseSaying/5.json b/db/wiseSaying/5.json new file mode 100644 index 0000000..4da70f7 --- /dev/null +++ b/db/wiseSaying/5.json @@ -0,0 +1,5 @@ +{ + "id": 5, + "author": "Steve Jobs", + "content": "Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work." +} diff --git a/db/wiseSaying/6.json b/db/wiseSaying/6.json new file mode 100644 index 0000000..6a3eb78 --- /dev/null +++ b/db/wiseSaying/6.json @@ -0,0 +1,5 @@ +{ + "id": 6, + "author": "Walt Disney", + "content": "The way to get started is to quit talking and begin doing." +} diff --git a/db/wiseSaying/7.json b/db/wiseSaying/7.json new file mode 100644 index 0000000..056ad54 --- /dev/null +++ b/db/wiseSaying/7.json @@ -0,0 +1,5 @@ +{ + "id": 7, + "author": "Confucius", + "content": "Our greatest glory is not in never falling, but in rising every time we fall." +} diff --git a/db/wiseSaying/8.json b/db/wiseSaying/8.json new file mode 100644 index 0000000..f832953 --- /dev/null +++ b/db/wiseSaying/8.json @@ -0,0 +1,5 @@ +{ + "id": 8, + "author": "Eleanor Roosevelt", + "content": "The future belongs to those who believe in the beauty of their dreams." +} diff --git a/db/wiseSaying/9.json b/db/wiseSaying/9.json new file mode 100644 index 0000000..a8237f1 --- /dev/null +++ b/db/wiseSaying/9.json @@ -0,0 +1,5 @@ +{ + "id": 9, + "author": "Mark Twain", + "content": "The secret of getting ahead is getting started." +} diff --git a/db/wiseSaying/create_dummy.sh b/db/wiseSaying/create_dummy.sh new file mode 100644 index 0000000..fdbb838 --- /dev/null +++ b/db/wiseSaying/create_dummy.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +create_wise_saying_json() { + local id=$1 + local author=$2 + local content=$3 + + echo "{ + \"id\": $id, + \"author\": \"$author\", + \"content\": \"$content\" +}" > "$id.json" + + echo "Saved: $id.json" +} + +create_dummy() { + create_wise_saying_json 1 "Albert Einstein" "Life is like riding a bicycle. To keep your balance, you must keep moving." + create_wise_saying_json 2 "Oscar Wilde" "Be yourself; everyone else is already taken." + create_wise_saying_json 3 "Nelson Mandela" "It always seems impossible until it’s done." + create_wise_saying_json 4 "Mahatma Gandhi" "Be the change that you wish to see in the world." + create_wise_saying_json 5 "Steve Jobs" "Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work." + create_wise_saying_json 6 "Walt Disney" "The way to get started is to quit talking and begin doing." + create_wise_saying_json 7 "Confucius" "Our greatest glory is not in never falling, but in rising every time we fall." + create_wise_saying_json 8 "Eleanor Roosevelt" "The future belongs to those who believe in the beauty of their dreams." + create_wise_saying_json 9 "Mark Twain" "The secret of getting ahead is getting started." + create_wise_saying_json 10 "Aristotle" "Knowing yourself is the beginning of all wisdom." + create_wise_saying_json 11 "Maya Angelou" "You may not control all the events that happen to you, but you can decide not to be reduced by them." + create_wise_saying_json 12 "John Lennon" "Life is what happens when you’re busy making other plans." + create_wise_saying_json 13 "Vincent Van Gogh" "I dream my painting and I paint my dream." + create_wise_saying_json 14 "Albert Einstein" "Imagination is more important than knowledge." + create_wise_saying_json 15 "Leonardo da Vinci" "Learning never exhausts the mind." + create_wise_saying_json 16 "Yoda" "Do, or do not. There is no try." +} + +create_dummy diff --git a/db/wiseSaying/lastId.txt b/db/wiseSaying/lastId.txt new file mode 100644 index 0000000..8e2afd3 --- /dev/null +++ b/db/wiseSaying/lastId.txt @@ -0,0 +1 @@ +17 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..d6b0b1c --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Dec 19 10:24:23 KST 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..df2353a --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "saying" + diff --git a/src/main/java/com/ll/wiseSaying/App.java b/src/main/java/com/ll/wiseSaying/App.java new file mode 100644 index 0000000..8ec1b56 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/App.java @@ -0,0 +1,197 @@ +package com.ll.wiseSaying; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +import static com.ll.wiseSaying.Status.*; + +public class App { + private static boolean ON_RUN = true; + + private WiseSayingController wiseSayingController; + private CommandLineMenu cli; + + public App() { + cli = new CommandLineMenu(); + wiseSayingController = new WiseSayingController(); + } + + public void startApp() { + cli.printWelcomeGreeting(); + while (ON_RUN) { + cli.printCmdInputInfo(); + try { + run(cli.cmdInput()); + } catch (Exception e) { + cli.printFailedInfo(); + } + } + } + + public void run(final String input) { + String[] command = input.split("\\?"); + if (invalidCommand(command)) return; + handleCommand(command); + } + + private void handleCommand(final String[] command) { + switch (MenuOption.findOptionByCommand(command[0])) { + case ADD: + runAddCommand(command); + break; + + case LIST: + runListCommand(command); + break; + + case UPDATE: + runUpdateCommand(command); + break; + + case DELETE: + runDeleteCommand(command); + break; + + case BUILD: + cli.printBuildCompleteInfo(wiseSayingController.build()); + break; + + case EXIT: + cli.printExitInfo(); + ON_RUN = false; + break; + + default: + cli.printInvalidCmdInfo(); + break; + } + } + + private void runDeleteCommand(String[] command) { + WiseSayingReponse response; + if (command.length == 2) { + response = wiseSayingController.delete(parseAttribute(command[1])); + if (response.getStatus() == DELETE_SUCCESS) { + cli.printDeletedInfo(response.getRecentID()); + return; + } + if (response.getStatus() == ID_NOT_FOUND) { + cli.printIDNotFoundInfo(response.getRecentID()); + return; + } + cli.printFailedInfo(); + return; + } + cli.printInvalidCmdInfo(); + return; + } + + private void runUpdateCommand(String[] command) { + WiseSayingReponse response; + String content; + String author; + if (command.length == 2) { + try { + WiseSaying oldWiseSaying = wiseSayingController + .findWiseSayingByID(Long.valueOf(parseAttribute(command[1]).get("id"))) + .getWiseSayingList().get(0); + cli.printOldContent(oldWiseSaying.getContent()); + content = cli.inputContent(); + cli.printOldAuthor(oldWiseSaying.getAuthor()); + author = cli.inputAuthor(); + } catch (NoSuchElementException e) { + cli.printIDNotFoundInfo(Long.valueOf(parseAttribute(command[1]).get("id"))); + return; + } catch (Exception e) { + cli.printFailedInfo(); + return; + } + response = wiseSayingController.update(parseAttribute(command[1]) + .add("content", content) + .add("author", author) + ); + if (response.getStatus() == ID_NOT_FOUND) { + cli.printIDNotFoundInfo(response.getRecentID()); + return; + } + if (response.getStatus() == UPDATE_SUCCESS) { + return; + } + cli.printFailedInfo(); + return; + } + cli.printInvalidCmdInfo(); + } + + private void runListCommand(String[] command) { + WiseSayingReponse response; + if (command.length == 1) { + response = wiseSayingController.list(); + if (response.getStatus() == LIST_SUCCESS) { + cli.printWiseSayingList( + response.getWiseSayingList(), + response.getCurrentPage(), + response.getTotalPage() + ); + return; + } + cli.printFailedInfo(); + return; + } + if (command.length == 2) { + response = wiseSayingController.list(parseAttribute(command[1])); + if (response.getStatus() == LIST_SUCCESS) { + cli.printWiseSayingList( + response.getWiseSayingList(), + response.getCurrentPage(), + response.getTotalPage() + ); + return; + } + cli.printFailedInfo(); + return; + } + cli.printInvalidCmdInfo(); + } + + private void runAddCommand(String[] command) { + WiseSayingReponse response; + String author; + String content; + if (command.length == 1) { + try { + content = cli.inputContent(); + author = cli.inputAuthor(); + } catch (Exception e) { + cli.printFailedInfo(); + return; + } + response = wiseSayingController.add(content, author); + if (response.getStatus() == ADD_SUCCESS) { + cli.printAdddedInfo(response.getRecentID()); + return; + } + cli.printFailedInfo(); + return; + } + cli.printInvalidCmdInfo(); + } + + private Attribute parseAttribute(final String command) { + Attribute attribute = new Attribute(); + Arrays.stream(command.split("&")) + .map(param -> param.split("=", 2)) + .filter(parts -> parts.length == 2) + .forEach(parts -> attribute.add(parts[0], parts[1])); + return attribute; + } + + private boolean invalidCommand(final String[] command) { + if (!Arrays.stream(MenuOption.values()) + .anyMatch(option -> option.getCommand().equals(command[0]))) { + cli.printInvalidCmdInfo(); + return true; + } + return false; + } +} diff --git a/src/main/java/com/ll/wiseSaying/Attribute.java b/src/main/java/com/ll/wiseSaying/Attribute.java new file mode 100644 index 0000000..1ff4bd7 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/Attribute.java @@ -0,0 +1,25 @@ +package com.ll.wiseSaying; + +import java.util.HashMap; +import java.util.Map; + +public class Attribute { + private Map attributeMap; + + public Attribute() { + attributeMap = new HashMap<>(); + } + + public Attribute add(String name, String value) { + attributeMap.put(name, value); + return this; + } + + public String get(final String name) { + return attributeMap.get(name); + } + + public boolean has(final String name) { + return attributeMap.containsKey(name); + } +} diff --git a/src/main/java/com/ll/wiseSaying/CommandLineMenu.java b/src/main/java/com/ll/wiseSaying/CommandLineMenu.java new file mode 100644 index 0000000..88724f0 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/CommandLineMenu.java @@ -0,0 +1,100 @@ +package com.ll.wiseSaying; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.List; + +public class CommandLineMenu { + private final String APP_WELCOME_GREETING = "== 명언 앱 =="; + private final String CMD_INPUT_INFO = "명령) "; + private final String CONTENT_INPUT_INFO = "명언 : "; + private final String AUTHOR_INPUT_INFO = "작가 : "; + private final String EXIT_INFO = "종료합니다."; + private final String INVALID_CMD_INFO = "잘못된 입력입니다."; + private final String ADDED_INFO = "번 명언이 등록되었습니다."; + private final String FAILED_INFO = "작업을 실패했습니다."; + private final String ID_NOT_FOUND_INFO = "번 명언은 존재하지 않습니다."; + private final String DELETED_INFO = "번 명언이 삭제되었습니다."; + private final String LIST_INFO_FORE = "번호 / 작가 / 명언\n"; + private final String BOUNDARY_LINE = "----------------------"; + private final String OLD_CONTENT_INFO = "명언(기존) : "; + private final String OLD_AUTHOR_INFO = "작가(기존) : "; + private final String BUILD_COMPLETE_INFO = " 파일의 내용이 갱신되었습니다."; + + private BufferedReader bufferedReader; + + public CommandLineMenu() { + bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + } + + public void printWelcomeGreeting() { + System.out.println(APP_WELCOME_GREETING); + } + + public void printCmdInputInfo() { + System.out.print(CMD_INPUT_INFO); + } + + public String cmdInput() throws IOException { + return bufferedReader.readLine(); + } + + public String inputContent() throws IOException { + System.out.print(CONTENT_INPUT_INFO); + return bufferedReader.readLine(); + } + + public String inputAuthor() throws IOException { + System.out.print(AUTHOR_INPUT_INFO); + return bufferedReader.readLine(); + } + + public void printInvalidCmdInfo() { + System.out.println(INVALID_CMD_INFO); + } + + public void printExitInfo() { + System.out.println(EXIT_INFO); + } + + public void printAdddedInfo(Long id) { + System.out.println(id + ADDED_INFO); + } + + public void printFailedInfo() { + System.out.println(FAILED_INFO); + } + + public void printIDNotFoundInfo(final Long id) { + System.out.println(id + ID_NOT_FOUND_INFO); + } + + public void printDeletedInfo(final Long id) { + System.out.println(id + DELETED_INFO); + } + + public void printWiseSayingList(final List wiseSayingList, final Long currentPage, final Long maxPage) { + System.out.println(LIST_INFO_FORE + BOUNDARY_LINE); + for (WiseSaying wiseSaying : wiseSayingList) { + System.out.println( + wiseSaying.getId() + " / " + + wiseSaying.getAuthor() + " / " + + wiseSaying.getContent() + ); + } + System.out.println(BOUNDARY_LINE + "\n페이지 : " + currentPage + " / [" + maxPage + "]"); + } + + public void printOldContent(String oldContent) { + System.out.println(OLD_CONTENT_INFO + oldContent); + } + + public void printOldAuthor(String oldAuthor) { + System.out.println(OLD_AUTHOR_INFO + oldAuthor); + } + + public void printBuildCompleteInfo(final String buildFilename) { + System.out.println(buildFilename + BUILD_COMPLETE_INFO); + } +} diff --git a/src/main/java/com/ll/wiseSaying/FileUtil.java b/src/main/java/com/ll/wiseSaying/FileUtil.java new file mode 100644 index 0000000..436ff4c --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/FileUtil.java @@ -0,0 +1,85 @@ +package com.ll.wiseSaying; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +public class FileUtil { + public static List loadJSON(final String path) { + List outputs = new ArrayList<>(); + File directory = new File(path); + + if (directory.isDirectory()) { + File[] jsonFiles = directory.listFiles((dir, name) -> name.toLowerCase().endsWith(".json")); + if (jsonFiles != null && jsonFiles.length > 0) { + for (File jsonFile : jsonFiles) { + outputs.add(readFileContent(jsonFile)); + } + } + } + return outputs; + } + + private static String readFileContent(final File file) { + StringBuilder contentBuilder = new StringBuilder(); + + try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + contentBuilder.append(line).append(System.lineSeparator()); + } + } catch (IOException e) { + e.printStackTrace(); + } + + return contentBuilder.toString().trim(); + } + + public static void saveFile(final String path, final String content) { + try { + File file = new File(path); + + File parentDir = file.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + parentDir.mkdirs(); + } + + try (FileWriter fileWriter = new FileWriter(file)) { + fileWriter.write(content); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static String readTextFile(final String filePath) { + StringBuilder content = new StringBuilder(); + File file = new File(filePath); + + if (file.exists() && file.isFile()) { + try (BufferedReader reader = new BufferedReader(new FileReader(file, StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + content.append(line).append("\n"); + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } else { + // invalid file path + return null; + } + + return content.toString(); + } + + public static boolean delete(final String filePath) { + File file = new File(filePath); + if (file.exists() && file.isFile()) { + return file.delete(); + } + return false; + } +} diff --git a/src/main/java/com/ll/wiseSaying/Main.java b/src/main/java/com/ll/wiseSaying/Main.java new file mode 100644 index 0000000..276356b --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/Main.java @@ -0,0 +1,8 @@ +package com.ll.wiseSaying; + +public class Main { + public static void main(String[] args) { + App app = new App(); + app.startApp(); + } +} diff --git a/src/main/java/com/ll/wiseSaying/MenuOption.java b/src/main/java/com/ll/wiseSaying/MenuOption.java new file mode 100644 index 0000000..aeaf493 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/MenuOption.java @@ -0,0 +1,29 @@ +package com.ll.wiseSaying; + +import java.util.Arrays; + +public enum MenuOption { + ADD("등록"), + LIST("목록"), + UPDATE("수정"), + DELETE("삭제"), + BUILD("빌드"), + EXIT("종료"); + + private final String command; + + MenuOption(String command) { + this.command = command; + } + + static MenuOption findOptionByCommand(final String command) { + return Arrays.stream(MenuOption.values()) + .filter(option -> option.command.equals(command)) + .findAny() + .orElseThrow(() -> new IllegalStateException()); + } + + public String getCommand() { + return this.command; + } +} diff --git a/src/main/java/com/ll/wiseSaying/Status.java b/src/main/java/com/ll/wiseSaying/Status.java new file mode 100644 index 0000000..0a7d0fe --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/Status.java @@ -0,0 +1,10 @@ +package com.ll.wiseSaying; + +public enum Status { + LIST_SUCCESS, + ADD_SUCCESS, + UPDATE_SUCCESS, + DELETE_SUCCESS, + ID_NOT_FOUND, + FAILED; +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSaying.java b/src/main/java/com/ll/wiseSaying/WiseSaying.java new file mode 100644 index 0000000..f0a337b --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSaying.java @@ -0,0 +1,31 @@ +package com.ll.wiseSaying; + +public class WiseSaying { + private Long id; + private String author; + private String content; + + public Long getId() { + return id; + } + + public void setId(final Long id) { + this.id = id; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(final String author) { + this.author = author; + } + + public String getContent() { + return content; + } + + public void setContent(final String content) { + this.content = content; + } +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingController.java b/src/main/java/com/ll/wiseSaying/WiseSayingController.java new file mode 100644 index 0000000..c011a76 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingController.java @@ -0,0 +1,129 @@ +package com.ll.wiseSaying; + +import java.util.List; + +import static com.ll.wiseSaying.Status.*; + +public class WiseSayingController { + private static final int DEFAULT_PAGE = 1; + private static final String KEYWORD_TYPE = "keywordType"; + private static final String KEYWORD = "keyword"; + private static final String PAGE = "page"; + private static final String AUTHOR = "author"; + private static final String CONTENT = "content"; + private static final String ID = "id"; + private WiseSayingService wiseSayingService; + + public WiseSayingController() { + wiseSayingService = new WiseSayingService(new WiseSayingJSONRepository()); + } + + + public WiseSayingReponse add(final String content, final String author) { + WiseSaying wiseSaying = new WiseSaying(); + wiseSaying.setContent(content); + wiseSaying.setAuthor(author); + + return new WiseSayingReponse() + .recentID(wiseSayingService.addWiseSaying(wiseSaying).getId()) + .status(ADD_SUCCESS); + } + + public WiseSayingReponse list() { + return list(new Attribute().add(PAGE, String.valueOf(DEFAULT_PAGE))); + } + + public WiseSayingReponse list(final Attribute attribute) { + WiseSayingPage wiseSayingPage; + Long page = 1L; + if (attribute.has(PAGE)) { + if (!attribute.get(PAGE).matches("[0-9.]+")) { + return new WiseSayingReponse().status(FAILED); + } + page = Long.valueOf(attribute.get(PAGE)); + } + + if (attribute.has(KEYWORD_TYPE) && attribute.has(KEYWORD)) { + // search by author + if (attribute.get(KEYWORD_TYPE).equals(AUTHOR)) { + wiseSayingPage = wiseSayingService.findWiseSayingByAuthor(attribute.get(KEYWORD), page); + return new WiseSayingReponse() + .addWiseSayingList(wiseSayingPage.getWiseSayingList()) + .totalPage(wiseSayingPage.getTotalPage()) + .currentPage(wiseSayingPage.getCurrentPage()) + .status(LIST_SUCCESS); + } + // search by content + if (attribute.get(KEYWORD_TYPE).equals(CONTENT)) { + wiseSayingPage = wiseSayingService.findWiseSayingByContent(attribute.get(KEYWORD), page); + return new WiseSayingReponse() + .addWiseSayingList(wiseSayingPage.getWiseSayingList()) + .totalPage(wiseSayingPage.getTotalPage()) + .currentPage(wiseSayingPage.getCurrentPage()) + .status(LIST_SUCCESS); + } + } + wiseSayingPage = wiseSayingService.findWiseSayingPage(page); + return new WiseSayingReponse() + .addWiseSayingList(wiseSayingPage.getWiseSayingList()) + .totalPage(wiseSayingPage.getTotalPage()) + .currentPage(wiseSayingPage.getCurrentPage()) + .status(LIST_SUCCESS); + } + + public WiseSayingReponse update(final Attribute attribute) { + String id; + if (!attribute.has(ID) || !attribute.has(AUTHOR) || !attribute.has(CONTENT)) { + return new WiseSayingReponse().status(FAILED); + } + id = attribute.get(ID); + if (!id.matches("^\\d+$")) { + return new WiseSayingReponse().status(FAILED); + } + if (idExists(id)) return new WiseSayingReponse() + .recentID(Long.valueOf(id)) + .status(ID_NOT_FOUND); + + WiseSaying wiseSaying = new WiseSaying(); + wiseSaying.setContent(attribute.get(CONTENT)); + wiseSaying.setAuthor(attribute.get(AUTHOR)); + wiseSayingService.updateWiseSaying(Long.valueOf(id), wiseSaying); + return new WiseSayingReponse() + .recentID(Long.valueOf(id)) + .status(UPDATE_SUCCESS); + } + + public WiseSayingReponse delete(final Attribute attribute) { + String id; + if (!attribute.has(ID)) { + return new WiseSayingReponse().status(FAILED); + } + id = attribute.get(ID); + if (!id.matches("^\\d+$")) { + return new WiseSayingReponse().status(FAILED); + } + if (idExists(id)) return new WiseSayingReponse() + .recentID(Long.valueOf(id)) + .status(ID_NOT_FOUND); + return new WiseSayingReponse() + .recentID(wiseSayingService.deleteWiseSaying(Long.valueOf(id))) + .status(DELETE_SUCCESS); + } + + private boolean idExists(String id) { + try { + wiseSayingService.findWiseSayingByID(Long.valueOf(id)); + } catch (Exception e) { + return true; + } + return false; + } + + public WiseSayingReponse findWiseSayingByID(final Long id) throws Exception { + return new WiseSayingReponse().addWiseSayingList(List.of(wiseSayingService.findWiseSayingByID(id))); + } + + public String build() { + return wiseSayingService.build(); + } +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingJSONMapper.java b/src/main/java/com/ll/wiseSaying/WiseSayingJSONMapper.java new file mode 100644 index 0000000..d8d2820 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingJSONMapper.java @@ -0,0 +1,66 @@ +package com.ll.wiseSaying; + +import java.util.Map; +import java.util.stream.Collectors; + +public class WiseSayingJSONMapper { + + public WiseSaying toObject(final String wiseSayingJSON) { + WiseSaying wiseSaying = new WiseSaying(); + wiseSaying.setId(Long.valueOf(extractValue(wiseSayingJSON, "id"))); + wiseSaying.setAuthor(extractValue(wiseSayingJSON, "author")); + wiseSaying.setContent(extractValue(wiseSayingJSON, "content")); + return wiseSaying; + } + + public String toJSON(final WiseSaying wiseSaying) { + StringBuilder jsonBuilder = new StringBuilder(); + jsonBuilder.append("{"); + jsonBuilder.append("\"id\": ").append(wiseSaying.getId()).append(", "); + jsonBuilder.append("\"content\": \"").append(wiseSaying.getContent()).append("\", "); + jsonBuilder.append("\"author\": \"").append(wiseSaying.getAuthor()).append("\""); + jsonBuilder.append("}"); + return jsonBuilder.toString(); + } + + public String toJSON(final Map wiseSayingMap) { + StringBuilder jsonBuilder = new StringBuilder(); + jsonBuilder.append("["); + jsonBuilder.append(wiseSayingMap.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .map(Map.Entry::getValue) + .map(this::toJSON) + .collect(Collectors.joining(", "))); + jsonBuilder.append("]"); + return jsonBuilder.toString(); + } + + private String extractValue(final String json, final String key) { + String searchKey = "\"" + key + "\":"; + int start = json.indexOf(searchKey); + if (start == -1) { + return null; + } + start = json.indexOf(searchKey) + searchKey.length(); + + // string + if (json.charAt(start) == ' ') { + start++; + } + if (json.charAt(start) == '"') { + int end = start + 1; + while (end < json.length() && json.charAt(end) != '"') { + end++; + } + return json.substring(start + 1, end); + } + + // value + int end = json.indexOf(",", start); + if (end == -1) { + end = json.indexOf("}", start); + } + String value = json.substring(start, end).trim(); + return value; + } +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingJSONRepository.java b/src/main/java/com/ll/wiseSaying/WiseSayingJSONRepository.java new file mode 100644 index 0000000..38bc655 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingJSONRepository.java @@ -0,0 +1,142 @@ +package com.ll.wiseSaying; + +import java.util.*; +import java.util.stream.Collectors; + +public class WiseSayingJSONRepository implements WiseSayingRepository { + private static final String DATA_FILE_PATH = "db/wiseSaying/"; + private static final String LAST_ID_FILE = "lastId.txt"; + private static final String BUILD_FILE = "data.json"; + private WiseSayingJSONMapper wiseSayingJSONMapper; + private Map wiseSayingMap; + private long idCounter; + + public WiseSayingJSONRepository() { + wiseSayingMap = new HashMap<>(); + wiseSayingJSONMapper = new WiseSayingJSONMapper(); + idCounter = 1L; + loadJSON(); + } + + private void loadJSON() { + List wiseSayingJSONs = FileUtil.loadJSON(DATA_FILE_PATH); + String loadedIDCounter = FileUtil.readTextFile(DATA_FILE_PATH + LAST_ID_FILE); + if (loadedIDCounter != null && loadedIDCounter.matches("^\\d+$")) { + idCounter = Long.parseLong(loadedIDCounter); + } + for (String wiseSayingJSON : wiseSayingJSONs) { + WiseSaying wiseSaying = wiseSayingJSONMapper.toObject(wiseSayingJSON); + wiseSayingMap.put(wiseSaying.getId(), wiseSaying); + if (idCounter <= wiseSaying.getId()) { + idCounter = wiseSaying.getId() + 1; + } + FileUtil.saveFile(DATA_FILE_PATH + LAST_ID_FILE, String.valueOf(idCounter)); + } + } + + @Override + public WiseSaying save(final WiseSaying wiseSaying) { + wiseSaying.setId(idCounter); + FileUtil.saveFile( + DATA_FILE_PATH + wiseSaying.getId() + ".json", + wiseSayingJSONMapper.toJSON(wiseSaying) + ); + wiseSayingMap.put(idCounter++, wiseSaying); + FileUtil.saveFile(DATA_FILE_PATH + LAST_ID_FILE, String.valueOf(idCounter)); + return wiseSaying; + } + + @Override + public WiseSaying findById(final Long wiseSayingID) { + if (wiseSayingMap.containsKey(wiseSayingID)) { + return wiseSayingMap.get(wiseSayingID); + } + throw new NoSuchElementException("존재하지 않는 명언 ID를 조회했습니다."); + } + + @Override + public long delete(final Long wiseSayingID) { + FileUtil.delete(DATA_FILE_PATH + wiseSayingID + ".json"); + wiseSayingMap.remove(wiseSayingID); + return wiseSayingID; + } + + @Override + public WiseSaying update(final Long wiseSayingID, final WiseSaying wiseSaying) { + wiseSaying.setId(wiseSayingID); + FileUtil.saveFile( + DATA_FILE_PATH + wiseSayingID + ".json", + wiseSayingJSONMapper.toJSON(wiseSaying) + ); + wiseSayingMap.put(wiseSayingID, wiseSaying); + return wiseSaying; + } + + @Override + public WiseSayingPage findByAuthorName(final String searchAuthorKeyword, final Long page, final int pageSize) { + WiseSayingPage wiseSayingPage = new WiseSayingPage(); + wiseSayingPage.totalPage((wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getAuthor().contains(searchAuthorKeyword)) + .count() - 1) / pageSize + 1 + ); + wiseSayingPage.currentPage(page); + wiseSayingPage.addWiseSayingList(wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getAuthor().contains(searchAuthorKeyword)) + .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) + .skip((page - 1) * pageSize) + .limit(pageSize) + .map(Map.Entry::getValue) + .collect(Collectors.toUnmodifiableList()) + ); + return wiseSayingPage; + } + + @Override + public WiseSayingPage findByContent(final String searchContentKeyword, final Long page, final int pageSize) { + WiseSayingPage wiseSayingPage = new WiseSayingPage(); + wiseSayingPage.totalPage((wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getContent().contains(searchContentKeyword)) + .count() - 1) / pageSize + 1 + ); + wiseSayingPage.currentPage(page); + wiseSayingPage.addWiseSayingList(wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getContent().contains(searchContentKeyword)) + .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) + .skip((page - 1) * pageSize) + .limit(pageSize) + .map(Map.Entry::getValue) + .collect(Collectors.toUnmodifiableList()) + ); + return wiseSayingPage; + } + + @Override + public WiseSayingPage findPage(final Long page, final int pageSize) { + WiseSayingPage wiseSayingPage = new WiseSayingPage(); + wiseSayingPage.totalPage((wiseSayingMap.entrySet() + .stream() + .count() - 1) / pageSize + 1 + ); + + wiseSayingPage.currentPage(page); + wiseSayingPage.addWiseSayingList(wiseSayingMap.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) + .skip((page - 1) * pageSize) + .limit(pageSize) + .map(Map.Entry::getValue) + .collect(Collectors.toUnmodifiableList()) + ); + return wiseSayingPage; + } + + @Override + public String build() { + FileUtil.saveFile(BUILD_FILE, wiseSayingJSONMapper.toJSON(wiseSayingMap)); + return BUILD_FILE; + } +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingMapRepository.java b/src/main/java/com/ll/wiseSaying/WiseSayingMapRepository.java new file mode 100644 index 0000000..42ef49b --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingMapRepository.java @@ -0,0 +1,112 @@ +package com.ll.wiseSaying; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; + +public class WiseSayingMapRepository implements WiseSayingRepository { + private Map wiseSayingMap; + private long idCounter; + + public WiseSayingMapRepository() { + wiseSayingMap = new HashMap<>(); + idCounter = 1L; + } + + @Override + public WiseSaying save(final WiseSaying wiseSaying) { + wiseSaying.setId(idCounter); + wiseSayingMap.put(idCounter++, wiseSaying); + return wiseSaying; + } + + @Override + public WiseSaying findById(final Long wiseSayingID) { + if (wiseSayingMap.containsKey(wiseSayingID)) { + return wiseSayingMap.get(wiseSayingID); + } + throw new NoSuchElementException("존재하지 않는 명언 ID를 조회했습니다."); + } + + @Override + public long delete(final Long wiseSayingID) { + wiseSayingMap.remove(wiseSayingID); + return wiseSayingID; + } + + @Override + public WiseSaying update(final Long wiseSayingID, final WiseSaying wiseSaying) { + wiseSaying.setId(wiseSayingID); + wiseSayingMap.put(wiseSayingID, wiseSaying); + return wiseSaying; + } + + @Override + public WiseSayingPage findByAuthorName(final String searchAuthorKeyword, final Long page, final int pageSize) { + WiseSayingPage wiseSayingPage = new WiseSayingPage(); + wiseSayingPage.totalPage((wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getAuthor().contains(searchAuthorKeyword)) + .count() - 1) / pageSize + 1 + ); + wiseSayingPage.currentPage(page); + wiseSayingPage.addWiseSayingList(wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getAuthor().contains(searchAuthorKeyword)) + .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) + .skip((page - 1) * pageSize) + .limit(pageSize) + .map(Map.Entry::getValue) + .collect(Collectors.toUnmodifiableList()) + ); + return wiseSayingPage; + } + + @Override + public WiseSayingPage findByContent(final String searchContentKeyword, final Long page, final int pageSize) { + WiseSayingPage wiseSayingPage = new WiseSayingPage(); + wiseSayingPage.totalPage((wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getContent().contains(searchContentKeyword)) + .count() - 1) / pageSize + 1 + ); + wiseSayingPage.currentPage(page); + wiseSayingPage.addWiseSayingList(wiseSayingMap.entrySet() + .stream() + .filter(entry -> entry.getValue().getContent().contains(searchContentKeyword)) + .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) + .skip((page - 1) * pageSize) + .limit(pageSize) + .map(Map.Entry::getValue) + .collect(Collectors.toUnmodifiableList()) + ); + return wiseSayingPage; + } + + @Override + public WiseSayingPage findPage(final Long page, final int pageSize) { + WiseSayingPage wiseSayingPage = new WiseSayingPage(); + wiseSayingPage.totalPage((wiseSayingMap.entrySet() + .stream() + .count() - 1) / pageSize + 1 + ); + + wiseSayingPage.currentPage(page); + wiseSayingPage.addWiseSayingList(wiseSayingMap.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey(Comparator.reverseOrder())) + .skip((page - 1) * pageSize) + .limit(pageSize) + .map(Map.Entry::getValue) + .collect(Collectors.toUnmodifiableList()) + ); + return wiseSayingPage; + } + + @Override + public String build() { + return null; + } +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingPage.java b/src/main/java/com/ll/wiseSaying/WiseSayingPage.java new file mode 100644 index 0000000..d0359bf --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingPage.java @@ -0,0 +1,43 @@ +package com.ll.wiseSaying; + +import java.util.ArrayList; +import java.util.List; + +public class WiseSayingPage { + private List wiseSayingList; + private Long currentPage; + private Long totalPage; + + public WiseSayingPage() { + wiseSayingList = new ArrayList<>(); + currentPage = 0L; + totalPage = 0L; + } + + public List getWiseSayingList() { + return wiseSayingList; + } + + public WiseSayingPage addWiseSayingList(List wiseSayingList) { + this.wiseSayingList = wiseSayingList; + return this; + } + + public Long getCurrentPage() { + return currentPage; + } + + public WiseSayingPage currentPage(final long currentPage) { + this.currentPage = currentPage; + return this; + } + + public Long getTotalPage() { + return totalPage; + } + + public WiseSayingPage totalPage(final long maxPage) { + this.totalPage = maxPage; + return this; + } +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingReponse.java b/src/main/java/com/ll/wiseSaying/WiseSayingReponse.java new file mode 100644 index 0000000..1b3d747 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingReponse.java @@ -0,0 +1,63 @@ +package com.ll.wiseSaying; + +import java.util.ArrayList; +import java.util.List; + +public class WiseSayingReponse { + private Status status; + private List wiseSayingList; + private Long recentID; + private Long currentPage; + private Long totalPage; + + public WiseSayingReponse() { + status = Status.FAILED; + wiseSayingList = new ArrayList<>(); + recentID = 0L; + } + + public WiseSayingReponse status(final Status status) { + this.status = status; + return this; + } + + public WiseSayingReponse addWiseSayingList(final List wiseSayingList) { + this.wiseSayingList = wiseSayingList; + return this; + } + + public WiseSayingReponse recentID(final Long recentID) { + this.recentID = recentID; + return this; + } + + public WiseSayingReponse currentPage(final Long currentPage) { + this.currentPage = currentPage; + return this; + } + + public WiseSayingReponse totalPage(final Long totalPage) { + this.totalPage = totalPage; + return this; + } + + public Status getStatus() { + return status; + } + + public List getWiseSayingList() { + return wiseSayingList; + } + + public Long getRecentID() { + return recentID; + } + + public Long getCurrentPage() { + return currentPage; + } + + public Long getTotalPage() { + return totalPage; + } +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingRepository.java b/src/main/java/com/ll/wiseSaying/WiseSayingRepository.java new file mode 100644 index 0000000..c9caefd --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingRepository.java @@ -0,0 +1,12 @@ +package com.ll.wiseSaying; + +public interface WiseSayingRepository { + WiseSaying save (WiseSaying wiseSaying); + WiseSaying findById(Long id) throws Exception; + long delete(Long wiseSayingID); + WiseSaying update(Long wiseSayingID, WiseSaying wiseSaying); + WiseSayingPage findByAuthorName(String searchAuthorKeyword, Long page, int pageSize); + WiseSayingPage findByContent(String searchContentKeyword, Long page, int pageSize); + WiseSayingPage findPage(Long page, int pageSize); + String build(); +} diff --git a/src/main/java/com/ll/wiseSaying/WiseSayingService.java b/src/main/java/com/ll/wiseSaying/WiseSayingService.java new file mode 100644 index 0000000..602a696 --- /dev/null +++ b/src/main/java/com/ll/wiseSaying/WiseSayingService.java @@ -0,0 +1,56 @@ +package com.ll.wiseSaying; + +public class WiseSayingService { + private static final int DEFAULT_PAGE_SIZE = 5; + + private WiseSayingRepository wiseSayingRepository; + + public WiseSayingService(final WiseSayingRepository wiseSayingRepository) { + this.wiseSayingRepository = wiseSayingRepository; + } + + public WiseSaying addWiseSaying(final WiseSaying wiseSaying) { + return wiseSayingRepository.save(wiseSaying); + } + + public WiseSaying findWiseSayingByID(final Long wiseSayingID) throws Exception { + return wiseSayingRepository.findById(wiseSayingID); + } + + public long deleteWiseSaying(final Long wiseSayingID) { + wiseSayingRepository.delete(wiseSayingID); + return wiseSayingID; + } + + public WiseSaying updateWiseSaying(final Long wiseSayingID, final WiseSaying wiseSaying) { + return wiseSayingRepository.update(wiseSayingID, wiseSaying); + } + + public WiseSayingPage findWiseSayingByAuthor(final String searchAuthorKeyword, final Long page) { + return findWiseSayingByAuthor(searchAuthorKeyword, page, DEFAULT_PAGE_SIZE); + } + + public WiseSayingPage findWiseSayingByAuthor(final String searchAuthorKeyword, final Long page, final int pageSize) { + return wiseSayingRepository.findByAuthorName(searchAuthorKeyword, page, pageSize); + } + + public WiseSayingPage findWiseSayingByContent(final String searchContent, final Long page) { + return findWiseSayingByContent(searchContent, page, DEFAULT_PAGE_SIZE); + } + + public WiseSayingPage findWiseSayingByContent(final String searchContent, final Long page, final int pageSize) { + return wiseSayingRepository.findByContent(searchContent, page, pageSize); + } + + public WiseSayingPage findWiseSayingPage(final Long page) { + return findWiseSayingPage(page, DEFAULT_PAGE_SIZE); + } + + public WiseSayingPage findWiseSayingPage(final Long page, final int pageSize) { + return wiseSayingRepository.findPage(page, pageSize); + } + + public String build() { + return wiseSayingRepository.build(); + } +} diff --git a/src/test/java/com/ll/wiseSaying/WiseSayingServiceTest.java b/src/test/java/com/ll/wiseSaying/WiseSayingServiceTest.java new file mode 100644 index 0000000..2b53616 --- /dev/null +++ b/src/test/java/com/ll/wiseSaying/WiseSayingServiceTest.java @@ -0,0 +1,159 @@ +package com.ll.wiseSaying; + +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; + +class WiseSayingServiceTest { + SoftAssertions softAssertions; + private WiseSayingService wiseSayingService; + + private final String SAMPLE_AUTHOR1 = "작자미상"; + private final String SAMPLE_CONTENT1 = "과거에 집착하지 마라"; + private final String SAMPLE_AUTHOR2 = "키케로"; + private final String SAMPLE_CONTENT2 = "삶이 있는 한 희망은 있다"; + private final String SAMPLE_AUTHOR3 = "로버트 엘리엇"; + private final String SAMPLE_CONTENT3 = "피할 수 없으면 즐겨라"; + private final String SAMPLE_AUTHOR4 = "괴테"; + private final String SAMPLE_CONTENT4 = "꿈을 계속 간직하고 있으면 반드시 실현할 때가 온다"; + private final String SAMPLE_AUTHOR5 = "윈스턴 처칠"; + private final String SAMPLE_CONTENT5 = "계속해서 꾸준한 노력으로 잠재력을 실현하라"; + private final String SAMPLE_AUTHOR6 = "윈스턴 처칠"; + private final String SAMPLE_CONTENT6 = "성공은 결론이 아니며 실패는 치명적인 것이 아니다. 중요한 것은 그 과정을 지속하는 용기다"; + + @BeforeEach + void setUp() { + softAssertions = new SoftAssertions(); + wiseSayingService = new WiseSayingService(new WiseSayingMapRepository()); + } + + void setUpSampleWiseSaying() { + addNewWiseSaying(SAMPLE_AUTHOR1, SAMPLE_CONTENT1); + addNewWiseSaying(SAMPLE_AUTHOR2, SAMPLE_CONTENT2); + addNewWiseSaying(SAMPLE_AUTHOR3, SAMPLE_CONTENT3); + addNewWiseSaying(SAMPLE_AUTHOR4, SAMPLE_CONTENT4); + addNewWiseSaying(SAMPLE_AUTHOR5, SAMPLE_CONTENT5); + addNewWiseSaying(SAMPLE_AUTHOR6, SAMPLE_CONTENT6); + } + + private WiseSaying addNewWiseSaying(final String author, final String content) { + return wiseSayingService.addWiseSaying(craeteWiseSaying(author, content)); + } + + private WiseSaying craeteWiseSaying(final String author, final String content) { + WiseSaying wiseSaying = new WiseSaying(); + wiseSaying.setAuthor(author); + wiseSaying.setContent(content); + return wiseSaying; + } + + @Test + @DisplayName("명언을 등록할 수 있다") + void addSayingTest() { + WiseSaying givenWiseSaying = addNewWiseSaying(SAMPLE_AUTHOR1, SAMPLE_CONTENT1); + + WiseSaying foundWiseSaying = wiseSayingService.addWiseSaying(givenWiseSaying); + softAssertions.assertThat(foundWiseSaying.getAuthor()).isEqualTo(givenWiseSaying.getAuthor()); + softAssertions.assertThat(foundWiseSaying.getContent()).isEqualTo(givenWiseSaying.getContent()); + softAssertions.assertAll(); + } + + @Test + @DisplayName("명언을 ID로 검색할 수 있다") + void findSayingTest() throws Exception { + WiseSaying givenWiseSaying = addNewWiseSaying(SAMPLE_AUTHOR1, SAMPLE_CONTENT1); + WiseSaying savedWiseSaying = wiseSayingService.addWiseSaying(givenWiseSaying); + + WiseSaying foundWiseSaying = wiseSayingService.findWiseSayingByID(savedWiseSaying.getId()); + softAssertions.assertThat(foundWiseSaying.getAuthor()).isEqualTo(givenWiseSaying.getAuthor()); + softAssertions.assertThat(foundWiseSaying.getContent()).isEqualTo(givenWiseSaying.getContent()); + softAssertions.assertAll(); + } + + @Test + @DisplayName("명언을 ID로 삭제할 수 있다") + void deleteSayingTest() { + WiseSaying givenWiseSaying = addNewWiseSaying(SAMPLE_AUTHOR1, SAMPLE_CONTENT1); + WiseSaying savedWiseSaying = wiseSayingService.addWiseSaying(givenWiseSaying); + + wiseSayingService.deleteWiseSaying(savedWiseSaying.getId()); + softAssertions.assertThatThrownBy(() -> wiseSayingService.findWiseSayingByID(savedWiseSaying.getId())) + .isInstanceOf(NoSuchElementException.class) + .hasMessage("존재하지 않는 명언 ID를 조회했습니다."); + softAssertions.assertAll(); + } + + @Test + @DisplayName("명언을 ID로 수정할 수 있다") + void modifySayingTest() throws Exception { + WiseSaying givenWiseSaying = addNewWiseSaying(SAMPLE_AUTHOR1, SAMPLE_CONTENT1); + + String expectedAuthor = "홍길동"; + String expectedContent = "현재와 자신을 사랑하라."; + WiseSaying expectedWiseSaying = craeteWiseSaying(expectedAuthor, expectedContent); + + wiseSayingService.updateWiseSaying(givenWiseSaying.getId(), expectedWiseSaying); + softAssertions.assertThat(wiseSayingService.findWiseSayingByID(givenWiseSaying.getId())) + .usingRecursiveComparison(). + isEqualTo(expectedWiseSaying); + } + + @Test + @DisplayName("작가명으로 명언을 검색할 수 있다") + void searchByAuthorTest() throws Exception { + setUpSampleWiseSaying(); + String searchAuthorKeyword = "처칠"; + List expectedWiseSayingList = List.of( + wiseSayingService.findWiseSayingByID(6L), + wiseSayingService.findWiseSayingByID(5L) + ); + + List foundWiseSayingList = wiseSayingService.findWiseSayingByAuthor(searchAuthorKeyword, 1L) + .getWiseSayingList(); + + softAssertions.assertThat(foundWiseSayingList) + .usingRecursiveFieldByFieldElementComparator() + .containsExactlyElementsOf(expectedWiseSayingList); + softAssertions.assertAll(); + } + + @Test + @DisplayName("명언의 내용으로 명언을 검색할 수 있다") + void searchByContentTest() throws Exception { + setUpSampleWiseSaying(); + String searchContentKeyword = "실현"; + List expectedWiseSayingList = List.of( + wiseSayingService.findWiseSayingByID(5L), + wiseSayingService.findWiseSayingByID(4L) + ); + + List foundWiseSayingList = wiseSayingService.findWiseSayingByContent(searchContentKeyword, 1L) + .getWiseSayingList(); + + softAssertions.assertThat(foundWiseSayingList) + .usingRecursiveFieldByFieldElementComparator() + .containsExactlyElementsOf(expectedWiseSayingList); + softAssertions.assertAll(); + } + + @Test + @DisplayName("페이지 번호로 명언을 조회할 수 있다") + void findPageWiseSayingTest() throws Exception { + // GIVEN + setUpSampleWiseSaying(); + List expectedWiseSayingList = new ArrayList<>(); + for (Long id = 6L; id > 1L; id--) { + expectedWiseSayingList.add(wiseSayingService.findWiseSayingByID(id)); + } + + softAssertions.assertThat(wiseSayingService.findWiseSayingPage(1L).getWiseSayingList()) + .usingRecursiveFieldByFieldElementComparator() + .containsExactlyElementsOf(expectedWiseSayingList); + softAssertions.assertAll(); + } +} \ No newline at end of file From f8efae164ccdf13bb1293c739326f20b4443be98 Mon Sep 17 00:00:00 2001 From: Dongwoo Shin Date: Mon, 23 Dec 2024 14:10:12 +0900 Subject: [PATCH 2/3] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b167af..0426158 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,6 @@ - 등록 / 수정 / 삭제 - 페이징 조회 - author / content 검색 -- 빌드 파일 내보내기 \ No newline at end of file +- 빌드 파일 내보내기 +--- +- db/wiseSaying/create_dummy.sh 샘플 파일 생성 From c4d3af442039009c556610f0d83a5ee7dd0c6d28 Mon Sep 17 00:00:00 2001 From: socra167 Date: Tue, 7 Jan 2025 11:39:15 +0900 Subject: [PATCH 3/3] =?UTF-8?q?:fire:=20fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 +- .gradle/8.2/checksums/checksums.lock | Bin 17 -> 0 bytes .../dependencies-accessors.lock | Bin 17 -> 0 bytes .../8.2/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/8.2/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/8.2/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/8.2/gc.properties | 0 .../buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 - .gradle/buildOutputCleanup/outputFiles.bin | Bin 18713 -> 0 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 8 - .idea/.name | 1 - .idea/compiler.xml | 6 - .idea/discord.xml | 7 - .idea/gradle.xml | 15 -- .idea/jarRepositories.xml | 20 -- .idea/misc.xml | 5 - .idea/vcs.xml | 6 - ...m.ll.wiseSaying.WiseSayingServiceTest.html | 134 ------------ build/reports/tests/test/css/base-style.css | 179 ---------------- build/reports/tests/test/css/style.css | 84 -------- build/reports/tests/test/index.html | 133 ------------ build/reports/tests/test/js/report.js | 194 ------------------ .../test/packages/com.ll.wiseSaying.html | 103 ---------- ...om.ll.wiseSaying.WiseSayingServiceTest.xml | 13 -- build/test-results/test/binary/output.bin | 0 build/test-results/test/binary/output.bin.idx | Bin 1 -> 0 bytes build/test-results/test/binary/results.bin | Bin 592 -> 0 bytes .../stash-dir/App$1.class.uniqueId2 | Bin 875 -> 0 bytes .../stash-dir/App.class.uniqueId5 | Bin 7247 -> 0 bytes .../stash-dir/FileUtil.class.uniqueId4 | Bin 4218 -> 0 bytes .../stash-dir/Main.class.uniqueId1 | Bin 554 -> 0 bytes .../WiseSayingController.class.uniqueId0 | Bin 4731 -> 0 bytes .../WiseSayingJSONRepository.class.uniqueId3 | Bin 7629 -> 0 bytes .../compileJava/previous-compilation-data.bin | Bin 1097 -> 0 bytes .../previous-compilation-data.bin | Bin 25002 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 30 ++- gradlew.bat | 15 +- 41 files changed, 39 insertions(+), 927 deletions(-) delete mode 100644 .gradle/8.2/checksums/checksums.lock delete mode 100644 .gradle/8.2/dependencies-accessors/dependencies-accessors.lock delete mode 100644 .gradle/8.2/dependencies-accessors/gc.properties delete mode 100644 .gradle/8.2/executionHistory/executionHistory.lock delete mode 100644 .gradle/8.2/fileChanges/last-build.bin delete mode 100644 .gradle/8.2/fileHashes/fileHashes.lock delete mode 100644 .gradle/8.2/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 .gradle/vcs-1/gc.properties delete mode 100644 .idea/.gitignore delete mode 100644 .idea/.name delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/discord.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml delete mode 100644 build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html delete mode 100644 build/reports/tests/test/css/base-style.css delete mode 100644 build/reports/tests/test/css/style.css delete mode 100644 build/reports/tests/test/index.html delete mode 100644 build/reports/tests/test/js/report.js delete mode 100644 build/reports/tests/test/packages/com.ll.wiseSaying.html delete mode 100644 build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml delete mode 100644 build/test-results/test/binary/output.bin delete mode 100644 build/test-results/test/binary/output.bin.idx delete mode 100644 build/test-results/test/binary/results.bin delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/App$1.class.uniqueId2 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/App.class.uniqueId5 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/FileUtil.class.uniqueId4 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingController.class.uniqueId0 delete mode 100644 build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingJSONRepository.class.uniqueId3 delete mode 100644 build/tmp/compileJava/previous-compilation-data.bin delete mode 100644 build/tmp/compileTestJava/previous-compilation-data.bin diff --git a/.gitignore b/.gitignore index ee354fe..60ad9e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ # Created by https://www.toptal.com/developers/gitignore/api/java # Edit at https://www.toptal.com/developers/gitignore?templates=java +.idea/ +.gradle/ +build/ + ### Java ### # Compiled class file *.class @@ -28,4 +32,4 @@ hs_err_pid* replay_pid* -# End of https://www.toptal.com/developers/gitignore/api/java \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/java diff --git a/.gradle/8.2/checksums/checksums.lock b/.gradle/8.2/checksums/checksums.lock deleted file mode 100644 index df380481acb05bc27d6f6163d45263695330763e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZSnDpeGQj&GXUs7@za)K^SDT30V*>MdVoBanFM^G#BxG;eGGrdk1&#XT51-!hug2raeOKEjt7dKmY** z5I_I{1Q0*~0R#|0009ILKmY**5cn?w3-&>J+{1)NI-HF^Wz4A0-uQM(&6<_4>P|Ig z=0N`+Sa;FI@^!2xJ)ym@{dkpJX_ehR+oip;@KLNB1vB#ely+|^A2{5P4@;ld9xTpT zo1v$)^py7grM02^t@xnybL|6tyLEt~s8(ke<;#nf7mFUs@IE$J%2j z+12Rs<*oFp_Vwqp>S-hAmHwbzuf}-B+ - - - - - \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml deleted file mode 100644 index 30bab2a..0000000 --- a/.idea/discord.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index f9163b4..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index fdc392f..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index f5db0c5..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html b/build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html deleted file mode 100644 index f65c58e..0000000 --- a/build/reports/tests/test/classes/com.ll.wiseSaying.WiseSayingServiceTest.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -Test results - WiseSayingServiceTest - - - - - -

-

WiseSayingServiceTest

- -
- - - - - -
-
- - - - - - - -
-
-
7
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0.574s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Tests

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TestMethod nameDurationResult
명언을 등록할 수 있다addSayingTest()0.001spassed
명언을 ID로 삭제할 수 있다deleteSayingTest()0.066spassed
페이지 번호로 명언을 조회할 수 있다findPageWiseSayingTest()0.382spassed
명언을 ID로 검색할 수 있다findSayingTest()0.065spassed
명언을 ID로 수정할 수 있다modifySayingTest()0.055spassed
작가명으로 명언을 검색할 수 있다searchByAuthorTest()0.003spassed
명언의 내용으로 명언을 검색할 수 있다searchByContentTest()0.002spassed
-
-
- -
- - diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css deleted file mode 100644 index 4afa73e..0000000 --- a/build/reports/tests/test/css/base-style.css +++ /dev/null @@ -1,179 +0,0 @@ - -body { - margin: 0; - padding: 0; - font-family: sans-serif; - font-size: 12pt; -} - -body, a, a:visited { - color: #303030; -} - -#content { - padding-left: 50px; - padding-right: 50px; - padding-top: 30px; - padding-bottom: 30px; -} - -#content h1 { - font-size: 160%; - margin-bottom: 10px; -} - -#footer { - margin-top: 100px; - font-size: 80%; - white-space: nowrap; -} - -#footer, #footer a { - color: #a0a0a0; -} - -#line-wrapping-toggle { - vertical-align: middle; -} - -#label-for-line-wrapping-toggle { - vertical-align: middle; -} - -ul { - margin-left: 0; -} - -h1, h2, h3 { - white-space: nowrap; -} - -h2 { - font-size: 120%; -} - -ul.tabLinks { - padding-left: 0; - padding-top: 10px; - padding-bottom: 10px; - overflow: auto; - min-width: 800px; - width: auto !important; - width: 800px; -} - -ul.tabLinks li { - float: left; - height: 100%; - list-style: none; - padding-left: 10px; - padding-right: 10px; - padding-top: 5px; - padding-bottom: 5px; - margin-bottom: 0; - -moz-border-radius: 7px; - border-radius: 7px; - margin-right: 25px; - border: solid 1px #d4d4d4; - background-color: #f0f0f0; -} - -ul.tabLinks li:hover { - background-color: #fafafa; -} - -ul.tabLinks li.selected { - background-color: #c5f0f5; - border-color: #c5f0f5; -} - -ul.tabLinks a { - font-size: 120%; - display: block; - outline: none; - text-decoration: none; - margin: 0; - padding: 0; -} - -ul.tabLinks li h2 { - margin: 0; - padding: 0; -} - -div.tab { -} - -div.selected { - display: block; -} - -div.deselected { - display: none; -} - -div.tab table { - min-width: 350px; - width: auto !important; - width: 350px; - border-collapse: collapse; -} - -div.tab th, div.tab table { - border-bottom: solid #d0d0d0 1px; -} - -div.tab th { - text-align: left; - white-space: nowrap; - padding-left: 6em; -} - -div.tab th:first-child { - padding-left: 0; -} - -div.tab td { - white-space: nowrap; - padding-left: 6em; - padding-top: 5px; - padding-bottom: 5px; -} - -div.tab td:first-child { - padding-left: 0; -} - -div.tab td.numeric, div.tab th.numeric { - text-align: right; -} - -span.code { - display: inline-block; - margin-top: 0em; - margin-bottom: 1em; -} - -span.code pre { - font-size: 11pt; - padding-top: 10px; - padding-bottom: 10px; - padding-left: 10px; - padding-right: 10px; - margin: 0; - background-color: #f7f7f7; - border: solid 1px #d0d0d0; - min-width: 700px; - width: auto !important; - width: 700px; -} - -span.wrapped pre { - word-wrap: break-word; - white-space: pre-wrap; - word-break: break-all; -} - -label.hidden { - display: none; -} \ No newline at end of file diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css deleted file mode 100644 index 3dc4913..0000000 --- a/build/reports/tests/test/css/style.css +++ /dev/null @@ -1,84 +0,0 @@ - -#summary { - margin-top: 30px; - margin-bottom: 40px; -} - -#summary table { - border-collapse: collapse; -} - -#summary td { - vertical-align: top; -} - -.breadcrumbs, .breadcrumbs a { - color: #606060; -} - -.infoBox { - width: 110px; - padding-top: 15px; - padding-bottom: 15px; - text-align: center; -} - -.infoBox p { - margin: 0; -} - -.counter, .percent { - font-size: 120%; - font-weight: bold; - margin-bottom: 8px; -} - -#duration { - width: 125px; -} - -#successRate, .summaryGroup { - border: solid 2px #d0d0d0; - -moz-border-radius: 10px; - border-radius: 10px; -} - -#successRate { - width: 140px; - margin-left: 35px; -} - -#successRate .percent { - font-size: 180%; -} - -.success, .success a { - color: #008000; -} - -div.success, #successRate.success { - background-color: #bbd9bb; - border-color: #008000; -} - -.failures, .failures a { - color: #b60808; -} - -.skipped, .skipped a { - color: #c09853; -} - -div.failures, #successRate.failures { - background-color: #ecdada; - border-color: #b60808; -} - -ul.linkList { - padding-left: 0; -} - -ul.linkList li { - list-style: none; - margin-bottom: 5px; -} diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html deleted file mode 100644 index 4b9e187..0000000 --- a/build/reports/tests/test/index.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - -Test results - Test Summary - - - - - -
-

Test Summary

-
- - - - - -
-
- - - - - - - -
-
-
7
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0.574s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Packages

- - - - - - - - - - - - - - - - - - - - - -
PackageTestsFailuresIgnoredDurationSuccess rate
-com.ll.wiseSaying -7000.574s100%
-
-
-

Classes

- - - - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-com.ll.wiseSaying.WiseSayingServiceTest -7000.574s100%
-
-
- -
- - diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js deleted file mode 100644 index 83bab4a..0000000 --- a/build/reports/tests/test/js/report.js +++ /dev/null @@ -1,194 +0,0 @@ -(function (window, document) { - "use strict"; - - var tabs = {}; - - function changeElementClass(element, classValue) { - if (element.getAttribute("className")) { - element.setAttribute("className", classValue); - } else { - element.setAttribute("class", classValue); - } - } - - function getClassAttribute(element) { - if (element.getAttribute("className")) { - return element.getAttribute("className"); - } else { - return element.getAttribute("class"); - } - } - - function addClass(element, classValue) { - changeElementClass(element, getClassAttribute(element) + " " + classValue); - } - - function removeClass(element, classValue) { - changeElementClass(element, getClassAttribute(element).replace(classValue, "")); - } - - function initTabs() { - var container = document.getElementById("tabs"); - - tabs.tabs = findTabs(container); - tabs.titles = findTitles(tabs.tabs); - tabs.headers = findHeaders(container); - tabs.select = select; - tabs.deselectAll = deselectAll; - tabs.select(0); - - return true; - } - - function getCheckBox() { - return document.getElementById("line-wrapping-toggle"); - } - - function getLabelForCheckBox() { - return document.getElementById("label-for-line-wrapping-toggle"); - } - - function findCodeBlocks() { - var spans = document.getElementById("tabs").getElementsByTagName("span"); - var codeBlocks = []; - for (var i = 0; i < spans.length; ++i) { - if (spans[i].className.indexOf("code") >= 0) { - codeBlocks.push(spans[i]); - } - } - return codeBlocks; - } - - function forAllCodeBlocks(operation) { - var codeBlocks = findCodeBlocks(); - - for (var i = 0; i < codeBlocks.length; ++i) { - operation(codeBlocks[i], "wrapped"); - } - } - - function toggleLineWrapping() { - var checkBox = getCheckBox(); - - if (checkBox.checked) { - forAllCodeBlocks(addClass); - } else { - forAllCodeBlocks(removeClass); - } - } - - function initControls() { - if (findCodeBlocks().length > 0) { - var checkBox = getCheckBox(); - var label = getLabelForCheckBox(); - - checkBox.onclick = toggleLineWrapping; - checkBox.checked = false; - - removeClass(label, "hidden"); - } - } - - function switchTab() { - var id = this.id.substr(1); - - for (var i = 0; i < tabs.tabs.length; i++) { - if (tabs.tabs[i].id === id) { - tabs.select(i); - break; - } - } - - return false; - } - - function select(i) { - this.deselectAll(); - - changeElementClass(this.tabs[i], "tab selected"); - changeElementClass(this.headers[i], "selected"); - - while (this.headers[i].firstChild) { - this.headers[i].removeChild(this.headers[i].firstChild); - } - - var h2 = document.createElement("H2"); - - h2.appendChild(document.createTextNode(this.titles[i])); - this.headers[i].appendChild(h2); - } - - function deselectAll() { - for (var i = 0; i < this.tabs.length; i++) { - changeElementClass(this.tabs[i], "tab deselected"); - changeElementClass(this.headers[i], "deselected"); - - while (this.headers[i].firstChild) { - this.headers[i].removeChild(this.headers[i].firstChild); - } - - var a = document.createElement("A"); - - a.setAttribute("id", "ltab" + i); - a.setAttribute("href", "#tab" + i); - a.onclick = switchTab; - a.appendChild(document.createTextNode(this.titles[i])); - - this.headers[i].appendChild(a); - } - } - - function findTabs(container) { - return findChildElements(container, "DIV", "tab"); - } - - function findHeaders(container) { - var owner = findChildElements(container, "UL", "tabLinks"); - return findChildElements(owner[0], "LI", null); - } - - function findTitles(tabs) { - var titles = []; - - for (var i = 0; i < tabs.length; i++) { - var tab = tabs[i]; - var header = findChildElements(tab, "H2", null)[0]; - - header.parentNode.removeChild(header); - - if (header.innerText) { - titles.push(header.innerText); - } else { - titles.push(header.textContent); - } - } - - return titles; - } - - function findChildElements(container, name, targetClass) { - var elements = []; - var children = container.childNodes; - - for (var i = 0; i < children.length; i++) { - var child = children.item(i); - - if (child.nodeType === 1 && child.nodeName === name) { - if (targetClass && child.className.indexOf(targetClass) < 0) { - continue; - } - - elements.push(child); - } - } - - return elements; - } - - // Entry point. - - window.onload = function() { - initTabs(); - initControls(); - }; -} (window, window.document)); \ No newline at end of file diff --git a/build/reports/tests/test/packages/com.ll.wiseSaying.html b/build/reports/tests/test/packages/com.ll.wiseSaying.html deleted file mode 100644 index aeda5a2..0000000 --- a/build/reports/tests/test/packages/com.ll.wiseSaying.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -Test results - Package com.ll.wiseSaying - - - - - -
-

Package com.ll.wiseSaying

- -
- - - - - -
-
- - - - - - - -
-
-
7
-

tests

-
-
-
-
0
-

failures

-
-
-
-
0
-

ignored

-
-
-
-
0.574s
-

duration

-
-
-
-
-
-
100%
-

successful

-
-
-
-
- -
-

Classes

- - - - - - - - - - - - - - - - - - - -
ClassTestsFailuresIgnoredDurationSuccess rate
-WiseSayingServiceTest -7000.574s100%
-
-
- -
- - diff --git a/build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml b/build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml deleted file mode 100644 index c17e5ce..0000000 --- a/build/test-results/test/TEST-com.ll.wiseSaying.WiseSayingServiceTest.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin deleted file mode 100644 index e69de29..0000000 diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin deleted file mode 100644 index 5aa9e6088e96fa58ebf1a8ca9294dc1fcd93f185..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmZQ(WLlA&pR1RXqgS3;oEn^1nVFZa7Y=6zrxulECZ~p^7MD!JD$2mXIQirJ)2G=P zXQpN5r356Vry|sWv}tHgecLzV&DFw9&Z2A0VwsX3`7P(MQqod`3uMZwbrWZIjiwQm;8 zK{LY%>b8Cc)`=ibLqZLQ30Pg>2sPm%1KU)X?;J}@GV+Tcrc8b_Z{n*B4ItML(*`*sR%L=aY%KW3KbQ7p)r}P#Kk?3bf5`u?7ACPytGT(LHtC% zRuf~4;RE;;{4U0GCrM2tn)Lq9`JJA7?zs=&e||j$@EDs#EaGYbQ&=jHcTM85it7@} zQdXqgkg_VpRB=;9g`r|PCw}4$+wREp!Xr}%^Tdz2ds_@{A!{t?e-=Tj78+%(VP~cg9D39`)S5pvY`1^jxv$M!w{;;Ixyt-dkGhjEhb< zjy%5Y%NbgIG+IA&k6kKf2c8IHYN5@OVK`7xrT-lsCojS{QBl)z8+UX}N0Yu+n{7)QP#lpf`hn zM_a;;V;(aYY58vdkb4Qk{JC=(mi~_ad6xNOSBz!Jm1=Fj^{?C~bkOxigJJo9X=)e^ z{J<5Ho1v>xT1}_Nkl)>D)O$8L4ZCGaC-;1}*`kVy{kqvR%JgP*dPB@8$>WqBG|a#t zdy(h|vg85$3)tzm;wNN2$}jsFiqd@#<>dtPgt-(|!hDJvp_*cWP)o5$X#CFpfIJGA z!vbm3`GSnwCZ_c`O;*@_{d5>oArr8;nmZOEL&_*p`h6PB876mNd9EGnwhJ zQBHC~AcTb75Fp0_A!s2^7DE_}$r3i3V>ip@-XjOO$$gNMBoN5^-96JIYb+AW>i$*r z>;0pC{a@Ak+zY232e46H9>s3lsN?NXXt=QkL%2!DJEExa8aGS#JEi+wLfs;de~7aA zk2>Bhja#eno+upLCY`s-UBzy(@}5?ykWHagR_Rl7V~W zF)5?}ECct+!2R<0usn{-=tl(kqr&np)p#I^?Kly|gLp`KK30o|QPA;76zw=E+>Z)% zN~p(ld|clDT8(j;^>{T>GUpQ_=m~lJn>0Tu)V~Ykr=`Kv>9}cMW@eMp_B+GQSd!|`t01W>lOcL_&M~tNX_`imv-+<#kD48} znHufry(VsDoMbvhwz^@*j2{^=Gd^x8n@^FurHp;p$4Wzwk}jX9@+)xm=7 zwOlqaE^Q}*eucAVoW}{vJ-zcz((V{c59i}!y|y(@Jpz~M_^FPcDb#1oY|iR(=$ylO zhf1xhJcjW++Z;cfFq@}NXkM?dp_0EV$dw2k z@qm^fiKPw2UP@eB+h-4PQzVy#*wuOt12x>1vw0B z!kXg@v8~*`-kyvOr}NpkwJRw*u$tRwjYPac?Vy!&1}xd0IRh^Py|avQe_D3%*QmJJ z4IIGb3M;2G2GJQL90U7tnSr0<3IoH~XW$n?{Sv=2kN~x54EA0rEDby(s%S62(7>

Q<&l~s)UeNKP!91Z1rKymi!m7$p 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 Qy42V3b$r9``!>GwSG$B>#sB~S diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FileUtil.class.uniqueId4 b/build/tmp/compileJava/compileTransaction/stash-dir/FileUtil.class.uniqueId4 deleted file mode 100644 index b0a67c81524d6c6c3e9939bdb270f9f9900cf990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4218 zcma)9Yg-iO8NO#vGYo?W24$7tA;f^Nl8^)q7*oNRXjY^yN>S5v*d1YH+1bp_D)f{d z(xm5;J(;#in;z)FwwShHv^8x%$r?7@;IYnR!0*)uHq9qw&9bq{V5$s@M&@Sf?Pf$m(QyBoQ_uU)QZo`Wk$p= z*5C_xNkY7=;fo^qk{Ewk!&hYes*10v__~6`A-iCEhZRKIJI*SI4LUhXL4DdTSVQIM zamyVs$Mcjlrk$*rKWnIlfZJvipM90e)FIujZJ54W^tDrfkg0=&zc36o*{ifyZ;oIrzs|B>IH^mZQP=h)*?X3=5jTO9j%$jhOC*lk zR8hl>6c_^3h&AH{A@^<&azmsNVkglw2|esnDv`7DmM3^@MON_>`%OuEh$87&5W zfnQdNWI0u&GcbpgfnSOJujTR^{MNvATs81JsdQBm0W}Q#UV!)muBwx; zbpz+b@=th8L43bV6$5|9c?H|=KFx^c3O1+4FL7e55(OiTJ?3jIkF>jxhTN{TOXO^2 z@Nfp7)3Ja>d1c(>a5l5jZ%nB@_5FSq#-&9cr0fe!}%dzIZ%;NRPN?md2Xr zRE{pjw~~aJu)JY^rUs_P^}y)F;?da^5VJw?z%EDYdt6JT(R6iQ;^XJ zeQDJ8CRMy?;1=!}xPWK*(paIgUAXK_S>0)Wf^kfk7tQcpSUbJ)q~dR^E$ui{v51(rAFdm^6jTHk?Xq0{AHX>t-h^B8NHbzJBlU)l)T*HyBTMWlpq79|q z#>1&QuVR0yFP4nm>5WHw6HSSx`0Hp%#+nj6eQIY?y@{GPp+_+KVnUf)`gi9%eaHNK z_A)M@Gg>Vg_+{G6Z^}KWXGxoJl#*etXZfWn`96X;WdmX$8MvR2pL4Ej`y1crTRr|7N8o&hTcYFXKDeBH?f7+(YdAnQhv`I znudb4wl9`S#ul(O_0}9TF>3ByKym@w=UG@Y%Ra#353-~uxN10#G(Xp)K6Lw-5RjyF z2Q}{{6I!XiixxYmw}+a$aFWswqiq?!Ry5*iLM6T*qSgr(c9KW&47DRt4xf6tYP1@{ zsSvDgXz!v~MXiduZO2qJEfIer#$ORp0EHLz9VmoyTa0HqOa}o{Lkvc);7m1#b_j3k ziA>8Y(74js^-^FVrilpg2N zHZfG1nO9Ki;o$=vOsSL9>LOk#AE$QKzn{eKB{peN>J;feOiGRT5|B0tdTzsMWQb1< z27P2A^l{kNiBfw7w=*FDStkGWg}7y)zKhlXswHL=_gO{41=zLvs4dZXV$DVcQEiE* z5(zdTH1)APi_s9<3rsS>@@7_8xYDOB*KmP^+H*~y56Ic|2JTx#8~Hgz&>P13VnR>> zxUup6fS~{31_|0sV){3R96&NIu*V3yA%@M$yfQC56_WOlJf{i!2)pn+*PWQarDgd0 z2p9;CMo=0^3KPZ$3oJ^X!$6k zoM6-`%7wJj{WGL((EUY%FQjdtPa$%|@AY2PyoVm2s|3ETIbg6B9tRmL(q+isK}3K~ z@Y9FiaOVT0k!K`nkk$%|)2yEe*K;Al8kfD-qt~esG-o5p0p=o|u#LUYLK;auTLUj) z#x=xC@(gB@2IYTfVLF?2d54CP4+{losWZd_jqMBQkSNvDd{dQY9UrAX`O)#5PsAub e#-|8O{MDB#xQ(~)7dFBKpJg&mGH077VE-RxEZq_S diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/Main.class.uniqueId1 deleted file mode 100644 index d1dc45d8df0445198aca6be1040b8f8581b56b5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 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 VYMU9;rgaIpY?~5M5kvg^e*s;6%B%nY diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingJSONRepository.class.uniqueId3 b/build/tmp/compileJava/compileTransaction/stash-dir/WiseSayingJSONRepository.class.uniqueId3 deleted file mode 100644 index 3a83120f6ba42946ed7034cbb5c2dc8b03272d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7629 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 diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin deleted file mode 100644 index a0221e16afc95aee69000ec0eb3bf83acb8c3aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1097 zcmYk5Urbw79LIm>Zlgfy<zUOKhoU;E>eDPdwq!;xHJfS@3iEh~a~J~}Q8@>Ke6IQ09<^|j=crpv($5zzYg zyNO~sE5w&TN)kd;YsY8FQHEOn*>t;Lqk1xbnur{fY&4fJ`<6_zu1Z*M2) z&OhIMrJNxuAQcqC)Q7ssbybRWzWQLWvv0rST&0h!lKYC0aEzx;B>HPU$Yi7r&o>pO zME$1DK~%%6C{hF8dgtHUSY1i1B(=i(UbUV%(0$NF)WCdXY%CZas+IQ^=G7GAVBy!g zLg(Ax8(gZ9Rh6NKtdsi=^VH5v{jI6*ZjP$NJ0C3`ueKR|_1?$WL)_yYGG87hSd{k= z6QoEqK_$d@^pigY-pI_ixB2>OCmNXgM)^)fk&jYa%lEF{TsXY7wzOSzwztA*c99qs zBVj2T358^TbLiu*Vskgvf6?4pjnh{?w{S!gq@|z~k5L=@mfpnYuc`jqxmRY~I*@Di zJ;9L8FdGz2)a$K=Lsi$xFaM^^)js&zIo{$UO;mNJ`K`a1#!oXB?yPVB_*xE08Jgn9 z{z(?5zihw0E*-7^!d9ny5@xKF|2}W^8~<`TH2-e?puc~l(1HlF4pl-aLONuI76f}V zRwIyEoZFzWwp8j3MyT9%4G5X{%FGCW2%8Q-i;x^^WDKA~M7a$>FQ)<+71W^EW`)?4 z8K&Wp@u-+avQg5CpYpYNpJoqp?H)UKBtTn^at@2rlB3Ga%ct^`Cvd^sNN_wTrz7Jr z+|lLs*-f308WTgVEPJM_rLzmWmAJ)&pLN->5}Ug*!+G8IVix9t<9sv=i5~8`fUl0@ zdfj9(D>vZ$_<09it#~?H0QYhBBBff>kB|FbaMQ&liqyV{PxuFV>67xuiAlTclt0)@ zoGdww2OV^ol2tl{dG-u5?4oPb1qwOK3d})u!3ZAphumY{FdN}S51l>M!-dcJqwbhj zV&mMnhuGy4c#>&rRLUC?_$79Vp&zaWFXQt*dzE5UUceW9(}=M*n-pzLB0Pf_xi?TGKX*)G4rT;P%QHDi??Mg&uUj_aL6%r#? diff --git a/build/tmp/compileTestJava/previous-compilation-data.bin b/build/tmp/compileTestJava/previous-compilation-data.bin deleted file mode 100644 index 5a73750e8d94e5d5529d0d11ac5e343e181f1871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25002 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d6b0b1c..3fa8f86 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Thu Dec 19 10:24:23 KST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..fcb6fca 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +130,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +197,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +213,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal