From 159a1273791e3759b68e2527cd59b3736392c2f2 Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Fri, 19 May 2023 20:39:00 +0200 Subject: [PATCH 001/162] Create new module core-java-string-operations-6 Move code for the Find the Longest Word in a String article --- .../core-java-string-operations-5/README.md | 3 +- .../core-java-string-operations-6/README.md | 4 +++ .../core-java-string-operations-6/pom.xml | 34 +++++++++++++++++++ .../longestword/LongestWordFinder.java | 0 .../LongestWordFinderUnitTest.java | 0 core-java-modules/pom.xml | 1 + 6 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-string-operations-6/README.md create mode 100644 core-java-modules/core-java-string-operations-6/pom.xml rename core-java-modules/{core-java-string-operations-5 => core-java-string-operations-6}/src/main/java/com/baeldung/longestword/LongestWordFinder.java (100%) rename core-java-modules/{core-java-string-operations-5 => core-java-string-operations-6}/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java (100%) diff --git a/core-java-modules/core-java-string-operations-5/README.md b/core-java-modules/core-java-string-operations-5/README.md index 3a09c8a585..21ba1bf985 100644 --- a/core-java-modules/core-java-string-operations-5/README.md +++ b/core-java-modules/core-java-string-operations-5/README.md @@ -10,5 +10,4 @@ - [Guide to Splitting a String by Whitespace in Java](https://www.baeldung.com/java-splitting-a-string-by-whitespace) - [Check if the First Letter of a String Is a Number](https://www.baeldung.com/java-check-if-string-starts-with-number) - [Print “” Quotes Around a String in Java](https://www.baeldung.com/java-string-print-quotes) -- [Remove Punctuation From a String in Java](https://www.baeldung.com/java-remove-punctuation-from-string) -- [Find the Longest Word in a Given String in Java](https://www.baeldung.com/java-longest-word-string) +- [Remove Punctuation From a String in Java](https://www.baeldung.com/java-remove-punctuation-from-string) \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-6/README.md b/core-java-modules/core-java-string-operations-6/README.md new file mode 100644 index 0000000000..190880a5dd --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/README.md @@ -0,0 +1,4 @@ + +### Relevant Articles: + +- [Find the Longest Word in a Given String in Java](https://www.baeldung.com/java-longest-word-string) diff --git a/core-java-modules/core-java-string-operations-6/pom.xml b/core-java-modules/core-java-string-operations-6/pom.xml new file mode 100644 index 0000000000..8b9eabbc63 --- /dev/null +++ b/core-java-modules/core-java-string-operations-6/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + core-java-string-operations-6 + core-java-string-operations-6 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + 11 + 11 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/longestword/LongestWordFinder.java b/core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/longestword/LongestWordFinder.java similarity index 100% rename from core-java-modules/core-java-string-operations-5/src/main/java/com/baeldung/longestword/LongestWordFinder.java rename to core-java-modules/core-java-string-operations-6/src/main/java/com/baeldung/longestword/LongestWordFinder.java diff --git a/core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java b/core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java similarity index 100% rename from core-java-modules/core-java-string-operations-5/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java rename to core-java-modules/core-java-string-operations-6/src/test/java/com/baeldung/longestword/LongestWordFinderUnitTest.java diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 91f0dbfc28..edbac7b643 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -136,6 +136,7 @@ core-java-string-conversions-2 core-java-string-operations core-java-string-operations-2 + core-java-string-operations-6 core-java-regex core-java-regex-2 core-java-uuid From 4487183c83b17b6ad757f416190d7991bf8df57e Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Mon, 22 May 2023 23:49:35 +0200 Subject: [PATCH 002/162] BAEL-5773 Code for the Replacing Variables in a Document Template with Java article --- apache-poi-2/pom.xml | 13 ++-- .../poi/replacevariables/DocTextReplacer.java | 38 ++++++++++ .../DocxNaiveTextReplacer.java | 63 +++++++++++++++++ .../replacevariables/DocxTextReplacer.java | 65 ++++++++++++++++++ .../src/main/resources/baeldung-copy.docx | Bin 0 -> 15602 bytes apache-poi-2/src/main/resources/baeldung.doc | Bin 0 -> 28672 bytes apache-poi-2/src/main/resources/baeldung.docx | Bin 0 -> 15598 bytes .../DocTextReplacerUnitTest.java | 31 +++++++++ .../DocxNaiveTextReplacerUnitTest.java | 31 +++++++++ .../DocxTestReplacerUnitTest.java | 31 +++++++++ 10 files changed, 268 insertions(+), 4 deletions(-) create mode 100644 apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocTextReplacer.java create mode 100644 apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacer.java create mode 100644 apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxTextReplacer.java create mode 100644 apache-poi-2/src/main/resources/baeldung-copy.docx create mode 100644 apache-poi-2/src/main/resources/baeldung.doc create mode 100644 apache-poi-2/src/main/resources/baeldung.docx create mode 100644 apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocTextReplacerUnitTest.java create mode 100644 apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacerUnitTest.java create mode 100644 apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxTestReplacerUnitTest.java diff --git a/apache-poi-2/pom.xml b/apache-poi-2/pom.xml index af959292fa..9a01a76d73 100644 --- a/apache-poi-2/pom.xml +++ b/apache-poi-2/pom.xml @@ -1,7 +1,7 @@ - + 4.0.0 apache-poi-2 0.0.1-SNAPSHOT @@ -19,10 +19,15 @@ poi-ooxml ${poi.version} + + org.apache.poi + poi-scratchpad + ${poi.version} + - 5.2.0 + 5.2.3 \ No newline at end of file diff --git a/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocTextReplacer.java b/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocTextReplacer.java new file mode 100644 index 0000000000..f661551ce9 --- /dev/null +++ b/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocTextReplacer.java @@ -0,0 +1,38 @@ +package com.baeldung.poi.replacevariables; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.poi.hwpf.HWPFDocument; +import org.apache.poi.hwpf.usermodel.Range; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; + +public class DocTextReplacer { + + public void replaceText() throws IOException { + String filePath = getClass().getClassLoader() + .getResource("baeldung.doc") + .getPath(); + try (InputStream inputStream = new FileInputStream(filePath); POIFSFileSystem fileSystem = new POIFSFileSystem(inputStream)) { + HWPFDocument doc = new HWPFDocument(fileSystem); + doc = replaceText(doc, "Baeldung", "Hello"); + saveFile(filePath, doc); + doc.close(); + } + } + + private HWPFDocument replaceText(HWPFDocument doc, String originalText, String updatedText) { + Range range = doc.getRange(); + range.replaceText(originalText, updatedText); + return doc; + } + + private void saveFile(String filePath, HWPFDocument doc) throws IOException { + try (FileOutputStream out = new FileOutputStream(filePath)) { + doc.write(out); + } + } + +} diff --git a/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacer.java b/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacer.java new file mode 100644 index 0000000000..34c2bc43e5 --- /dev/null +++ b/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacer.java @@ -0,0 +1,63 @@ +package com.baeldung.poi.replacevariables; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableCell; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; + +public class DocxNaiveTextReplacer { + + public void replaceText() throws IOException { + String filePath = getClass().getClassLoader() + .getResource("baeldung-copy.docx") + .getPath(); + try (InputStream inputStream = new FileInputStream(filePath)) { + XWPFDocument doc = new XWPFDocument(inputStream); + doc = replaceText(doc, "Baeldung", "Hello"); + saveFile(filePath, doc); + doc.close(); + } + } + + private XWPFDocument replaceText(XWPFDocument doc, String originalText, String updatedText) { + replaceTextInParagraphs(doc.getParagraphs(), originalText, updatedText); + for (XWPFTable tbl : doc.getTables()) { + for (XWPFTableRow row : tbl.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + replaceTextInParagraphs(cell.getParagraphs(), originalText, updatedText); + } + } + } + return doc; + } + + private void replaceTextInParagraphs(List paragraphs, String originalText, String updatedText) { + paragraphs.forEach(paragraph -> replaceTextInParagraph(paragraph, originalText, updatedText)); + } + + private void replaceTextInParagraph(XWPFParagraph paragraph, String originalText, String updatedText) { + List runs = paragraph.getRuns(); + for (XWPFRun run : runs) { + String text = run.getText(0); + if (text != null && text.contains(originalText)) { + String updatedRunText = text.replace(originalText, updatedText); + run.setText(updatedRunText, 0); + } + } + } + + private void saveFile(String filePath, XWPFDocument doc) throws IOException { + try (FileOutputStream out = new FileOutputStream(filePath)) { + doc.write(out); + } + } + +} diff --git a/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxTextReplacer.java b/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxTextReplacer.java new file mode 100644 index 0000000000..2d08d24a4e --- /dev/null +++ b/apache-poi-2/src/main/java/com/baeldung/poi/replacevariables/DocxTextReplacer.java @@ -0,0 +1,65 @@ +package com.baeldung.poi.replacevariables; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Objects; + +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; +import org.apache.poi.xwpf.usermodel.XWPFTable; +import org.apache.poi.xwpf.usermodel.XWPFTableCell; +import org.apache.poi.xwpf.usermodel.XWPFTableRow; + +public class DocxTextReplacer { + + public void replaceText() throws IOException { + String filePath = getClass().getClassLoader() + .getResource("baeldung.docx") + .getPath(); + try (InputStream inputStream = new FileInputStream(filePath)) { + XWPFDocument doc = new XWPFDocument(inputStream); + doc = replaceText(doc, "Baeldung", "Hello"); + saveFile(filePath, doc); + doc.close(); + } + } + + private XWPFDocument replaceText(XWPFDocument doc, String originalText, String updatedText) { + replaceTextInParagraphs(doc.getParagraphs(), originalText, updatedText); + for (XWPFTable tbl : doc.getTables()) { + for (XWPFTableRow row : tbl.getRows()) { + for (XWPFTableCell cell : row.getTableCells()) { + replaceTextInParagraphs(cell.getParagraphs(), originalText, updatedText); + } + } + } + return doc; + } + + private void replaceTextInParagraphs(List paragraphs, String originalText, String updatedText) { + paragraphs.forEach(paragraph -> replaceTextInParagraph(paragraph, originalText, updatedText)); + } + + private void replaceTextInParagraph(XWPFParagraph paragraph, String originalText, String updatedText) { + String paragraphText = paragraph.getParagraphText(); + if (paragraphText.contains(originalText)) { + String updatedParagraphText = paragraphText.replace(originalText, updatedText); + while (paragraph.getRuns().size() > 0) { + paragraph.removeRun(0); + } + XWPFRun newRun = paragraph.createRun(); + newRun.setText(updatedParagraphText); + } + } + + private void saveFile(String filePath, XWPFDocument doc) throws IOException { + try (FileOutputStream out = new FileOutputStream(filePath)) { + doc.write(out); + } + } + +} diff --git a/apache-poi-2/src/main/resources/baeldung-copy.docx b/apache-poi-2/src/main/resources/baeldung-copy.docx new file mode 100644 index 0000000000000000000000000000000000000000..2cb76e8ffd0cf583f7d174821989c0e520f189f6 GIT binary patch literal 15602 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 literal 0 HcmV?d00001 diff --git a/apache-poi-2/src/main/resources/baeldung.doc b/apache-poi-2/src/main/resources/baeldung.doc new file mode 100644 index 0000000000000000000000000000000000000000..1b8474d65ba18a9e71ceba5bfe51eacf820e3ab6 GIT binary patch literal 28672 zcmeHQ2V7Lg)}P&F7etVyN>Nx4l_)N~h@vzVDFTYv#RZn;Qe2AI0xC941ngamBDNr+ z*hK{!mWT~CieimMR5U0W%YNrvxUg(QN%G$N<$Z5Q|M$$CnK@_fnYs5)Wy>$9SFPWv zf0xL(K7>U+N!k#O6rTZp8#>G-#18z(`y`P_kZlbBuiX6?S)e-i80kmaC=gPkaRe)o z5U5#jN`%Y+v?C$WA<k*IyuPbb(*dB(M= z44e_xaLSLL@<23j6%C%V0nJ-wZ_ zXWzgVBjsrRGq8&jaOivu(PSprK??$pfm#B^_J@v6R}JmpOX2$1zkj9m(30r-!g7oT zCT(Y$(&eMWG^O*mMCo+0lx~kSZ7Dy^r}fj}mZ+>AI!xP{4!1;UxpY0s(yztKrvF!k z>H2D^+%56x^8Q)cl01Aj4~G}&K6ptvL91sI4Y=YLMehFj7H|^?MPW&?5sH3^kwP(V zVw^ZEK~d37z-x?9RBWqC2Y4aE@HnxMmmmyHjEalpg@}cM@hWtzs%vZo7o)Vx9KntJ^&;b|#Isyy< z#sCvQCx9uSGoTBA4{!%~0DJ(xfU$sJKnx%OkO)WuBm*V_QUH?xlL1ozQvuTe-vUwr zX@Kbf?0Y`Dbrsy%;@xm9*uHMzx{QL^1*x-B;zgwKKS}v~HE?tyulhpwNsSea3F<>b zl^818kXgNkY3+0EtN7MaAguOTJ4K=PsBEqQ0Tagf!DMMh& zhzMI7e4>7`f@&|{L1uY-f%c+|?_v5KEc^a_Ep6`KqysI-G)wkeI*;7{AGbi$lYlR* z&pj&~b7GYh$uKG?x8N02IU5(`uuTA+vU1p_fX)T*N+~F3>H<`<%9(bgjU|=ADIULS ztm36r&3V93!S8Zcj+!cZfMM1lGT zQ>eHsK$Zj6eg*chLF{WthTSY*LrXIHK;D+({vG_yaKE%%9VtJ}lcoDwkw!L8B+SNn z0%ZCBi{bc&`n8631dCSWBrI`M03HEwxq}1y2y_5l0QP|XfFM9PAQ>Du~IUo&C1*ieQR#L(R@Bo$o z7l1tOKWCTEy;pdk-p@;c_yYm}!JZ6-7|%8ev48|XA^?(*L4=HZDPaOt;bIsa2SRZ~ zOk#+Dh#(A`e_$1k#lTg^9N0_g?xjP#J(-kD0r*j_v`m!I7x#J#cv>o~hid1OuS#Q6vmv9f(tq8u<&W$sk)zYQ>X~KEw#V-b_XxqN1cuaQ)Mg z!y%q<#{$qK1dX^T%$3TceNu@qJvFjS8Te@O$tSfRh&qE0lDQ4}+cwM3Bko{rv_85% zU`Ylsq4a4s>cg6dgFC17X?#VW6{Sz3QJ-}F=KA7Ekqg`(>?l>?Y7<<=tzxK>fmFQ< z;hI3zZ2+{Bdi{iShuxH#8zUK7fI%mfJjBOg4}dc9Z}N^wAIBOCfQ4bOCTy>8>qcOQ zMSLWtg_`|j@k$cF@BxcxHE7iMf=21`{!yC0Hw#wbI8=Yim^`_yb_AF1JAmmmfsS&I zi%k^9CI$yiiWeq~;itriwr8ImRBFlXSLgX*=EELds|#I}IzO3lYQd==rXD@L!c?d1 zdSTws_jNv(0^K(AbVTMiZ0gqbx-UL#q*zqCe084Jj#qBoO`jSJ7?XR)!SBY8LGz~T z>-HApsx7ZQP<+VDVNTk>c`FC!PI(j`;Zx|mAWLkNweiyLj?A-m$z9SurnNht6mU!T z>AY;m`(^Ie9XI_Xd zwN#n&V%FiA7pDbWD%I_rY>}JgZn0q+xoeghX<~5G;OR}jQyk@kO6eP4)NOJ8lt2I7 z-NnD~bXIQVl-_gidp7cJvh$JD8D+CJ=5j9${^QskL3~# zwYfL^4h_zC3%gjxz2w#JrfrC6YF_q);A=+9*XmW-`&@plGx(arxctn`Ws+T`mgm;` z9ZTI|{;;1ytixiTs0ShIH(T5vayV&oub;BX_pjp3=!n64Y-w^lJ`mU#PF0H$H z?cx2I4nN(|y1L3+b%gn9Mb!-9dH&qJHB-&=3^xDl+2Mq_=G=7=mpCnWT?PHD zT}IGX`&{9zu-MfjyyFZUxW(-srw*?^yff^nxgL7O))|QjQul==D%ZcjbCz)1NIlieLb4EukTfF)0bS)+2QEBUQi}k);y<*LZ zHHQ=GqI?c(o?{CJmRj8D_Ret7Y;)eg>orEN53Z|x<7^zD!8@aIt0r&w+lhPoetgjG z=Y{GEb}GJ_cim03??UU!k)t%-hxfmy<2`|S~wF#e0GO5Gj1=>|8bdDQIT%; z@j4BynLn3aoU5|)+OTdPpY4CuZq`{31*P8eZ)JaD&J-5_qv+XBC% zgWkX0QtOPXd-O2L`3K?5V<}@^l$E*`N97Lw@k+Az zqrS^S>--@vt~eEqUdPF~%N?|G!p@|MYonIvRS;ot#{)NCzv+LY#Nc;_rH(HGubwIy z@4x9tVfu^YQRDix-QlWNd?0;?y~C=QQAaq!w?AtXkNr7n*sn{!Rn0IPc+&gv;G#Vj zSFW?4^PO&GQi;R1C9%_{Z93%QYWv_~?jGHp9{CwXx*ct9v(uP^O$Xj9i^>=fsT6R_ zZLx~u%Qv37u2s2a0_IZhr@66FtWVqg`lVhr>^DkR?@~s4OLcGWjLfdHS8pu5dq?rd zVn)x@-yT)pc)Ba%$U5iLZ{Jj3yK#HulFobQFDzd?rS7tWIzQgxp60*~ z`bHi**|#FTv)7wA^6vDX&srv=E=+%Z{@wB8&K{4C7fo#2dFirVi?qb%6Sj!@UH@T{ zM}SGdTupQ5*9Hcm)sB^#ZsrG{FEWmp@%_fS^b}u@)m@$}ny&3TtDHaYn8lFxt~Gmw zt3I9@yC~q=mYZ*n_b)j-ee=wzMnleiS6A-w!}Z+4%#djPscL1X`xQDobl1G5uF<<= z$eBZf(q_e%br3u5xLd236@DxBPTu9~{lx=M^4Cn6Yo&Q3{C-gSy(_bxWt&>>TsPk; z-R#wZ<%!4YR!p0-d3+7aE9k&`t7A(KTKvSxmoIwJP`0OiPR%f~E-d=~?PU&N| zgwHt@lu>#2xL(Ke10!d>F+8cY<_8k`;^HsuIKE3q+FN+u$>eRT4jDGCazOI-txpx& zK3)=-uxoYKy14~zd*-?g*b-?X$@2p}%aOg)1j`1V`iGH@}U&S*u=T zZ^qn|nR7NicNBN$t>C$v?`=KNWzhcYX_s|k)1IG>o*c4p^mRs$+CEn$`E}FV-TyFW z*@E{~rM10cPXrYn2+7;kZACS|)?r)x{4u`sU#3m{;OlGPyRef=QdrN>%350o=kFy) zUPJ{|UT|1*ZtJ)AH!XU(zI5M{u<+6)YM0Bj&bO_#i>}I6om_jp>)4*J_0+wlh`nB} zEuU$`xM1VjUT4YbwJGqkpwb%@f-w0XzQ4zO_h#%Io%;=vjjD}MD) z`9{;y_R`rwmCAlyU-oHRD2UjN3JyP4fqtRMe6ByHKYYa(~&$Tgb& zg~N;mqVPr6T5bavFXs=+|HJM}{!2h<6-i?N!WtqIzT` zL!CQgQU}{#roS5U=-2%di){LC%p0b6IfFzN{G#rkGI_{^F_U^H9WcMbzZ*3_T|L&m zO^jY;)jTD`nGqMa1X;M>-&%aze0221A)CtIyGCl;{<`CIr~rCa?!LIQhvNw z%-f>xyQQDw=BlPDxQD*g&*S!Tb51bUFIly0{ev5-scX(H6dT|4^jL8$=~7vttB>g; z!_E^*hn>1m>7u#D-FELQC)4!IrMJ3lT$1^H2gk}}Ys2qr{8z?01TD_p<$bzlM1K6I zttWP<1uYaYpFi(+Y>PvV<|nS}+@Vi}!lP+QDHHvF+OEe<(OcTJ(BzYj@@4a9E8{jK zstBLX-K4&9sFux&i1;;U5}bbTws-mjyIwZBS1il6bKAKM9p}4Y z7WV8ErDJ#bOt-Dk2X-wlDm|oPe*M+tez(WjIaocg-Bl8?Ws23q*q;(A-PUCdYh#%b z+jqd#!yc}do3&SsxT1Ccq3w3@8`0JLj=!qNhWd8$1Qe6)Zs-XA~c zsu#1??SU8r_}q7u`6kx)VyKV1)Mve+SL3T(VyTs0H)EnwT-@aY-0UuubIX6c!b*Q& zr)uBVG@$yKYQDJ=e~zGdMbyD%Ysxf3t#4aJZq-+Eda`7~%40G6su#En))_SKMz64f zaWfXgIXu&j$o4k#?P5CEjBmAE+^(zFqSfUYf$!4t9XDhKJuum@$@TQXa?iS?X*n-f zF{Yj{JsiTFa+T;U^XGR@3aQsf= ztuvTCptIakHy4sgxzBWZ{k@wDknQ(1<+cQSO7#L|Gs^a(nlkD^2UDs)Ro}OgGQX@O z*-lN9q>9f;qPjS;GGrS;lZ;L_utrKol1%bT*kJOfc!&M^(AEz$sKD z_7%kQKtODQlfc;|GBGjU$-*Kb6gr)P1b$q+Fc#wApht`#5rX0fi!iZZA_$HVSy)?I z+FQg3qGC;WArV&2CZa?u6JBBp_`=46FC@YmdDh4SU)Xr?2|`0*hyy7aJTwR5>p6{S zY-o-RoyL~t*wP$3nqx}ig@2`^F<6+0g82#EhLtL8e!Hf zga|HCssVlV!a%SZVb$Pvb~U0 zp+45xkQ|8XM#=*1sR@k@;(^54(3{|Ck;Uv$1ka)1{(GDf!ZRUwu%vFpHfm~t+NKV2 z=sQHYXc>u%N*Zk;+`xnjegXcsr28By2W=$x!4l*(e$vU3m1T;bjO^ZVb%V!BGVW+3+dtZ8-`|bS-Lk zrDoOYXCeo*%VO-5x=ogpA2k@`1)OWcj26xxMtvsiP_J8!jfz>6?gvv$Nr~*8yTiPg z2qc71Wgx_zZ;lpIWBsXo^|Of)P$p~!uJu+|V1v~;sGCEoB&GzPIBaob9cVy@y3txV zrzil6`@%I5WWZT1cnGYN(sW4;&cx$t6Cw8=7AYdoPl=(LbSQ-C8I7cB4z-ucQ6Zv^RNSR+-l z*1dY?7s=h0twg$a-E{*S?^KAuk0Hiq0kHKg2Vie$BLJI20RVeCrvcawt^n}GQw6{m zaxDPgq$(f;>s%Koc4~2r5qmWrKyksvA1L%I$Y`M0iwXnE1u6oHv*(FGQ9rg|?0C>k zQPz)n0wbeB1WBSqUVlN7Sor1iScXB^`xWuS;u2#h*8Esg(iT+O_C{_1MJ0e8_d82_8U%l7~tTZV`8osWT! zV`dz?;`}3y)#Cv;2Y}P`I0ujpz%lK20Qe&{WHA6|fK~%=Y`qbHWBTm?+(Wb*fO7zc z04Tc*@VT+R^q83*JL8NR@=-E9%hVDz1m&0yL2YqGB{-PJLI*}AiiDIXDjH|8>g5u` z13xld0GP!SfMN7&0S1T#F);$MXp%=+4R(>-`BXqD17g!5ydI%jYLwnfT zJ390bgoRu7u(7lcw+^ut3a!H}A(`CCEg-jm+yZh7$SokZfZPId3&<@Xw}9LNatp{U z@V6~Mk6CeCs{p_;I}Uwuy-6~hE;xS1aX602aZMh__&9FIF+IlP*d52c_)8Ty ze#bFBu7~5+KKwxg_)!b$U{gn+IJ`Cj@BqdD%-;#9DWEf;3!p0i$H?CRFuprbb3hLO zZV|Kq;NaK_fbkyzwhev^BjoPu7QlUacyf{lzXF42X~onAOE6?Boep6$Xf4==IBjqS zgpi}u6^`giIi7+u^~)Icz)Nf3dr-U91X8K~oEP@4H0sB4v?e#Tff^exI4h|Wy7int zcWnpy8IT2^nbzvZJumdHHw**oi{YfM2hdR1*@XKj=`+o(DTzMlM~mZg+gkl77k{@0 z9UFFCqEHTnGJ0HuXBGzKdl|xuKZmoZNdL7 zKLcu?1usOrYuR@<586i4em305#_Q?O15SY0@aS1>YTusk5R3yB^-!UoPsj5eNo~)< N33O|d(|?);{tt|O)Z+jE literal 0 HcmV?d00001 diff --git a/apache-poi-2/src/main/resources/baeldung.docx b/apache-poi-2/src/main/resources/baeldung.docx new file mode 100644 index 0000000000000000000000000000000000000000..f0de4e057bee61081609a50af4db03d279db83e7 GIT binary patch literal 15598 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
    ^Bv$yaj+@1cVig4QR>XqM?@H4zM=X_D z?mrt9P5Tj!;Uu4w6xcHBV|zx_9u8;pGCU9rFr5p;%fQd@hftn6O)sq~j*f(`2_g}G z@IGVX^<|8Wc5w!$d!!wtpc&+*6VzDtRLgOJDT$#(ppYGziyVwXQi?i5^7C-o=6b}M zS9KQO)xMd;c9y<^OADXKI5B&i&rPb8R+YG|oeTFSH<$Y!6kMLn)Vhqw*lhNJ8i#O0YRUa7K!gOZ|WFcKTsMhB?Z!)UpC z>oSbdxA-o}`t?=($BaNg>0ZO?e?M6H_gnkVuYWmaDJ%I;1^+zg^|OMC*ZBRXV_&}l ze?9W@H+1cl`1D@~V19-FlV<%l7yu}Gr3?Q5NY}q=`juh(x2}7{KQ#S=Z~H6$SDNDA z_^Vge;_p5AnY8#T{8y^i-|*Ad)z9znUx{D8s`xcg{Xkr2Y z{wv)475>jp{?Bj|)}P>i1OUIH|LKT-Mk90lgx3GdEz3$myqY%vfcX07`8q?Cxqd7C EKZ`JklK=n! literal 0 HcmV?d00001 diff --git a/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocTextReplacerUnitTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocTextReplacerUnitTest.java new file mode 100644 index 0000000000..0c3d80a354 --- /dev/null +++ b/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocTextReplacerUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.poi.replacevariables; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +import org.apache.poi.hwpf.HWPFDocument; +import org.apache.poi.hwpf.extractor.WordExtractor; +import org.junit.jupiter.api.Test; + +class DocTextReplacerUnitTest { + + @Test + void whenReplaceText_ThenTextReplaced() throws IOException { + new DocTextReplacer().replaceText(); + + String filePath = getClass().getClassLoader() + .getResource("baeldung.doc") + .getPath(); + try (FileInputStream fis = new FileInputStream(filePath); HWPFDocument document = new HWPFDocument(fis); WordExtractor extractor = new WordExtractor(document)) { + long occurrencesOfHello = Arrays.stream(extractor.getText() + .split("\\s+")) + .filter(s -> s.contains("Hello")) + .count(); + assertEquals(5, occurrencesOfHello); + } + } + +} diff --git a/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacerUnitTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacerUnitTest.java new file mode 100644 index 0000000000..324e63eb51 --- /dev/null +++ b/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxNaiveTextReplacerUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.poi.replacevariables; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +import org.apache.poi.xwpf.extractor.XWPFWordExtractor; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.junit.jupiter.api.Test; + +class DocxNaiveTextReplacerUnitTest { + + @Test + void whenReplaceText_ThenTextReplaced() throws IOException { + new DocxNaiveTextReplacer().replaceText(); + + String filePath = getClass().getClassLoader() + .getResource("baeldung-copy.docx") + .getPath(); + try (FileInputStream fis = new FileInputStream(filePath); XWPFDocument document = new XWPFDocument(fis); XWPFWordExtractor extractor = new XWPFWordExtractor(document)) { + long occurrencesOfHello = Arrays.stream(extractor.getText() + .split("\\s+")) + .filter(s -> s.contains("Hello")) + .count(); + assertTrue(occurrencesOfHello < 5); + } + } + +} diff --git a/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxTestReplacerUnitTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxTestReplacerUnitTest.java new file mode 100644 index 0000000000..d09f6b003d --- /dev/null +++ b/apache-poi-2/src/test/java/com/baeldung/poi/replacevariables/DocxTestReplacerUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.poi.replacevariables; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Arrays; + +import org.apache.poi.xwpf.extractor.XWPFWordExtractor; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.junit.jupiter.api.Test; + +class DocxTestReplacerUnitTest { + + @Test + void whenReplaceText_ThenTextReplaced() throws IOException { + new DocxTextReplacer().replaceText(); + + String filePath = getClass().getClassLoader() + .getResource("baeldung.docx") + .getPath(); + try (FileInputStream fis = new FileInputStream(filePath); XWPFDocument document = new XWPFDocument(fis); XWPFWordExtractor extractor = new XWPFWordExtractor(document)) { + long occurrencesOfHello = Arrays.stream(extractor.getText() + .split("\\s+")) + .filter(s -> s.contains("Hello")) + .count(); + assertEquals(5, occurrencesOfHello); + } + } + +} From 65206efc8a5eb55c8d7617a2b4505690ae39bf67 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:07:11 +0530 Subject: [PATCH 003/162] backlink updated --- core-java-modules/core-java-lang-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-3/README.md b/core-java-modules/core-java-lang-3/README.md index d0505dfee1..d23feaeffe 100644 --- a/core-java-modules/core-java-lang-3/README.md +++ b/core-java-modules/core-java-lang-3/README.md @@ -4,7 +4,7 @@ This module contains articles about core features in the Java language - [Class.isInstance vs Class.isAssignableFrom and instanceof](https://www.baeldung.com/java-isinstance-isassignablefrom) - [Converting a Java String Into a Boolean](https://www.baeldung.com/java-string-to-boolean) -- [When are Static Variables Initialized in Java?](https://www.baeldung.com/java-static-variables-initialization) +- [When Are Static Variables Initialized in Java?](https://staging8.baeldung.com/java-static-variables-initialization) - [Checking if a Class Exists in Java](https://www.baeldung.com/java-check-class-exists) - [The Difference Between a.getClass() and A.class in Java](https://www.baeldung.com/java-getclass-vs-class) - [Constants in Java: Patterns and Anti-Patterns](https://www.baeldung.com/java-constants-good-practices) From 21f7ce6f07604e176a21f5eeff7b65831f6a9669 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:08:52 +0530 Subject: [PATCH 004/162] backlink updated --- core-java-modules/core-java-concurrency-basic-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md index 455ff52081..91b84e3749 100644 --- a/core-java-modules/core-java-concurrency-basic-2/README.md +++ b/core-java-modules/core-java-concurrency-basic-2/README.md @@ -7,7 +7,7 @@ This module contains articles about basic Java concurrency - [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution) - [Difference Between Wait and Sleep in Java](https://www.baeldung.com/java-wait-and-sleep) - [Guide to AtomicMarkableReference](https://www.baeldung.com/java-atomicmarkablereference) -- [Why are Local Variables Thread-Safe in Java](https://www.baeldung.com/java-local-variables-thread-safe) +- [Why Are Local Variables Thread-Safe in Java](https://www.baeldung.com/java-local-variables-thread-safe) - [How to Stop Execution After a Certain Time in Java](https://www.baeldung.com/java-stop-execution-after-certain-time) - [How to Get the Number of Threads in a Java Process](https://www.baeldung.com/java-get-number-of-threads) - [Set the Name of a Thread in Java](https://www.baeldung.com/java-set-thread-name) From 48c08eaad3d5262abc2eb816e8f4384ee2b308b0 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:10:24 +0530 Subject: [PATCH 005/162] backlink updated --- core-java-modules/core-java-networking-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md index c223e20a84..220ff8ad3d 100644 --- a/core-java-modules/core-java-networking-2/README.md +++ b/core-java-modules/core-java-networking-2/README.md @@ -12,6 +12,6 @@ This module contains articles about networking in Java - [Authentication with HttpUrlConnection](https://www.baeldung.com/java-http-url-connection) - [Download a File From an URL in Java](https://www.baeldung.com/java-download-file) - [Handling java.net.ConnectException](https://www.baeldung.com/java-net-connectexception) -- [Getting MAC addresses in Java](https://www.baeldung.com/java-mac-address) +- [Getting MAC Addresses in Java](https://www.baeldung.com/java-mac-address) - [Sending Emails with Attachments in Java](https://www.baeldung.com/java-send-emails-attachments) - [[<-- Prev]](/core-java-modules/core-java-networking) From 8645733aa229670687a080c10559a44f0296a7d7 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:11:31 +0530 Subject: [PATCH 006/162] backlink updated --- core-java-modules/core-java-concurrency-advanced-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-advanced-3/README.md b/core-java-modules/core-java-concurrency-advanced-3/README.md index 9495d5f479..ab541c73ae 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/README.md +++ b/core-java-modules/core-java-concurrency-advanced-3/README.md @@ -15,5 +15,5 @@ This module contains articles about advanced topics about multithreading with co - [The ABA Problem in Concurrency](https://www.baeldung.com/cs/aba-concurrency) - [Introduction to Lock-Free Data Structures with Java Examples](https://www.baeldung.com/lock-free-programming) - [Introduction to Exchanger in Java](https://www.baeldung.com/java-exchanger) -- [Why Not To Start A Thread In The Constructor?](https://www.baeldung.com/java-thread-constructor) +- [Why Not to Start a Thread in the Constructor?](https://www.baeldung.com/java-thread-constructor) - [[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2) From 7e9ba8a680c3c3043a19a9e7524d663242eefe3f Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:21:30 +0530 Subject: [PATCH 007/162] backlink updated --- spring-di-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-di-3/README.md b/spring-di-3/README.md index ffb81fbe7d..64cf11eb6b 100644 --- a/spring-di-3/README.md +++ b/spring-di-3/README.md @@ -9,6 +9,6 @@ This module contains articles about dependency injection with Spring - [Finding All Beans with a Custom Annotation](https://www.baeldung.com/spring-injecting-all-annotated-beans) - [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) - [@Order in Spring](http://www.baeldung.com/spring-order) -- [How to dynamically Autowire a Bean in Spring](https://www.baeldung.com/spring-dynamic-autowire) +- [How to Dynamically Autowire a Bean in Spring](https://www.baeldung.com/spring-dynamic-autowire) - [Spring @Import Annotation](https://www.baeldung.com/spring-import-annotation) - More articles: [[<-- prev]](../spring-di-2)[[more -->]](../spring-di-4) From 3bd3b5a5190340897e55ff061e9689fe7623c0c8 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:22:42 +0530 Subject: [PATCH 008/162] backlink updated --- jsoup/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jsoup/README.md b/jsoup/README.md index 42b30d4d83..3a8a7f0ebb 100644 --- a/jsoup/README.md +++ b/jsoup/README.md @@ -4,7 +4,7 @@ This module contains articles about jsoup. ### Relevant Articles: - [Parsing HTML in Java with Jsoup](https://www.baeldung.com/java-with-jsoup) -- [How to add proxy support to Jsoup?](https://www.baeldung.com/java-jsoup-proxy) +- [How to Add Proxy Support to Jsoup?](https://www.baeldung.com/java-jsoup-proxy) - [Preserving Line Breaks When Using Jsoup](https://www.baeldung.com/jsoup-line-breaks) ### Build the Project From a64ad147d709ca6dc85fb471e349378346b677f2 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:24:41 +0530 Subject: [PATCH 009/162] backlink updated --- core-java-modules/core-java-date-operations-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-date-operations-2/README.md b/core-java-modules/core-java-date-operations-2/README.md index 1555492bf6..cfdf8f56a8 100644 --- a/core-java-modules/core-java-date-operations-2/README.md +++ b/core-java-modules/core-java-date-operations-2/README.md @@ -8,7 +8,7 @@ This module contains articles about date operations in Java. - [Checking if Two Java Dates are On the Same Day](https://www.baeldung.com/java-check-two-dates-on-same-day) - [Converting Java Date to OffsetDateTime](https://www.baeldung.com/java-convert-date-to-offsetdatetime) - [How to Set the JVM Time Zone](https://www.baeldung.com/java-jvm-time-zone) -- [How to determine day of week by passing specific date in Java?](https://www.baeldung.com/java-get-day-of-week) +- [How to Determine Day of Week by Passing Specific Date in Java?](https://www.baeldung.com/java-get-day-of-week) - [Finding Leap Years in Java](https://www.baeldung.com/java-leap-year) - [Getting the Week Number From Any Date](https://www.baeldung.com/java-get-week-number) - [Subtract Days from a Date in Java](https://www.baeldung.com/java-subtract-days-from-date) From 6ad2b04afb7bdb8777e5857b0f73bb8f66e87100 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:26:02 +0530 Subject: [PATCH 010/162] backlink updated --- core-java-modules/core-java-security-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md index 7128c39713..1c6313b9dd 100644 --- a/core-java-modules/core-java-security-2/README.md +++ b/core-java-modules/core-java-security-2/README.md @@ -4,7 +4,7 @@ This module contains articles about core Java Security ### Relevant Articles: -- [Guide To The Java Authentication And Authorization Service (JAAS)](https://www.baeldung.com/java-authentication-authorization-service) +- [Guide to the Java Authentication And Authorization Service (JAAS)](https://www.baeldung.com/java-authentication-authorization-service) - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) From 251710a9eb3b97ef2c27049ea7983514a316c785 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:29:13 +0530 Subject: [PATCH 011/162] backlink updated --- core-java-modules/core-java-string-algorithms-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-algorithms-3/README.md b/core-java-modules/core-java-string-algorithms-3/README.md index bc6b6f2167..6af818b52d 100644 --- a/core-java-modules/core-java-string-algorithms-3/README.md +++ b/core-java-modules/core-java-string-algorithms-3/README.md @@ -5,7 +5,7 @@ This module contains articles about string-related algorithms. ### Relevant Articles: - [Generating a Java String of N Repeated Characters](https://www.baeldung.com/java-string-of-repeated-characters) -- [Check if Two Strings are Anagrams in Java](https://www.baeldung.com/java-strings-anagrams) +- [Check if Two Strings Are Anagrams in Java](https://www.baeldung.com/java-strings-anagrams) - [Email Validation in Java](https://www.baeldung.com/java-email-validation-regex) - [Check if the First Letter of a String Is Uppercase](https://www.baeldung.com/java-check-first-letter-uppercase) - [Find the First Non Repeating Character in a String in Java](https://www.baeldung.com/java-find-the-first-non-repeating-character) From 53c1e1451e6fdde3ba03289cb168044f7b515ae6 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:31:46 +0530 Subject: [PATCH 012/162] backlink updated --- core-java-modules/core-java-date-operations-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-date-operations-2/README.md b/core-java-modules/core-java-date-operations-2/README.md index cfdf8f56a8..da516b4641 100644 --- a/core-java-modules/core-java-date-operations-2/README.md +++ b/core-java-modules/core-java-date-operations-2/README.md @@ -5,7 +5,7 @@ This module contains articles about date operations in Java. - [Get the Current Date Prior to Java 8](https://www.baeldung.com/java-get-the-current-date-legacy) - [Skipping Weekends While Adding Days to LocalDate in Java 8](https://www.baeldung.com/java-localdate-add-days-skip-weekends) -- [Checking if Two Java Dates are On the Same Day](https://www.baeldung.com/java-check-two-dates-on-same-day) +- [Checking if Two Java Dates Are on the Same Day](https://www.baeldung.com/java-check-two-dates-on-same-day) - [Converting Java Date to OffsetDateTime](https://www.baeldung.com/java-convert-date-to-offsetdatetime) - [How to Set the JVM Time Zone](https://www.baeldung.com/java-jvm-time-zone) - [How to Determine Day of Week by Passing Specific Date in Java?](https://www.baeldung.com/java-get-day-of-week) From b507338c7d18cc1799a72db822fd32bc5ee2e9a9 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:33:21 +0530 Subject: [PATCH 013/162] backlink updated --- core-java-modules/core-java-lang-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md index c043d29811..bf87393b19 100644 --- a/core-java-modules/core-java-lang-2/README.md +++ b/core-java-modules/core-java-lang-2/README.md @@ -5,7 +5,7 @@ This module contains articles about core features in the Java language ### Relevant Articles: - [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) - [Command-Line Arguments in Java](https://www.baeldung.com/java-command-line-arguments) -- [What is a POJO Class?](https://www.baeldung.com/java-pojo-class) +- [What Is a Pojo Class?](baeldung.com/java-pojo-class) - [Java Default Parameters Using Method Overloading](https://www.baeldung.com/java-default-parameters-method-overloading) - [How to Return Multiple Values From a Java Method](https://www.baeldung.com/java-method-return-multiple-values) - [Guide to the Java finally Keyword](https://www.baeldung.com/java-finally-keyword) From c6bd8b173ab51644ed57c059a4447bbc3eb7a160 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:34:53 +0530 Subject: [PATCH 014/162] backlink updated --- algorithms-modules/algorithms-miscellaneous-5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms-modules/algorithms-miscellaneous-5/README.md b/algorithms-modules/algorithms-miscellaneous-5/README.md index 54b936586f..72e9b45683 100644 --- a/algorithms-modules/algorithms-miscellaneous-5/README.md +++ b/algorithms-modules/algorithms-miscellaneous-5/README.md @@ -9,7 +9,7 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. - [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree) - [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers) - [Knapsack Problem Implementation in Java](https://www.baeldung.com/java-knapsack) -- [How to Determine if a Binary Tree is Balanced in Java](https://www.baeldung.com/java-balanced-binary-tree) +- [How to Determine if a Binary Tree Is Balanced in Java](https://www.baeldung.com/java-balanced-binary-tree) - [Overview of Combinatorial Problems in Java](https://www.baeldung.com/java-combinatorial-algorithms) - [Prim’s Algorithm with a Java Implementation](https://www.baeldung.com/java-prim-algorithm) - [Maximum Subarray Problem in Java](https://www.baeldung.com/java-maximum-subarray) From e93f7f9ab680d0a168ed9d077094f11934d6ad74 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:36:05 +0530 Subject: [PATCH 015/162] backlink updated --- persistence-modules/spring-data-jpa-enterprise/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-jpa-enterprise/README.md b/persistence-modules/spring-data-jpa-enterprise/README.md index 08fa55c14e..d1039dcc50 100644 --- a/persistence-modules/spring-data-jpa-enterprise/README.md +++ b/persistence-modules/spring-data-jpa-enterprise/README.md @@ -6,7 +6,7 @@ This module contains articles about Spring Data JPA used in enterprise applicati - [Spring Data Java 8 Support](https://www.baeldung.com/spring-data-java-8) - [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test) -- [A Guide to Spring’s Open Session In View](https://www.baeldung.com/spring-open-session-in-view) +- [A Guide to Spring’s Open Session in View](https://www.baeldung.com/spring-open-session-in-view) - [Working with Lazy Element Collections in JPA](https://www.baeldung.com/java-jpa-lazy-collections) - [Custom Naming Convention with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-custom-naming) - [Partial Data Update With Spring Data](https://www.baeldung.com/spring-data-partial-update) From 19e4ddcdc1f43f79884587eb8f291635fb919aec Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:37:57 +0530 Subject: [PATCH 016/162] backlink updated --- security-modules/oauth2-framework-impl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security-modules/oauth2-framework-impl/README.md b/security-modules/oauth2-framework-impl/README.md index ae28c1b511..e3d9f0c4ee 100644 --- a/security-modules/oauth2-framework-impl/README.md +++ b/security-modules/oauth2-framework-impl/README.md @@ -4,4 +4,4 @@ This module contains articles about the implementation of OAuth2 with Java EE. ### Relevant Articles -- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation) +- [Implementing the Oauth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation) From 9f103646cc7fb9bcf15dc542d1854633cd5967ed Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:39:38 +0530 Subject: [PATCH 017/162] backlink updated --- algorithms-modules/algorithms-miscellaneous-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms-modules/algorithms-miscellaneous-3/README.md b/algorithms-modules/algorithms-miscellaneous-3/README.md index dd5bbac162..8a606caa22 100644 --- a/algorithms-modules/algorithms-miscellaneous-3/README.md +++ b/algorithms-modules/algorithms-miscellaneous-3/README.md @@ -10,7 +10,7 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. - [Converting Between Roman and Arabic Numerals in Java](https://www.baeldung.com/java-convert-roman-arabic) - [Practical Java Examples of the Big O Notation](https://www.baeldung.com/java-algorithm-complexity) - [Checking If a List Is Sorted in Java](https://www.baeldung.com/java-check-if-list-sorted) -- [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle) +- [Checking if a Java Graph Has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle) - [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique) - [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle) - [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm) From a0ed49e3fd78030eef053f18cd416e4196c123b6 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:41:02 +0530 Subject: [PATCH 018/162] backlink updated --- spring-boot-modules/spring-boot-testing-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-testing-2/README.md b/spring-boot-modules/spring-boot-testing-2/README.md index bb504aeee0..e6bc4c4590 100644 --- a/spring-boot-modules/spring-boot-testing-2/README.md +++ b/spring-boot-modules/spring-boot-testing-2/README.md @@ -8,7 +8,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level) +- [Setting the Log Level in Spring Boot When Testing](https://www.baeldung.com/spring-boot-testing-log-level) - [Failed to Load ApplicationContext for JUnit Test of Spring Controller](https://www.baeldung.com/spring-junit-failed-to-load-applicationcontext) - [Spring Web Service Integration Tests with @WebServiceServerTest](https://www.baeldung.com/spring-webserviceservertest) - [Spring Boot – Testing Redis With Testcontainers](https://www.baeldung.com/spring-boot-redis-testcontainers) From 480fec36f7ebb6c5c09376c6ce36ec22301ae250 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:42:58 +0530 Subject: [PATCH 019/162] backlink updated --- persistence-modules/spring-data-jpa-annotations/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-jpa-annotations/README.md b/persistence-modules/spring-data-jpa-annotations/README.md index d7e6189ae5..2b2805b92b 100644 --- a/persistence-modules/spring-data-jpa-annotations/README.md +++ b/persistence-modules/spring-data-jpa-annotations/README.md @@ -5,7 +5,7 @@ This module contains articles about annotations used in Spring Data JPA ### Relevant articles - [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd) -- [JPA @Embedded And @Embeddable](https://www.baeldung.com/jpa-embedded-embeddable) +- [Jpa @Embedded and @Embeddable](https://www.baeldung.com/jpa-embedded-embeddable) - [Spring JPA @Embedded and @EmbeddedId](https://www.baeldung.com/spring-jpa-embedded-method-parameters) - [Programmatic Transaction Management in Spring](https://www.baeldung.com/spring-programmatic-transaction-management) - [JPA Entity Lifecycle Events](https://www.baeldung.com/jpa-entity-lifecycle-events) From 0dd8327c5903394120ad6f1ad015d6f0c61af7f4 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:44:35 +0530 Subject: [PATCH 020/162] backlink updated --- core-java-modules/core-java-concurrency-basic/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-basic/README.md b/core-java-modules/core-java-concurrency-basic/README.md index f1aa748c6b..137251b46a 100644 --- a/core-java-modules/core-java-concurrency-basic/README.md +++ b/core-java-modules/core-java-concurrency-basic/README.md @@ -9,5 +9,5 @@ This module contains articles about basic Java concurrency - [How to Kill a Java Thread](https://www.baeldung.com/java-thread-stop) - [ExecutorService – Waiting for Threads to Finish](https://www.baeldung.com/java-executor-wait-for-threads) - [Runnable vs. Callable in Java](https://www.baeldung.com/java-runnable-callable) -- [What is Thread-Safety and How to Achieve it?](https://www.baeldung.com/java-thread-safety) +- [What Is Thread-Safety and How to Achieve It?](https://www.baeldung.com/java-thread-safety) - [[Next -->]](/core-java-modules/core-java-concurrency-basic-2) From ca9a6b3236b58a3e6a6bdcbc49bb761cea85371e Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:45:57 +0530 Subject: [PATCH 021/162] backlink updated --- core-java-modules/core-java-string-algorithms/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-algorithms/README.md b/core-java-modules/core-java-string-algorithms/README.md index e8c8e32da8..97c870801a 100644 --- a/core-java-modules/core-java-string-algorithms/README.md +++ b/core-java-modules/core-java-string-algorithms/README.md @@ -9,7 +9,7 @@ This module contains articles about string-related algorithms. - [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords) - [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char) - [How to Reverse a String in Java](https://www.baeldung.com/java-reverse-string) -- [Check if a String is a Pangram in Java](https://www.baeldung.com/java-string-pangram) +- [Check if a String Is a Pangram in Java](https://www.baeldung.com/java-string-pangram) - [Check If a String Contains Multiple Keywords in Java](https://www.baeldung.com/string-contains-multiple-words) - [Checking If a String Is a Repeated Substring](https://www.baeldung.com/java-repeated-substring) - [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis) From 3d364840015bd39ce56dfeee8a2a8599ba3b63f6 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Tue, 30 May 2023 17:47:55 +0530 Subject: [PATCH 022/162] backlink updated --- core-java-modules/core-java-string-operations-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md index f95b002906..871b5525cd 100644 --- a/core-java-modules/core-java-string-operations-2/README.md +++ b/core-java-modules/core-java-string-operations-2/README.md @@ -3,7 +3,7 @@ This module contains articles about string operations. ### Relevant Articles: -- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation) +- [Concatenating Strings in Java](https://www.baeldung.com/java-strings-concatenation) - [Checking for Empty or Blank Strings in Java](https://www.baeldung.com/java-blank-empty-strings) - [String Initialization in Java](https://www.baeldung.com/java-string-initialization) - [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case) From c85eebd0563123f43d271c98ee1f3ac009e4ffc0 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:43:45 +0530 Subject: [PATCH 023/162] backlink updated --- algorithms-modules/algorithms-miscellaneous-4/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms-modules/algorithms-miscellaneous-4/README.md b/algorithms-modules/algorithms-miscellaneous-4/README.md index e2ae542bf8..757476faed 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/README.md +++ b/algorithms-modules/algorithms-miscellaneous-4/README.md @@ -8,7 +8,7 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. - [Check If a String Contains All The Letters of The Alphabet with Java](https://www.baeldung.com/java-string-contains-all-letters) - [Find the Middle Element of a Linked List in Java](https://www.baeldung.com/java-linked-list-middle-element) - [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) -- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters) +- [Find the Longest Substring Without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters) - [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations) - [Find the Smallest Missing Integer in an Array](https://www.baeldung.com/java-smallest-missing-integer-in-array) - [Permutations of a String in Java](https://www.baeldung.com/java-string-permutations) From d6c8acde5a7c53ee4b1c89805beaac58801dab5b Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:46:34 +0530 Subject: [PATCH 024/162] backlink updated --- core-java-modules/core-java-string-algorithms-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-algorithms-2/README.md b/core-java-modules/core-java-string-algorithms-2/README.md index 5d39291cfb..dbfbb3ef3c 100644 --- a/core-java-modules/core-java-string-algorithms-2/README.md +++ b/core-java-modules/core-java-string-algorithms-2/README.md @@ -6,7 +6,7 @@ This module contains articles about string-related algorithms. - [How to Remove the Last Character of a String?](https://www.baeldung.com/java-remove-last-character-of-string) - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex) -- [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) +- [Remove or Replace Part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) - [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) - [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array) - [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string) From 5daa7cb72218d2fe165ac48e1d278ffbc9ba7a95 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:47:50 +0530 Subject: [PATCH 025/162] backlink updated --- core-java-modules/core-java-datetime-string/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-datetime-string/README.md b/core-java-modules/core-java-datetime-string/README.md index e22e807591..74bdee6ca7 100644 --- a/core-java-modules/core-java-datetime-string/README.md +++ b/core-java-modules/core-java-datetime-string/README.md @@ -9,7 +9,7 @@ This module contains articles about parsing and formatting Java date and time ob - [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) -- [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp) +- [Convert Between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp) - [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date) - [Format a Milliseconds Duration to HH:MM:SS](https://www.baeldung.com/java-ms-to-hhmmss) - [Format Instant to String in Java](https://www.baeldung.com/java-instant-to-string) From cec01e1aed4fd49575f6d392b3d33b8a271d2ba7 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:49:39 +0530 Subject: [PATCH 026/162] backlink updated --- .../core-java-arrays-operations-advanced/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-arrays-operations-advanced/README.md b/core-java-modules/core-java-arrays-operations-advanced/README.md index 808696b580..1f55338644 100644 --- a/core-java-modules/core-java-arrays-operations-advanced/README.md +++ b/core-java-modules/core-java-arrays-operations-advanced/README.md @@ -7,7 +7,7 @@ This module contains articles about advanced operations on arrays in Java. They - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) - [Arrays.deepEquals](https://www.baeldung.com/java-arrays-deepequals) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) -- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) +- [Intersection Between Two Integer Arrays](https://www.baeldung.com/java-array-intersection) - [Comparing Arrays in Java](https://www.baeldung.com/java-comparing-arrays) - [Concatenate Two Arrays in Java](https://www.baeldung.com/java-concatenate-arrays) - [Performance of System.arraycopy() vs. Arrays.copyOf()](https://www.baeldung.com/java-system-arraycopy-arrays-copyof-performance) From 148511608bbcf6d13a8a5e75cc01936a2daf3be7 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:51:11 +0530 Subject: [PATCH 027/162] backlink updated --- core-java-modules/core-java-collections-list-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-list-2/README.md b/core-java-modules/core-java-collections-list-2/README.md index 2e43f610a9..e2f56b6c52 100644 --- a/core-java-modules/core-java-collections-list-2/README.md +++ b/core-java-modules/core-java-collections-list-2/README.md @@ -4,7 +4,7 @@ This module contains articles about the Java List collection ### Relevant Articles: - [Check If Two Lists are Equal in Java](https://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) -- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) +- [Java 8 Streams: Find Items From One List Based on Values From Another List](https://www.baeldung.com/java-streams-find-list-items) - [A Guide to the Java LinkedList](https://www.baeldung.com/java-linkedlist) - [Java List UnsupportedOperationException](https://www.baeldung.com/java-list-unsupported-operation-exception) - [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) From 30c571ad67484f94cc7c0b835d002509a77abd57 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:53:10 +0530 Subject: [PATCH 028/162] backlink updated --- core-java-modules/core-java-lang-operators/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-operators/README.md b/core-java-modules/core-java-lang-operators/README.md index 3e2afd1489..52906f292e 100644 --- a/core-java-modules/core-java-lang-operators/README.md +++ b/core-java-modules/core-java-lang-operators/README.md @@ -4,7 +4,7 @@ This module contains articles about Java operators ## Relevant Articles: - [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator) -- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) +- [Ternary Operator in Java](https://www.baeldung.com/java-ternary-operator) - [The Modulo Operator in Java](https://www.baeldung.com/modulo-java) - [Java instanceof Operator](https://www.baeldung.com/java-instanceof) - [A Guide to Increment and Decrement Unary Operators in Java](https://www.baeldung.com/java-unary-operators) From 889bc4ae8cc10ed8a5ad5c0fcfc423ee4c82c2e4 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:55:41 +0530 Subject: [PATCH 029/162] backlink updated --- spring-core/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-core/README.md b/spring-core/README.md index ffcbf4757b..8e85ae44f3 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -8,7 +8,7 @@ This module contains articles about core Spring functionality. - [BeanNameAware and BeanFactoryAware Interfaces in Spring](https://www.baeldung.com/spring-bean-name-factory-aware) - [Access a File from the Classpath in a Spring Application](https://www.baeldung.com/spring-classpath-file-access) - [Spring Application Context Events](https://www.baeldung.com/spring-context-events) -- [What is a Spring Bean?](https://www.baeldung.com/spring-bean) +- [What Is a Spring Bean?](https://www.baeldung.com/spring-bean) - [Spring PostConstruct and PreDestroy Annotations](https://www.baeldung.com/spring-postconstruct-predestroy) - [Intro to the Spring ClassPathXmlApplicationContext](http://www.baeldung.com/spring-classpathxmlapplicationcontext) - More articles: [[next -->]](../spring-core-2) From fae6ad80ffac970f48298bfdf336e2c917d397a4 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:57:10 +0530 Subject: [PATCH 030/162] backlink updated --- core-java-modules/core-java-lang-math-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-math-2/README.md b/core-java-modules/core-java-lang-math-2/README.md index 5e1dc5af0e..9567ea6fb6 100644 --- a/core-java-modules/core-java-lang-math-2/README.md +++ b/core-java-modules/core-java-lang-math-2/README.md @@ -6,7 +6,7 @@ - [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) - [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm) -- [Check If Two Rectangles Overlap In Java](https://www.baeldung.com/java-check-if-two-rectangles-overlap) +- [Check if Two Rectangles Overlap in Java](https://www.baeldung.com/java-check-if-two-rectangles-overlap) - [Calculate the Distance Between Two Points in Java](https://www.baeldung.com/java-distance-between-two-points) - [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines) - [Round Up to the Nearest Hundred in Java](https://www.baeldung.com/java-round-up-nearest-hundred) From 494d78beb07c481aa813b58519bf4928a6ebfa85 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 15:58:49 +0530 Subject: [PATCH 031/162] backlink updated --- algorithms-modules/algorithms-miscellaneous-4/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms-modules/algorithms-miscellaneous-4/README.md b/algorithms-modules/algorithms-miscellaneous-4/README.md index 757476faed..6f1b6a66b9 100644 --- a/algorithms-modules/algorithms-miscellaneous-4/README.md +++ b/algorithms-modules/algorithms-miscellaneous-4/README.md @@ -5,7 +5,7 @@ This module contains articles about algorithms. Some classes of algorithms, e.g. ### Relevant articles: - [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm) -- [Check If a String Contains All The Letters of The Alphabet with Java](https://www.baeldung.com/java-string-contains-all-letters) +- [Check if a String Contains All the Letters of the Alphabet With Java](https://www.baeldung.com/java-string-contains-all-letters) - [Find the Middle Element of a Linked List in Java](https://www.baeldung.com/java-linked-list-middle-element) - [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) - [Find the Longest Substring Without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters) From e2ed41cd784acebd38c5ca5bc3a0a13572ddd458 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:02:45 +0530 Subject: [PATCH 032/162] backlink updated --- core-java-modules/core-java-lang-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md index bf87393b19..2d69ef23c2 100644 --- a/core-java-modules/core-java-lang-2/README.md +++ b/core-java-modules/core-java-lang-2/README.md @@ -3,7 +3,7 @@ This module contains articles about core features in the Java language ### Relevant Articles: -- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) +- [Java Primitives Versus Objects](https://www.baeldung.com/java-primitives-vs-objects) - [Command-Line Arguments in Java](https://www.baeldung.com/java-command-line-arguments) - [What Is a Pojo Class?](baeldung.com/java-pojo-class) - [Java Default Parameters Using Method Overloading](https://www.baeldung.com/java-default-parameters-method-overloading) From 92539f92df5e510abc97277fecbb9338a94e66b4 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:03:54 +0530 Subject: [PATCH 033/162] backlink updated --- apache-cxf-modules/sse-jaxrs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-cxf-modules/sse-jaxrs/README.md b/apache-cxf-modules/sse-jaxrs/README.md index 4d39560b46..ee85940b8a 100644 --- a/apache-cxf-modules/sse-jaxrs/README.md +++ b/apache-cxf-modules/sse-jaxrs/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Server-Sent Events (SSE) In JAX-RS](https://www.baeldung.com/java-ee-jax-rs-sse) +- [Server-Sent Events (SSE) in JAX-RS](https://www.baeldung.com/java-ee-jax-rs-sse) From b1746c03028bc437dc4a05eb315a98fe44db4096 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:05:37 +0530 Subject: [PATCH 034/162] backlink updated --- core-java-modules/core-java-date-operations-1/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-date-operations-1/README.md b/core-java-modules/core-java-date-operations-1/README.md index b63fab63db..8c171177ee 100644 --- a/core-java-modules/core-java-date-operations-1/README.md +++ b/core-java-modules/core-java-date-operations-1/README.md @@ -10,6 +10,6 @@ This module contains articles about date operations in Java. - [Handling Daylight Savings Time in Java](http://www.baeldung.com/java-daylight-savings) - [Calculate Age in Java](http://www.baeldung.com/java-get-age) - [Increment Date in Java](http://www.baeldung.com/java-increment-date) -- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date) +- [Add Hours to a Date in Java](https://www.baeldung.com/java-add-hours-date) - [Introduction to Joda-Time](http://www.baeldung.com/joda-time) -- [[Next -->]](/core-java-modules/core-java-date-operations-2) \ No newline at end of file +- [[Next -->]](/core-java-modules/core-java-date-operations-2) From bcf40e54978f56c379af661feee286d62f2a9f3a Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:07:51 +0530 Subject: [PATCH 035/162] backlink updated --- core-java-modules/core-java-arrays-multidimensional/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-arrays-multidimensional/README.md b/core-java-modules/core-java-arrays-multidimensional/README.md index d92747a4fb..d162eca24a 100644 --- a/core-java-modules/core-java-arrays-multidimensional/README.md +++ b/core-java-modules/core-java-arrays-multidimensional/README.md @@ -3,5 +3,5 @@ This module contains articles about multidimensional arrays in Java ### Relevant Articles: -- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) -- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array) \ No newline at end of file +- [Multi-Dimensional Arrays in Java](https://www.baeldung.com/java-jagged-arrays) +- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array) From ef09e66dd4595a65d345f52c109347759ba35bf9 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:09:40 +0530 Subject: [PATCH 036/162] backlink updated --- patterns-modules/design-patterns-structural/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patterns-modules/design-patterns-structural/README.md b/patterns-modules/design-patterns-structural/README.md index 996b500842..7a9c7acf4d 100644 --- a/patterns-modules/design-patterns-structural/README.md +++ b/patterns-modules/design-patterns-structural/README.md @@ -1,7 +1,7 @@ ### Relevant Articles: - [Facade Design Pattern in Java](https://www.baeldung.com/java-facade-pattern) - [Proxy, Decorator, Adapter and Bridge Patterns](https://www.baeldung.com/java-structural-design-patterns) -- [Composite Design pattern in Java](https://www.baeldung.com/java-composite-pattern) +- [Composite Design Pattern in Java](https://www.baeldung.com/java-composite-pattern) - [The Decorator Pattern in Java](https://www.baeldung.com/java-decorator-pattern) - [The Adapter Pattern in Java](https://www.baeldung.com/java-adapter-pattern) - [The Proxy Pattern in Java](https://www.baeldung.com/java-proxy-pattern) From f3ef8b2f8562f0393c2a383918f0d63896cc3c69 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:16:15 +0530 Subject: [PATCH 037/162] backlink updated --- testing-modules/junit-5-basics/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/junit-5-basics/README.md b/testing-modules/junit-5-basics/README.md index 31eb75a792..03b0d4269a 100644 --- a/testing-modules/junit-5-basics/README.md +++ b/testing-modules/junit-5-basics/README.md @@ -7,5 +7,5 @@ - [@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll](http://www.baeldung.com/junit-before-beforeclass-beforeeach-beforeall) - [JUnit 5 @Test Annotation](http://www.baeldung.com/junit-5-test-annotation) - [Migrating from JUnit 4 to JUnit 5](http://www.baeldung.com/junit-5-migration) -- [Assert an Exception is Thrown in JUnit 4 and 5](http://www.baeldung.com/junit-assert-exception) +- [Assert an Exception Is Thrown in JUnit 4 and 5](https://www.baeldung.com/junit-assert-exception) - [The Difference Between Failure and Error in JUnit](https://www.baeldung.com/junit-failure-vs-error) From 94c80dc35b8a883913b9b11441fa9eb5d46c520e Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:17:42 +0530 Subject: [PATCH 038/162] backlink updated --- .../spring-security-web-rest-basic-auth/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/README.md b/spring-security-modules/spring-security-web-rest-basic-auth/README.md index 097e89b138..9070179676 100644 --- a/spring-security-modules/spring-security-web-rest-basic-auth/README.md +++ b/spring-security-modules/spring-security-web-rest-basic-auth/README.md @@ -11,7 +11,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Basic Authentication with the RestTemplate](https://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring) - [A Custom Filter in the Spring Security Filter Chain](https://www.baeldung.com/spring-security-custom-filter) - [Spring Security Basic Authentication](https://www.baeldung.com/spring-security-basic-authentication) -- [New Password Storage In Spring Security 5](https://www.baeldung.com/spring-security-5-password-storage) +- [New Password Storage in Spring Security 5](https://www.baeldung.com/spring-security-5-password-storage) - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder) - [Basic Authentication With Postman](https://www.baeldung.com/java-postman-authentication) From e3558c3d9a0c4bcdbdb2859bc71ac11b3db65007 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:22:32 +0530 Subject: [PATCH 039/162] backlink updated --- spring-integration/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration/README.md b/spring-integration/README.md index ad46082a04..710af2a8c7 100644 --- a/spring-integration/README.md +++ b/spring-integration/README.md @@ -4,7 +4,7 @@ This module contains articles about Spring Integration ### Relevant Articles: - [Introduction to Spring Integration](https://www.baeldung.com/spring-integration) -- [Security In Spring Integration](https://www.baeldung.com/spring-integration-security) +- [Security in Spring Integration](https://www.baeldung.com/spring-integration-security) - [Spring Integration Java DSL](https://www.baeldung.com/spring-integration-java-dsl) - [Using Subflows in Spring Integration](https://www.baeldung.com/spring-integration-subflows) - [Transaction Support in Spring Integration](https://www.baeldung.com/spring-integration-transaction) From a77d6a5d76ea1f7664ee4221668d0d1e3d879569 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:23:51 +0530 Subject: [PATCH 040/162] backlink updated --- core-java-modules/core-java-collections-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md index 5a9bae8f9f..fa4880bade 100644 --- a/core-java-modules/core-java-collections-2/README.md +++ b/core-java-modules/core-java-collections-2/README.md @@ -8,7 +8,7 @@ - [Join and Split Arrays and Collections in Java](https://www.baeldung.com/java-join-and-split) - [Java – Combine Multiple Collections](https://www.baeldung.com/java-combine-multiple-collections) - [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections) -- [Shuffling Collections In Java](https://www.baeldung.com/java-shuffle-collection) +- [Shuffling Collections in Java](https://www.baeldung.com/java-shuffle-collection) - [Sorting in Java](https://www.baeldung.com/java-sorting) - [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size) - [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) From 9d81f5f3410bf8bd724b1e516457d9cd576f2036 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:25:02 +0530 Subject: [PATCH 041/162] backlink updated --- core-java-modules/core-java-string-algorithms/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-algorithms/README.md b/core-java-modules/core-java-string-algorithms/README.md index 97c870801a..5a7abf074a 100644 --- a/core-java-modules/core-java-string-algorithms/README.md +++ b/core-java-modules/core-java-string-algorithms/README.md @@ -3,7 +3,7 @@ This module contains articles about string-related algorithms. ### Relevant Articles: -- [Check if a String is a Palindrome in Java](https://www.baeldung.com/java-palindrome) +- [Check if a String Is a Palindrome in Java](https://www.baeldung.com/java-palindrome) - [Count Occurrences of a Char in a String](https://www.baeldung.com/java-count-chars) - [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexof-find-string-occurrences) - [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords) From 449e4a3c14539c8624ef04fe37224a87d8f946d7 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:26:13 +0530 Subject: [PATCH 042/162] backlink updated --- core-java-modules/core-java-datetime-string/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-datetime-string/README.md b/core-java-modules/core-java-datetime-string/README.md index 74bdee6ca7..442c0d1ab2 100644 --- a/core-java-modules/core-java-datetime-string/README.md +++ b/core-java-modules/core-java-datetime-string/README.md @@ -4,7 +4,7 @@ This module contains articles about parsing and formatting Java date and time ob ### Relevant Articles: - [Check If a String Is a Valid Date in Java](https://www.baeldung.com/java-string-valid-date) -- [RegEx for matching Date Pattern in Java](http://www.baeldung.com/java-date-regular-expressions) +- [Regex for Matching Date Pattern in Java](https://www.baeldung.com/java-date-regular-expressions) - [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter) - [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) From 304916aaa04221864e59395915f82c1ee3e350e0 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:27:10 +0530 Subject: [PATCH 043/162] backlink updated --- core-java-modules/core-java-lang/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md index 963a1e623e..93b4c25fd9 100644 --- a/core-java-modules/core-java-lang/README.md +++ b/core-java-modules/core-java-lang/README.md @@ -5,7 +5,7 @@ This module contains articles about core features in the Java language ### Relevant Articles: - [Generate equals() and hashCode() with Eclipse](https://www.baeldung.com/java-eclipse-equals-and-hashcode) - [Comparator and Comparable in Java](https://www.baeldung.com/java-comparator-comparable) -- [Recursion In Java](https://www.baeldung.com/java-recursion) +- [Recursion in Java](https://www.baeldung.com/java-recursion) - [A Guide to the finalize Method in Java](https://www.baeldung.com/java-finalize) - [Quick Guide to java.lang.System](https://www.baeldung.com/java-lang-system) - [Using Java Assertions](https://www.baeldung.com/java-assert) From 7dd560cf8573e548c7f887b1c2b4b22a9d93ff8a Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:28:25 +0530 Subject: [PATCH 044/162] backlink updated --- core-java-modules/core-java-datetime-string/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-datetime-string/README.md b/core-java-modules/core-java-datetime-string/README.md index 442c0d1ab2..bd1a844654 100644 --- a/core-java-modules/core-java-datetime-string/README.md +++ b/core-java-modules/core-java-datetime-string/README.md @@ -8,7 +8,7 @@ This module contains articles about parsing and formatting Java date and time ob - [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter) - [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) -- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) +- [Display All Time Zones With GMT and UTC in Java](https://www.baeldung.com/java-time-zones) - [Convert Between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp) - [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date) - [Format a Milliseconds Duration to HH:MM:SS](https://www.baeldung.com/java-ms-to-hhmmss) From 25af10719f5bfe0c023ebf7dd1fb802058ea044d Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:33:31 +0530 Subject: [PATCH 045/162] backlink updated --- core-java-modules/core-java-networking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md index 4038e9803a..afccec0fe0 100644 --- a/core-java-modules/core-java-networking/README.md +++ b/core-java-modules/core-java-networking/README.md @@ -12,6 +12,6 @@ This module contains articles about networking in Java - [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) - [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) - [Guide to Java URL Encoding/Decoding](http://www.baeldung.com/java-url-encoding-decoding) -- [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) +- [Difference Between URL and URI](https://www.baeldung.com/java-url-vs-uri) - [Read an InputStream using the Java Server Socket](https://www.baeldung.com/java-inputstream-server-socket) - [[More -->]](/core-java-modules/core-java-networking-2) From 9b85fbe62896e26bd947fe146a59ede730a6d77b Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:35:19 +0530 Subject: [PATCH 046/162] backlink updated --- core-java-modules/core-java-serialization/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-serialization/README.md b/core-java-modules/core-java-serialization/README.md index fc6cfcf134..ae7da3d2cf 100644 --- a/core-java-modules/core-java-serialization/README.md +++ b/core-java-modules/core-java-serialization/README.md @@ -6,4 +6,4 @@ - [Introduction to Java Serialization](http://www.baeldung.com/java-serialization) - [Deserialization Vulnerabilities in Java](https://www.baeldung.com/java-deserialization-vulnerabilities) - [Serialization Validation in Java](https://www.baeldung.com/java-validate-serializable) -- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) +- [What Is the serialVersionUID?](https://www.baeldung.com/java-serial-version-uid) From 7a6bbd8816e7da972f8b92ba47afd492c4c059a4 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:36:37 +0530 Subject: [PATCH 047/162] backlink updated --- core-java-modules/core-java-collections-maps-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-maps-2/README.md b/core-java-modules/core-java-collections-maps-2/README.md index f49ba25c8c..befe6ab410 100644 --- a/core-java-modules/core-java-collections-maps-2/README.md +++ b/core-java-modules/core-java-collections-maps-2/README.md @@ -8,7 +8,7 @@ This module contains articles about Map data structures in Java. - [A Guide to Java HashMap](https://www.baeldung.com/java-hashmap) - [Guide to WeakHashMap in Java](https://www.baeldung.com/java-weakhashmap) - [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion) -- [Iterate over a Map in Java](https://www.baeldung.com/java-iterate-map) +- [Iterate Over a Map in Java](https://www.baeldung.com/java-iterate-map) - [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps) - [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) - [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) From 8e18b010fca9544f861aeb0981283eeaf477554c Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:38:34 +0530 Subject: [PATCH 048/162] backlink updated --- core-java-modules/core-java-streams/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md index b950325e40..360f7190ea 100644 --- a/core-java-modules/core-java-streams/README.md +++ b/core-java-modules/core-java-streams/README.md @@ -12,5 +12,5 @@ This module contains articles about the Stream API in Java. - [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda) - [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count) - [Summing Numbers with Java Streams](https://www.baeldung.com/java-stream-sum) -- [How to Find all Getters Returning Null](https://www.baeldung.com/java-getters-returning-null) +- [How to Find All Getters Returning Null](https://www.baeldung.com/java-getters-returning-null) - More articles: [[next -->]](/../core-java-streams-2) From 0d31bf6752eeffad8477280a335013b6fff72ca3 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:40:09 +0530 Subject: [PATCH 049/162] backlink updated --- core-java-modules/core-java-reflection/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-reflection/README.md b/core-java-modules/core-java-reflection/README.md index b823f43606..e7c931575a 100644 --- a/core-java-modules/core-java-reflection/README.md +++ b/core-java-modules/core-java-reflection/README.md @@ -3,7 +3,7 @@ - [Void Type in Java](https://www.baeldung.com/java-void-type) - [Retrieve Fields from a Java Class Using Reflection](https://www.baeldung.com/java-reflection-class-fields) - [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection) -- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params) +- [Changing Annotation Parameters at Runtime](https://www.baeldung.com/java-reflection-change-annotation-params) - [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies) - [What Causes java.lang.reflect.InvocationTargetException?](https://www.baeldung.com/java-lang-reflect-invocationtargetexception) - [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method) From 8fb1a1ba766636eeed46db6af2125e7fb59689d5 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:43:10 +0530 Subject: [PATCH 050/162] backlink updated --- core-java-modules/core-java-lang-oop-types/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-types/README.md b/core-java-modules/core-java-lang-oop-types/README.md index 7978cb7730..ec2230f06a 100644 --- a/core-java-modules/core-java-lang-oop-types/README.md +++ b/core-java-modules/core-java-lang-oop-types/README.md @@ -8,7 +8,7 @@ This module contains articles about types in Java - [Guide to the this Java Keyword](https://www.baeldung.com/java-this) - [Nested Classes in Java](https://www.baeldung.com/java-nested-classes) - [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces) -- [Iterating over Enum Values in Java](https://www.baeldung.com/java-enum-iteration) +- [Iterating Over Enum Values in Java](https://www.baeldung.com/java-enum-iteration) - [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values) - [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums) - [Determine if an Object Is of Primitive Type](https://www.baeldung.com/java-object-primitive-type) From 105b97ba770894b83f973b28c57f442185971250 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:45:32 +0530 Subject: [PATCH 051/162] backlink updated --- core-java-modules/core-java-concurrency-collections/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-collections/README.md b/core-java-modules/core-java-concurrency-collections/README.md index 94f93d1bfd..1ae50531f0 100644 --- a/core-java-modules/core-java-concurrency-collections/README.md +++ b/core-java-modules/core-java-concurrency-collections/README.md @@ -7,7 +7,7 @@ This module contains articles about concurrent Java collections - [A Guide to ConcurrentMap](http://www.baeldung.com/java-concurrent-map) - [Guide to PriorityBlockingQueue in Java](http://www.baeldung.com/java-priority-blocking-queue) - [Avoiding the ConcurrentModificationException in Java](http://www.baeldung.com/java-concurrentmodificationexception) -- [Custom Thread Pools In Java 8 Parallel Streams](http://www.baeldung.com/java-8-parallel-streams-custom-threadpool) +- [Custom Thread Pools in Java 8 Parallel Streams](https://www.baeldung.com/java-8-parallel-streams-custom-threadpool) - [Guide to DelayQueue](http://www.baeldung.com/java-delay-queue) - [A Guide to Java SynchronousQueue](http://www.baeldung.com/java-synchronous-queue) - [Guide to the ConcurrentSkipListMap](http://www.baeldung.com/java-concurrent-skip-list-map) From 000c48f294cdf562877f36d1c020187e96a7c6a7 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:56:09 +0530 Subject: [PATCH 052/162] backlink updated --- spring-core-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-core-3/README.md b/spring-core-3/README.md index ed88561e10..dcdbbd3a67 100644 --- a/spring-core-3/README.md +++ b/spring-core-3/README.md @@ -6,7 +6,7 @@ This module contains articles about core Spring functionality - [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) - [Guide to the Spring BeanFactory](https://www.baeldung.com/spring-beanfactory) -- [How to use the Spring FactoryBean?](https://www.baeldung.com/spring-factorybean) +- [How to Use the Spring FactoryBean?](https://www.baeldung.com/spring-factorybean) - [Design Patterns in the Spring Framework](https://www.baeldung.com/spring-framework-design-patterns) - [Difference Between BeanFactory and ApplicationContext](https://www.baeldung.com/spring-beanfactory-vs-applicationcontext) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) From 2123276c3ab10a99d09a4a0be6c25f5901cbdaf3 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 16:59:22 +0530 Subject: [PATCH 053/162] backlink updated --- core-java-modules/core-java-networking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md index afccec0fe0..62730dd3e7 100644 --- a/core-java-modules/core-java-networking/README.md +++ b/core-java-modules/core-java-networking/README.md @@ -7,7 +7,7 @@ This module contains articles about networking in Java - [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server) - [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) - [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) -- [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java) +- [A Guide to HTTP Cookies in Java](https://www.baeldung.com/cookies-java) - [A Guide to the Java URL](http://www.baeldung.com/java-url) - [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) - [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) From 0902a64ca7bb6e907f17e696868262469c608bbc Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:01:08 +0530 Subject: [PATCH 054/162] backlink updated --- core-java-modules/core-java-networking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md index 62730dd3e7..893efa4c55 100644 --- a/core-java-modules/core-java-networking/README.md +++ b/core-java-modules/core-java-networking/README.md @@ -6,7 +6,7 @@ This module contains articles about networking in Java - [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server) - [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) -- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) +- [A Guide to UDP In Java](https://www.baeldung.com/udp-in-java) - [A Guide to HTTP Cookies in Java](https://www.baeldung.com/cookies-java) - [A Guide to the Java URL](http://www.baeldung.com/java-url) - [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) From 71c315f31126f9ad3b3112a688d4f89075d1b236 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:02:39 +0530 Subject: [PATCH 055/162] backlink updated --- web-modules/play-modules/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-modules/play-modules/README.md b/web-modules/play-modules/README.md index a28c3f7ad7..30f8342f95 100644 --- a/web-modules/play-modules/README.md +++ b/web-modules/play-modules/README.md @@ -4,5 +4,5 @@ This module contains articles about the Play Framework. ### Relevant Articles: - [REST API with Play Framework in Java](https://www.baeldung.com/rest-api-with-play) -- [Routing In Play Applications in Java](https://www.baeldung.com/routing-in-play) +- [Routing in Play Applications in Java](https://www.baeldung.com/routing-in-play) - [Introduction To Play In Java](https://www.baeldung.com/java-intro-to-the-play-framework) From 7a1669b941bf559dea1d8c902cd5ea65d40dff8d Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:03:49 +0530 Subject: [PATCH 056/162] backlink updated --- web-modules/play-modules/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-modules/play-modules/README.md b/web-modules/play-modules/README.md index 30f8342f95..d1ac7eb2d4 100644 --- a/web-modules/play-modules/README.md +++ b/web-modules/play-modules/README.md @@ -5,4 +5,4 @@ This module contains articles about the Play Framework. ### Relevant Articles: - [REST API with Play Framework in Java](https://www.baeldung.com/rest-api-with-play) - [Routing in Play Applications in Java](https://www.baeldung.com/routing-in-play) -- [Introduction To Play In Java](https://www.baeldung.com/java-intro-to-the-play-framework) +- [Introduction to Play in Java](https://www.baeldung.com/java-intro-to-the-play-framework) From 0fbb8466ab8645468c3c40fa134abdd7b19b44f8 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:05:41 +0530 Subject: [PATCH 057/162] backlink updated --- persistence-modules/spring-data-jpa-query-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-data-jpa-query-2/README.md b/persistence-modules/spring-data-jpa-query-2/README.md index 8005bc0e19..e091bc1d99 100644 --- a/persistence-modules/spring-data-jpa-query-2/README.md +++ b/persistence-modules/spring-data-jpa-query-2/README.md @@ -9,7 +9,7 @@ This module contains articles about querying data using Spring Data JPA . - [Hibernate Pagination](https://www.baeldung.com/hibernate-pagination) - [Sorting with Hibernate](https://www.baeldung.com/hibernate-sort) - [Stored Procedures with Hibernate](https://www.baeldung.com/stored-procedures-with-hibernate-tutorial) -- [Eager/Lazy Loading In Hibernate](https://www.baeldung.com/hibernate-lazy-eager-loading) +- [Eager/Lazy Loading in Hibernate](https://www.baeldung.com/hibernate-lazy-eager-loading) - [Auditing with JPA, Hibernate, and Spring Data JPA](https://www.baeldung.com/database-auditing-jpa) - More articles: [[<-- prev]](../spring-data-jpa-query)[[more -->]](../spring-data-jpa-query-3) From 899c36a21693749c1bdc35e5dafd901adc2e2ddc Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:07:22 +0530 Subject: [PATCH 058/162] backlink updated --- core-java-modules/core-java-collections-list-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-list-2/README.md b/core-java-modules/core-java-collections-list-2/README.md index e2f56b6c52..37e8ab0ee2 100644 --- a/core-java-modules/core-java-collections-list-2/README.md +++ b/core-java-modules/core-java-collections-list-2/README.md @@ -3,7 +3,7 @@ This module contains articles about the Java List collection ### Relevant Articles: -- [Check If Two Lists are Equal in Java](https://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) +- [Check if Two Lists Are Equal in Java](https://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) - [Java 8 Streams: Find Items From One List Based on Values From Another List](https://www.baeldung.com/java-streams-find-list-items) - [A Guide to the Java LinkedList](https://www.baeldung.com/java-linkedlist) - [Java List UnsupportedOperationException](https://www.baeldung.com/java-list-unsupported-operation-exception) From 69dd5ee7aa2df7d4214f69c79bd3d3661a1771c9 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:14:55 +0530 Subject: [PATCH 059/162] backlink updated --- jackson-modules/jackson-conversions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jackson-modules/jackson-conversions/README.md b/jackson-modules/jackson-conversions/README.md index 5984ad399a..55dcb60c29 100644 --- a/jackson-modules/jackson-conversions/README.md +++ b/jackson-modules/jackson-conversions/README.md @@ -5,7 +5,7 @@ This module contains articles about Jackson conversions. ### Relevant Articles: - [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array) - [Jackson Date](https://www.baeldung.com/jackson-serialize-dates) -- [Jackson – Working with Maps and nulls](https://www.baeldung.com/jackson-map-null-values-or-null-key) +- [Jackson – Working With Maps and Nulls](https://www.baeldung.com/jackson-map-null-values-or-null-key) - [Jackson – Decide What Fields Get Serialized/Deserialized](https://www.baeldung.com/jackson-field-serializable-deserializable-or-not) - [XML Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-xml-serialization-and-deserialization) - [Map Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-map) From 2a305525616f61359b16164d856a7a3cf4d3843f Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:17:50 +0530 Subject: [PATCH 060/162] backlink updated --- spring-boot-modules/spring-boot-actuator/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-modules/spring-boot-actuator/README.md b/spring-boot-modules/spring-boot-actuator/README.md index ea43377ed2..3af4634e44 100644 --- a/spring-boot-modules/spring-boot-actuator/README.md +++ b/spring-boot-modules/spring-boot-actuator/README.md @@ -12,4 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Health Indicators in Spring Boot](https://www.baeldung.com/spring-boot-health-indicators) - [How to Enable All Endpoints in Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuator-enable-endpoints) - [Spring Boot Startup Actuator Endpoint](https://www.baeldung.com/spring-boot-actuator-startup) -- [Metrics for your Spring REST API](https://www.baeldung.com/spring-rest-api-metrics) +- [Metrics for Your Spring REST API](https://www.baeldung.com/spring-rest-api-metrics) From 23a62499f881f351ef3d3435989b80efb401095a Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:20:13 +0530 Subject: [PATCH 061/162] backlink updated --- core-java-modules/core-java-collections-list/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md index 5144757c80..837454c36a 100644 --- a/core-java-modules/core-java-collections-list/README.md +++ b/core-java-modules/core-java-collections-list/README.md @@ -5,7 +5,7 @@ This module contains articles about the Java List collection ### Relevant Articles: - [Java – Get Random Item/Element From a List](http://www.baeldung.com/java-random-list-element) - [Removing all Nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list) -- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list) +- [Removing All Duplicates From a List in Java](https://www.baeldung.com/java-remove-duplicates-from-list) - [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list) - [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards) - [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list) From c1822f9c32a4e45eb4dadb96db110029b2a17680 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:23:33 +0530 Subject: [PATCH 062/162] backlink updated --- core-java-modules/core-java-collections-list/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md index 837454c36a..919c64270b 100644 --- a/core-java-modules/core-java-collections-list/README.md +++ b/core-java-modules/core-java-collections-list/README.md @@ -4,7 +4,7 @@ This module contains articles about the Java List collection ### Relevant Articles: - [Java – Get Random Item/Element From a List](http://www.baeldung.com/java-random-list-element) -- [Removing all Nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list) +- [Removing All Nulls From a List in Java](https://www.baeldung.com/java-remove-nulls-from-list) - [Removing All Duplicates From a List in Java](https://www.baeldung.com/java-remove-duplicates-from-list) - [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list) - [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards) From e2320e0a23735cdba0315ad135fe88f3aaaddd7a Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:24:54 +0530 Subject: [PATCH 063/162] backlink updated --- core-java-modules/core-java-collections-conversions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-collections-conversions/README.md b/core-java-modules/core-java-collections-conversions/README.md index 5dd1848ce0..21fe45a8ec 100644 --- a/core-java-modules/core-java-collections-conversions/README.md +++ b/core-java-modules/core-java-collections-conversions/README.md @@ -3,7 +3,7 @@ This module contains articles about conversions among Collection types and arrays in Java. ### Relevant Articles: -- [Converting between an Array and a List in Java](https://www.baeldung.com/convert-array-to-list-and-list-to-array) +- [Converting Between an Array and a List in Java](https://www.baeldung.com/convert-array-to-list-and-list-to-array) - [Converting Between an Array and a Set in Java](https://www.baeldung.com/convert-array-to-set-and-set-to-array) - [Convert a Map to an Array, List or Set in Java](https://www.baeldung.com/convert-map-values-to-array-list-set) - [Converting a List to String in Java](https://www.baeldung.com/java-list-to-string) From e2f19bfe2f773aac562b65940d778385affbe6e1 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:25:58 +0530 Subject: [PATCH 064/162] backlink updated --- jackson-modules/jackson-custom-conversions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jackson-modules/jackson-custom-conversions/README.md b/jackson-modules/jackson-custom-conversions/README.md index 2f45a2f43b..68a48511d9 100644 --- a/jackson-modules/jackson-custom-conversions/README.md +++ b/jackson-modules/jackson-custom-conversions/README.md @@ -5,6 +5,6 @@ This module contains articles about Jackson custom conversions. ### Relevant Articles: - [Jackson – Custom Serializer](https://www.baeldung.com/jackson-custom-serialization) - [Getting Started with Custom Deserialization in Jackson](https://www.baeldung.com/jackson-deserialization) -- [Serialize Only Fields that meet a Custom Criteria with Jackson](https://www.baeldung.com/jackson-serialize-field-custom-criteria) +- [Serialize Only Fields That Meet a Custom Criteria With Jackson](https://www.baeldung.com/jackson-serialize-field-custom-criteria) - [Calling Default Serializer from Custom Serializer in Jackson](https://www.baeldung.com/jackson-call-default-serializer-from-custom-serializer) - [OffsetDateTime Serialization With Jackson](https://www.baeldung.com/java-jackson-offsetdatetime) From 03a9338aa6f39dc775cd24b8e984642fef4e6816 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:28:06 +0530 Subject: [PATCH 065/162] backlink updated --- .../spring-security-web-mvc-custom/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-mvc-custom/README.md b/spring-security-modules/spring-security-web-mvc-custom/README.md index d8bd4cb3e0..6a38460b28 100644 --- a/spring-security-modules/spring-security-web-mvc-custom/README.md +++ b/spring-security-modules/spring-security-web-mvc-custom/README.md @@ -9,7 +9,7 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: - [Spring Security Remember Me](https://www.baeldung.com/spring-security-remember-me) -- [Redirect to Different Pages after Login with Spring Security](https://www.baeldung.com/spring-redirect-after-login) +- [Redirect to Different Pages After Login With Spring Security](https://www.baeldung.com/spring-redirect-after-login) - [Changing Spring Model Parameters with Handler Interceptor](https://www.baeldung.com/spring-model-parameters-with-handler-interceptor) - [Introduction to Spring MVC HandlerInterceptor](https://www.baeldung.com/spring-mvc-handlerinterceptor) - [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](https://www.baeldung.com/spring-mvc-custom-handler-interceptor) From 5a82b50f5aab812b99f8957d5795d1b7919c8d48 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:29:35 +0530 Subject: [PATCH 066/162] backlink updated --- spring-web-modules/spring-rest-testing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-web-modules/spring-rest-testing/README.md b/spring-web-modules/spring-rest-testing/README.md index 806e67b7ec..e043667160 100644 --- a/spring-web-modules/spring-rest-testing/README.md +++ b/spring-web-modules/spring-rest-testing/README.md @@ -10,7 +10,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Integration Testing with the Maven Cargo plugin](https://www.baeldung.com/integration-testing-with-the-maven-cargo-plugin) +- [Integration Testing With the Maven Cargo Plugin](https://www.baeldung.com/integration-testing-with-the-maven-cargo-plugin) - [Testing Exceptions with Spring MockMvc](https://www.baeldung.com/spring-mvc-test-exceptions) ### Build the Project From cef108190d9e66726cde0d864b12875bea17a1c9 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:33:18 +0530 Subject: [PATCH 067/162] backlink updated --- core-java-modules/core-java-arrays-guides/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-arrays-guides/README.md b/core-java-modules/core-java-arrays-guides/README.md index ed10df5b00..0af77980af 100644 --- a/core-java-modules/core-java-arrays-guides/README.md +++ b/core-java-modules/core-java-arrays-guides/README.md @@ -5,7 +5,7 @@ This module contains complete guides about arrays in Java ### Relevant Articles: - [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) - [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays) -- [What is [Ljava.lang.Object;?](https://www.baeldung.com/java-tostring-array) +- [What Is [Ljava.lang.Object;?](https://www.baeldung.com/java-tostring-array) - [Guide to ArrayStoreException](https://www.baeldung.com/java-arraystoreexception) - [Creating a Generic Array in Java](https://www.baeldung.com/java-generic-array) - [Maximum Size of Java Arrays](https://www.baeldung.com/java-arrays-max-size) From 1664ea8fbb1ca3e8756f07a4f8067950155f3cb4 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:38:24 +0530 Subject: [PATCH 068/162] backlink updated --- libraries-data-db/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-data-db/README.md b/libraries-data-db/README.md index 1062449693..a3a126c7a5 100644 --- a/libraries-data-db/README.md +++ b/libraries-data-db/README.md @@ -7,7 +7,7 @@ This module contains articles about database-related data processing libraries. - [Introduction to Reladomo](https://www.baeldung.com/reladomo) - [Introduction to ORMLite](https://www.baeldung.com/ormlite) - [Guide to Java Data Objects](https://www.baeldung.com/jdo) -- [Intro to JDO Queries 2/2](https://www.baeldung.com/jdo-queries) +- [Intro to JDO Queries](https://www.baeldung.com/jdo-queries) - [Introduction to HikariCP](https://www.baeldung.com/hikaricp) - [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm) - [Introduction to Debezium](https://www.baeldung.com/debezium-intro) From 10e0562767dd39bb05f864ed9ff72395f8b15f10 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Wed, 31 May 2023 17:40:51 +0530 Subject: [PATCH 069/162] backlink updated --- javaxval/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javaxval/README.md b/javaxval/README.md index b7e19d5794..7420580f8e 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -4,11 +4,11 @@ This module contains articles about Bean Validation. ### Relevant Articles: - [Java Bean Validation Basics](https://www.baeldung.com/javax-validation) -- [Validating Container Elements with Bean Validation 2.0](https://www.baeldung.com/bean-validation-container-elements) +- [Validating Container Elements with Jakarta Bean Validation 3.0](https://www.baeldung.com/bean-validation-container-elements) - [Validations for Enum Types](https://www.baeldung.com/javax-validations-enums) - [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation) - [Grouping Javax Validation Constraints](https://www.baeldung.com/javax-validation-groups) - [Constraint Composition with Bean Validation](https://www.baeldung.com/java-bean-validation-constraint-composition) - [Using @NotNull on a Method Parameter](https://www.baeldung.com/java-notnull-method-parameter) - [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) -- More articles: [[next -->]](../javaxval-2) \ No newline at end of file +- More articles: [[next -->]](../javaxval-2) From 7186e4d604f30af944355f0acdb10ce8db1bd27d Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Wed, 31 May 2023 09:40:20 -0300 Subject: [PATCH 070/162] draft 1 --- libraries-apache-commons-2/README.md | 7 +++ libraries-apache-commons-2/log4j.properties | 1 + libraries-apache-commons-2/pom.xml | 39 +++++++++++++ .../baeldung/commons/untar/TarExtractor.java | 39 +++++++++++++ .../commons/untar/impl/TarExtractorAnt.java | 37 ++++++++++++ .../impl/TarExtractorCommonsCompress.java | 38 ++++++++++++ .../commons/untar/impl/TarExtractorVfs.java | 54 ++++++++++++++++++ .../src/main/resources/logback.xml | 13 +++++ .../com/baeldung/commons/untar/Resources.java | 8 +++ .../untar/TarExtractorAntUnitTest.java | 37 ++++++++++++ .../TarExtractorCommonsCompressUnitTest.java | 37 ++++++++++++ .../untar/TarExtractorVfsUnitTest.java | 37 ++++++++++++ .../src/test/resources/untar/test.tar | Bin 0 -> 5632 bytes .../src/test/resources/untar/test.tar.gz | Bin 0 -> 211 bytes libraries-apache-commons/README.md | 3 +- pom.xml | 2 + 16 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 libraries-apache-commons-2/README.md create mode 100644 libraries-apache-commons-2/log4j.properties create mode 100644 libraries-apache-commons-2/pom.xml create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java create mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java create mode 100644 libraries-apache-commons-2/src/main/resources/logback.xml create mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java create mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java create mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java create mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java create mode 100644 libraries-apache-commons-2/src/test/resources/untar/test.tar create mode 100644 libraries-apache-commons-2/src/test/resources/untar/test.tar.gz diff --git a/libraries-apache-commons-2/README.md b/libraries-apache-commons-2/README.md new file mode 100644 index 0000000000..7f91a737d5 --- /dev/null +++ b/libraries-apache-commons-2/README.md @@ -0,0 +1,7 @@ +## Apache Commons + +This module contains articles about Apache Commons libraries. + +### Relevant articles + +- More articles: [[<--prev]](../libraries-apache-commons) \ No newline at end of file diff --git a/libraries-apache-commons-2/log4j.properties b/libraries-apache-commons-2/log4j.properties new file mode 100644 index 0000000000..2173c5d96f --- /dev/null +++ b/libraries-apache-commons-2/log4j.properties @@ -0,0 +1 @@ +log4j.rootLogger=INFO, stdout diff --git a/libraries-apache-commons-2/pom.xml b/libraries-apache-commons-2/pom.xml new file mode 100644 index 0000000000..c8392ac561 --- /dev/null +++ b/libraries-apache-commons-2/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + libraries-apache-commons-2 + libraries-apache-commons-2 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.apache.commons + commons-compress + ${commons-compress.version} + + + org.apache.ant + ant + ${ant.version} + + + org.apache.commons + commons-vfs2 + ${commons-vfs2.version} + + + + + 1.23.0 + 1.10.13 + 2.9.0 + + + diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java new file mode 100644 index 0000000000..bd19a872f6 --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java @@ -0,0 +1,39 @@ +package com.baeldung.commons.untar; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +public abstract class TarExtractor { + + private InputStream tarStream; + private boolean gzip; + private Path destination; + + public TarExtractor(InputStream in, boolean gzip, Path destination) throws IOException { + this.tarStream = in; + this.gzip = gzip; + this.destination = destination; + + Files.createDirectories(destination); + } + + public TarExtractor(Path tarFile, Path destination) throws IOException { + this(Files.newInputStream(tarFile), tarFile.endsWith("gz"), destination); + } + + public Path getDestination() { + return destination; + } + + public InputStream getTarStream() { + return tarStream; + } + + public boolean isGzip() { + return gzip; + } + + abstract public void untar() throws IOException; +} diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java new file mode 100644 index 0000000000..5bb4d74beb --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java @@ -0,0 +1,37 @@ +package com.baeldung.commons.untar.impl; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.zip.GZIPInputStream; + +import org.apache.tools.tar.TarEntry; +import org.apache.tools.tar.TarInputStream; + +import com.baeldung.commons.untar.TarExtractor; + +public class TarExtractorAnt extends TarExtractor { + + public TarExtractorAnt(InputStream in, boolean gzip, Path destination) throws IOException { + super(in, gzip, destination); + } + + @Override + public void untar() throws IOException { + try (TarInputStream tar = new TarInputStream(new BufferedInputStream( // + isGzip() ? new GZIPInputStream(getTarStream()) : getTarStream()))) { + TarEntry entry; + while ((entry = tar.getNextEntry()) != null) { + Path extractTo = getDestination().resolve(entry.getName()); + if (entry.isDirectory()) { + Files.createDirectories(extractTo); + } else { + Files.copy(tar, extractTo, StandardCopyOption.REPLACE_EXISTING); + } + } + } + } +} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java new file mode 100644 index 0000000000..0f6d557f61 --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java @@ -0,0 +1,38 @@ +package com.baeldung.commons.untar.impl; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; + +import com.baeldung.commons.untar.TarExtractor; + +public class TarExtractorCommonsCompress extends TarExtractor { + + public TarExtractorCommonsCompress(InputStream in, boolean gzip, Path destination) throws IOException { + super(in, gzip, destination); + } + + @Override + public void untar() throws IOException { + try (BufferedInputStream inputStream = new BufferedInputStream(getTarStream()); // + TarArchiveInputStream tar = new TarArchiveInputStream( // + isGzip() ? new GzipCompressorInputStream(inputStream) : inputStream)) { + ArchiveEntry entry; + while ((entry = tar.getNextEntry()) != null) { + Path extractTo = getDestination().resolve(entry.getName()); + if (entry.isDirectory()) { + Files.createDirectories(extractTo); + } else { + Files.copy(tar, extractTo, StandardCopyOption.REPLACE_EXISTING); + } + } + } + } +} diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java new file mode 100644 index 0000000000..add009aae0 --- /dev/null +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java @@ -0,0 +1,54 @@ +package com.baeldung.commons.untar.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.Iterator; + +import org.apache.commons.vfs2.FileContent; +import org.apache.commons.vfs2.FileObject; +import org.apache.commons.vfs2.FileSystemManager; +import org.apache.commons.vfs2.FileType; +import org.apache.commons.vfs2.VFS; + +import com.baeldung.commons.untar.TarExtractor; + +public class TarExtractorVfs extends TarExtractor { + + public TarExtractorVfs(InputStream in, boolean gzip, Path destination) throws IOException { + super(in, gzip, destination); + } + + @Override + public void untar() throws IOException { + Path tmpTar = Files.createTempFile("temp", isGzip() ? ".tar.gz" : ".tar"); + Files.copy(getTarStream(), tmpTar, StandardCopyOption.REPLACE_EXISTING); + + FileSystemManager fsManager = VFS.getManager(); + String uri = String.format("%s:file://%s", isGzip() ? "tgz" : "tar", tmpTar.toString()); + FileObject tar = fsManager.resolveFile(uri); + + Iterator contents = tar.iterator(); + while (contents.hasNext()) { + FileObject entry = contents.next(); + + Path extractTo = Paths.get(getDestination().toString(), entry.getName() + .getPath()); + + if (entry.isReadable() && entry.getType() == FileType.FILE) { + Files.createDirectories(extractTo.getParent()); + + try (FileContent fc = entry.getContent(); InputStream stream = fc.getInputStream()) { + Files.copy(stream, extractTo, StandardCopyOption.REPLACE_EXISTING); + } + } else { + Files.createDirectories(extractTo); + } + } + + Files.delete(tmpTar); + } +} diff --git a/libraries-apache-commons-2/src/main/resources/logback.xml b/libraries-apache-commons-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-apache-commons-2/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java new file mode 100644 index 0000000000..3336a3ec39 --- /dev/null +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java @@ -0,0 +1,8 @@ +package com.baeldung.commons.untar; + +import java.io.InputStream; + +public interface Resources { + InputStream TAR_FILE = Resources.class.getResourceAsStream("/untar/test.tar"); + InputStream TAR_GZ_FILE = Resources.class.getResourceAsStream("/untar/test.tar.gz"); +} diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java new file mode 100644 index 0000000000..01b4866a04 --- /dev/null +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.commons.untar; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.Test; + +import com.baeldung.commons.untar.impl.TarExtractorAnt; + +public class TarExtractorAntUnitTest { + + @Test + public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/ant"); + + new TarExtractorAnt(Resources.TAR_FILE, false, destination).untar(); + + assertTrue(Files.list(destination) + .findFirst() + .isPresent()); + } + + @Test + public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/ant-gz"); + + new TarExtractorAnt(Resources.TAR_GZ_FILE, true, destination).untar(); + + assertTrue(Files.list(destination) + .findFirst() + .isPresent()); + } +} diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java new file mode 100644 index 0000000000..b43a437a64 --- /dev/null +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.commons.untar; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.jupiter.api.Test; + +import com.baeldung.commons.untar.impl.TarExtractorCommonsCompress; + +public class TarExtractorCommonsCompressUnitTest { + + @Test + public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/commons-compress"); + + new TarExtractorCommonsCompress(Resources.TAR_FILE, false, destination).untar(); + + assertTrue(Files.list(destination) + .findFirst() + .isPresent()); + } + + @Test + public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/commons-compress-gz"); + + new TarExtractorCommonsCompress(Resources.TAR_GZ_FILE, true, destination).untar(); + + assertTrue(Files.list(destination) + .findFirst() + .isPresent()); + } +} diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java new file mode 100644 index 0000000000..8f513055ae --- /dev/null +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.commons.untar; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.junit.Test; + +import com.baeldung.commons.untar.impl.TarExtractorVfs; + +public class TarExtractorVfsUnitTest { + + @Test + public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/vfs"); + + new TarExtractorVfs(Resources.TAR_FILE, false, destination).untar(); + + assertTrue(Files.list(destination) + .findFirst() + .isPresent()); + } + + @Test + public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { + Path destination = Paths.get("/tmp/vfs-gz"); + + new TarExtractorVfs(Resources.TAR_GZ_FILE, true, destination).untar(); + + assertTrue(Files.list(destination) + .findFirst() + .isPresent()); + } +} diff --git a/libraries-apache-commons-2/src/test/resources/untar/test.tar b/libraries-apache-commons-2/src/test/resources/untar/test.tar new file mode 100644 index 0000000000000000000000000000000000000000..a0c9e8714fc9c02482ceb12119b972e3b7327f81 GIT binary patch literal 5632 zcmeHJyAHxI49wiG$QOW}=l3Lt0f~vU5}%Kg3fiSGC9;IGbg*P!F23HS)BK!O-va<4 zIIRFMdf0!d(oWFmoV5lqV$^`v1W+3K!dkm8Wlj%*w%l)}T+89eU-k7O^>X#-!#>Ok zY0A@OVg^d!3}Ya3)4y>||2~TTM=XKpe+0{XXOtzMd!r*ijM49X|D6MxS2n-=_&)^% z@_&e^wC@e9_WyJLukW9+uL;ltf6sr2TmEx3|2ay4^8X*P{)r5L5}-uD5o9x*QT3l# c>EAZ}8!!4Fu`Z(j5iH9LVL%uV2KX`X0$IO(CIA2c literal 0 HcmV?d00001 diff --git a/libraries-apache-commons-2/src/test/resources/untar/test.tar.gz b/libraries-apache-commons-2/src/test/resources/untar/test.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..99bc3ec9339c01c9214b6f2db104e7868b742c93 GIT binary patch literal 211 zcmV;^04)C>iwFSng?3~B1MQYg4gw(zMrS>z-~`(8*YkjJVd6@L#N%5qI&O4U%#5LL z(*-1yG>?yPnC{ci769ZyeuWj|;k@&v`;(y}IwFaKfopBLDFARLry z-B_V>|I7R%whe*B_aAYdzb*ei%LyRw{~81i08RjjfKDm?hh6z^s{h)F|7#%r3xXi@ N$pic9;O_ty001@SXGQ=3 literal 0 HcmV?d00001 diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index aceea3282a..1c2215d8b0 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -13,4 +13,5 @@ This module contains articles about Apache Commons libraries. - [Apache Commons BeanUtils](https://www.baeldung.com/apache-commons-beanutils) - [Histograms with Apache Commons Frequency](https://www.baeldung.com/apache-commons-frequency) - [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) -- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) \ No newline at end of file +- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) +- More articles: [[next-->]](../libraries-apache-commons-2) \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1c59d323b8..cf02e2a859 100644 --- a/pom.xml +++ b/pom.xml @@ -862,6 +862,7 @@ libraries-6 libraries-apache-commons + libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io libraries-data-2 @@ -1123,6 +1124,7 @@ libraries-5 libraries-6 libraries-apache-commons + libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io libraries-data-2 From 865bb40ee946754c608aee03193638e7ac07c1de Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Thu, 1 Jun 2023 12:12:16 +0530 Subject: [PATCH 071/162] Update README.md --- spring-native/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-native/README.md b/spring-native/README.md index 72308cb9d5..0f193252d0 100644 --- a/spring-native/README.md +++ b/spring-native/README.md @@ -1,4 +1,3 @@ ## Relevant Articles: - [Introduction to Spring Native](https://www.baeldung.com/spring-native-intro) -- [Ahead of Time Optimizations in Spring 6](https://www.baeldung.com/aot-optimization-spring) \ No newline at end of file From d31833dcf1b9be9bfbab32e8d010aa62215fb025 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Thu, 1 Jun 2023 12:21:46 +0530 Subject: [PATCH 072/162] backlink added --- spring-security-modules/spring-security-saml2/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-security-modules/spring-security-saml2/README.md diff --git a/spring-security-modules/spring-security-saml2/README.md b/spring-security-modules/spring-security-saml2/README.md new file mode 100644 index 0000000000..6078ac2215 --- /dev/null +++ b/spring-security-modules/spring-security-saml2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [SAML with Spring Boot and Spring Security](https://www.baeldung.com/spring-security-saml) From c4337207341c0be97ba02a38a9687bebc7a80f26 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Thu, 1 Jun 2023 12:23:54 +0530 Subject: [PATCH 073/162] backlinks removed --- .../core-java-reflection-private-constructor/README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/core-java-modules/core-java-reflection-private-constructor/README.md b/core-java-modules/core-java-reflection-private-constructor/README.md index a3c9d00b0a..7d843af9ea 100644 --- a/core-java-modules/core-java-reflection-private-constructor/README.md +++ b/core-java-modules/core-java-reflection-private-constructor/README.md @@ -1,10 +1 @@ ### Relevant Articles: - -- [Reading the Value of ‘private’ Fields from a Different Class in Java](https://www.baeldung.com/java-reflection-read-private-field-value) -- [Set Field Value With Reflection](https://www.baeldung.com/java-set-private-field-value) -- [Checking If a Method is Static Using Reflection in Java](https://www.baeldung.com/java-check-method-is-static) -- [Checking if a Java Class is ‘abstract’ Using Reflection](https://www.baeldung.com/java-reflection-is-class-abstract) -- [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method) -- [Finding All Classes in a Java Package](https://www.baeldung.com/java-find-all-classes-in-package) -- [Invoke a Static Method Using Java Reflection API](https://www.baeldung.com/java-invoke-static-method-reflection) -- [What Is the JDK com.sun.proxy.$Proxy Class?](https://www.baeldung.com/jdk-com-sun-proxy) From 7bfc898d3e1bc25fb1c87b7c6dc46f20b6b60076 Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Thu, 1 Jun 2023 12:31:25 +0530 Subject: [PATCH 074/162] backlinks removed --- spring-reactive-modules/spring-5-reactive/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-reactive-modules/spring-5-reactive/README.md b/spring-reactive-modules/spring-5-reactive/README.md index aa8d2800e2..f3148fe696 100644 --- a/spring-reactive-modules/spring-5-reactive/README.md +++ b/spring-reactive-modules/spring-5-reactive/README.md @@ -9,7 +9,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [Exploring the Spring 5 WebFlux URL Matching](https://www.baeldung.com/spring-5-mvc-url-matching) - [Reactive WebSockets with Spring 5](https://www.baeldung.com/spring-5-reactive-websockets) -- [Spring WebFlux Filters](https://www.baeldung.com/spring-webflux-filters) - [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) - More articles: [[next -->]](../spring-5-reactive-2) From 38c71c91bb9ef2525bf334fbb8204e856e78a24a Mon Sep 17 00:00:00 2001 From: "thibault.faure" Date: Tue, 30 May 2023 16:45:42 +0200 Subject: [PATCH 075/162] BAEL-6469 Code for the @Value Annotation Support on records in Spring improvement --- .../spring-boot-properties-2/pom.xml | 3 +++ .../properties/value/PriorityRecord.java | 10 ++++++++ .../PriorityProviderIntegrationTest.java | 4 ++-- .../value/PriorityRecordIntegrationTest.java | 23 +++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityRecord.java create mode 100644 spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityRecordIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-properties-2/pom.xml b/spring-boot-modules/spring-boot-properties-2/pom.xml index 4b1daca34d..2c74f7f186 100644 --- a/spring-boot-modules/spring-boot-properties-2/pom.xml +++ b/spring-boot-modules/spring-boot-properties-2/pom.xml @@ -20,10 +20,12 @@ org.springframework.boot spring-boot-starter + ${spring-boot.version} org.springframework.boot spring-boot-starter-web + ${spring-boot.version} commons-lang @@ -34,6 +36,7 @@ com.baeldung.properties.yaml.YamlApplication + 3.1.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityRecord.java b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityRecord.java new file mode 100644 index 0000000000..2d88da2f37 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-2/src/main/java/com/baeldung/properties/value/PriorityRecord.java @@ -0,0 +1,10 @@ +package com.baeldung.properties.value; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +@Component +@PropertySource("classpath:values.properties") +public record PriorityRecord(@Value("${priority:normal}") String priority) { +} diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java index d7d1e7d78b..5d1ef825fc 100644 --- a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java +++ b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityProviderIntegrationTest.java @@ -1,13 +1,13 @@ package com.baeldung.properties.value; +import static org.assertj.core.api.Assertions.assertThat; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import static org.assertj.core.api.Assertions.assertThat; - @RunWith(SpringRunner.class) @SpringBootTest(classes = PriorityProvider.class) public class PriorityProviderIntegrationTest { diff --git a/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityRecordIntegrationTest.java b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityRecordIntegrationTest.java new file mode 100644 index 0000000000..571e927bd5 --- /dev/null +++ b/spring-boot-modules/spring-boot-properties-2/src/test/java/com/baeldung/properties/value/PriorityRecordIntegrationTest.java @@ -0,0 +1,23 @@ +package com.baeldung.properties.value; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = PriorityRecord.class) +public class PriorityRecordIntegrationTest { + + @Autowired + private PriorityRecord priorityRecord; + + @Test + public void givenPropertyFile_WhenConstructorInjectionUsedInRecord_ThenValueInjected() { + assertThat(priorityRecord.priority()).isEqualTo("high"); + } + +} From 5c7212c3d07cb579d0029a557333b6b08e364fec Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:10:17 +0800 Subject: [PATCH 076/162] Update README.md [skip ci] --- json-modules/gson-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/json-modules/gson-2/README.md b/json-modules/gson-2/README.md index 40d5515567..5580479753 100644 --- a/json-modules/gson-2/README.md +++ b/json-modules/gson-2/README.md @@ -3,5 +3,5 @@ This module contains articles about Gson ### Relevant Articles: - +- [Solving Gson Parsing Errors](https://www.baeldung.com/gson-parsing-errors) From 857442f347a9571da3ea29c19f7bb7fb7ae34199 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:13:40 +0800 Subject: [PATCH 077/162] Update README.md [skip ci] --- core-java-modules/core-java-io-apis-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-apis-2/README.md b/core-java-modules/core-java-io-apis-2/README.md index 9bd55abac4..7f04d6d028 100644 --- a/core-java-modules/core-java-io-apis-2/README.md +++ b/core-java-modules/core-java-io-apis-2/README.md @@ -12,3 +12,4 @@ This module contains articles about core Java input/output(IO) APIs. - [Storing Java Scanner Input in an Array](https://www.baeldung.com/java-store-scanner-input-in-array) - [How to Take Input as String With Spaces in Java Using Scanner?](https://www.baeldung.com/java-scanner-input-with-spaces) - [Write Console Output to Text File in Java](https://www.baeldung.com/java-write-console-output-file) +- [What’s the difference between Scanner next() and nextLine() methods?](https://www.baeldung.com/java-scanner-next-vs-nextline) From 8ca4e21db4c8229eaa8d1739bc3ab0fa2b542e06 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:16:39 +0800 Subject: [PATCH 078/162] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-5/README.md b/core-java-modules/core-java-collections-list-5/README.md index 31688bc9b1..5c88f821f8 100644 --- a/core-java-modules/core-java-collections-list-5/README.md +++ b/core-java-modules/core-java-collections-list-5/README.md @@ -7,3 +7,4 @@ This module contains articles about the Java List collection - [Finding All Duplicates in a List in Java](https://www.baeldung.com/java-list-find-duplicates) - [Moving Items Around in an Arraylist](https://www.baeldung.com/java-arraylist-move-items) - [Check if a List Contains an Element From Another List in Java](https://www.baeldung.com/java-check-elements-between-lists) +- [Array vs. List Performance in Java](https://www.baeldung.com/java-array-vs-list-performance) From 4a2d613531da7ee54c9fe1954bec36f3ebdda35c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:24:42 +0800 Subject: [PATCH 079/162] Update README.md [skip ci] --- spring-security-modules/spring-security-web-boot-4/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-modules/spring-security-web-boot-4/README.md b/spring-security-modules/spring-security-web-boot-4/README.md index af8ed4e76a..8a7dbf3029 100644 --- a/spring-security-modules/spring-security-web-boot-4/README.md +++ b/spring-security-modules/spring-security-web-boot-4/README.md @@ -9,5 +9,5 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com - [Spring Security: Upgrading the Deprecated WebSecurityConfigurerAdapter](https://www.baeldung.com/spring-deprecated-websecurityconfigureradapter) - [Spring @EnableMethodSecurity Annotation](https://www.baeldung.com/spring-enablemethodsecurity) - +- [Securing Spring Boot API With API Key and Secret](https://www.baeldung.com/spring-boot-api-key-secret) More articles: [[<-- prev]](/spring-security-modules/spring-security-web-boot-3) From 7ec7ff98046b478c16f2a660e654045f3cdfae4e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:27:58 +0800 Subject: [PATCH 080/162] Update README.md [skip ci] --- persistence-modules/spring-data-jpa-repo-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa-repo-3/README.md b/persistence-modules/spring-data-jpa-repo-3/README.md index 2ed2dc8896..93cc9379f7 100644 --- a/persistence-modules/spring-data-jpa-repo-3/README.md +++ b/persistence-modules/spring-data-jpa-repo-3/README.md @@ -6,4 +6,5 @@ This module contains articles about Spring Data JPA. - [New CRUD Repository Interfaces in Spring Data 3](https://www.baeldung.com/spring-data-3-crud-repository-interfaces) - [How to Persist a List of String in JPA?](https://www.baeldung.com/java-jpa-persist-string-list) - [Hibernate Natural IDs in Spring Boot](https://www.baeldung.com/spring-boot-hibernate-natural-ids) +- [Correct Use of flush() in JPA](https://www.baeldung.com/spring-jpa-flush) - More articles: [[<-- prev]](../spring-data-jpa-repo-2) From e41e0f203fb1c6b92481b999bacc9dc648f9be83 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:31:53 +0800 Subject: [PATCH 081/162] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-6/README.md b/core-java-modules/core-java-collections-maps-6/README.md index fc12a1bb25..5b45752e74 100644 --- a/core-java-modules/core-java-collections-maps-6/README.md +++ b/core-java-modules/core-java-collections-maps-6/README.md @@ -1,2 +1,3 @@ ## Relevant Articles - [Copying All Keys and Values From One Hashmap Onto Another Without Replacing Existing Keys and Values](https://www.baeldung.com/java-copy-hashmap-no-changes) +- [Convert Hashmap to JSON Object in Java](https://www.baeldung.com/java-convert-hashmap-to-json-object) From 3a65bc85fdbdaa2c0d830f0d01bd44ca5e3e17cf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:38:24 +0800 Subject: [PATCH 082/162] Update README.md [skip ci] --- xml-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/xml-2/README.md b/xml-2/README.md index 383d0763d4..e91078dbf0 100644 --- a/xml-2/README.md +++ b/xml-2/README.md @@ -6,3 +6,4 @@ This module contains articles about eXtensible Markup Language (XML) - [Pretty-Print XML in Java](https://www.baeldung.com/java-pretty-print-xml) - [Validate an XML File Against an XSD File](https://www.baeldung.com/java-validate-xml-xsd) +- [Converting JSON to XML in Java](https://www.baeldung.com/java-convert-json-to-xml) From 69febffe226ff49542719e909576698e0adee56d Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:40:51 +0800 Subject: [PATCH 083/162] Update README.md [skip ci] --- core-java-modules/core-java-io-apis-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-apis-2/README.md b/core-java-modules/core-java-io-apis-2/README.md index 7f04d6d028..d62fd3dbd1 100644 --- a/core-java-modules/core-java-io-apis-2/README.md +++ b/core-java-modules/core-java-io-apis-2/README.md @@ -13,3 +13,4 @@ This module contains articles about core Java input/output(IO) APIs. - [How to Take Input as String With Spaces in Java Using Scanner?](https://www.baeldung.com/java-scanner-input-with-spaces) - [Write Console Output to Text File in Java](https://www.baeldung.com/java-write-console-output-file) - [What’s the difference between Scanner next() and nextLine() methods?](https://www.baeldung.com/java-scanner-next-vs-nextline) +- [Handle NoSuchElementException When Reading a File Through Scanner](https://www.baeldung.com/java-scanner-nosuchelementexception-reading-file) From 1c21a5a221ea2c71f4198b7d5031a800814cc124 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:43:47 +0800 Subject: [PATCH 084/162] Create README.md [skip ci] --- spring-boot-modules/spring-boot-gradle-2/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 spring-boot-modules/spring-boot-gradle-2/README.md diff --git a/spring-boot-modules/spring-boot-gradle-2/README.md b/spring-boot-modules/spring-boot-gradle-2/README.md new file mode 100644 index 0000000000..ba6f30c000 --- /dev/null +++ b/spring-boot-modules/spring-boot-gradle-2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Configuring Gradle Tasks in Spring Boot 3](https://www.baeldung.com/spring-boot-3-gradle-configure-tasks) From 50cf2cee2384c83a579b66b56be5813b1443a644 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:46:50 +0800 Subject: [PATCH 085/162] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-5/README.md b/core-java-modules/core-java-collections-list-5/README.md index 5c88f821f8..ff40ae3725 100644 --- a/core-java-modules/core-java-collections-list-5/README.md +++ b/core-java-modules/core-java-collections-list-5/README.md @@ -8,3 +8,4 @@ This module contains articles about the Java List collection - [Moving Items Around in an Arraylist](https://www.baeldung.com/java-arraylist-move-items) - [Check if a List Contains an Element From Another List in Java](https://www.baeldung.com/java-check-elements-between-lists) - [Array vs. List Performance in Java](https://www.baeldung.com/java-array-vs-list-performance) +- [Set Default Value for Elements in List](https://www.baeldung.com/java-list-set-default-values) From 100688ace245b6f2498d4e356669462b1e827869 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 08:55:33 +0800 Subject: [PATCH 086/162] Update README.md [skip ci] --- core-java-modules/core-java-serialization/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-serialization/README.md b/core-java-modules/core-java-serialization/README.md index fc6cfcf134..27d515f855 100644 --- a/core-java-modules/core-java-serialization/README.md +++ b/core-java-modules/core-java-serialization/README.md @@ -7,3 +7,4 @@ - [Deserialization Vulnerabilities in Java](https://www.baeldung.com/java-deserialization-vulnerabilities) - [Serialization Validation in Java](https://www.baeldung.com/java-validate-serializable) - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) +- [Java Serialization: readObject() vs. readResolve()](https://www.baeldung.com/java-serialization-readobject-vs-readresolve) From df08d1d57a00353f848e8b87503c21d7f80451a6 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:00:46 +0800 Subject: [PATCH 087/162] Update README.md [skip ci] --- apache-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-kafka-2/README.md b/apache-kafka-2/README.md index e86504d605..159d631d61 100644 --- a/apache-kafka-2/README.md +++ b/apache-kafka-2/README.md @@ -9,3 +9,4 @@ You can build the project from the command line using: *mvn clean install*, or i - [Guide to Check if Apache Kafka Server Is Running](https://www.baeldung.com/apache-kafka-check-server-is-running) - [Add Custom Headers to a Kafka Message](https://www.baeldung.com/java-kafka-custom-headers) - [Get Last N Messages in Apache Kafka Topic](https://www.baeldung.com/java-apache-kafka-get-last-n-messages) +- [Is a Key Required as Part of Sending Messages to Kafka?](https://www.baeldung.com/java-kafka-message-key) From 6c1bfc5287f8161828384ec7f2685519018f6eae Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:05:22 +0800 Subject: [PATCH 088/162] Update README.md [skip ci] --- apache-kafka-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-kafka-2/README.md b/apache-kafka-2/README.md index 159d631d61..9a5f6e15ae 100644 --- a/apache-kafka-2/README.md +++ b/apache-kafka-2/README.md @@ -10,3 +10,4 @@ You can build the project from the command line using: *mvn clean install*, or i - [Add Custom Headers to a Kafka Message](https://www.baeldung.com/java-kafka-custom-headers) - [Get Last N Messages in Apache Kafka Topic](https://www.baeldung.com/java-apache-kafka-get-last-n-messages) - [Is a Key Required as Part of Sending Messages to Kafka?](https://www.baeldung.com/java-kafka-message-key) +- [Read Data From the Beginning Using Kafka Consumer API](https://www.baeldung.com/java-kafka-consumer-api-read) From cb316df0f2dfa75dfe2412c0c8aea06d37f79d0c Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:12:34 +0800 Subject: [PATCH 089/162] Update README.md [skip ci] --- spring-boot-modules/spring-boot-properties-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-modules/spring-boot-properties-3/README.md b/spring-boot-modules/spring-boot-properties-3/README.md index cb09a0ab81..476797965a 100644 --- a/spring-boot-modules/spring-boot-properties-3/README.md +++ b/spring-boot-modules/spring-boot-properties-3/README.md @@ -13,4 +13,5 @@ - [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables) - [Loading Multiple YAML Configuration Files in Spring Boot](https://www.baeldung.com/spring-boot-load-multiple-yaml-configuration-files) - [Using Environment Variables in Spring Boot’s Properties Files](https://www.baeldung.com/spring-boot-properties-env-variables) +- [Spring Boot Properties Prefix Must Be in Canonical Form](https://www.baeldung.com/spring-boot-properties-canonical-form) - More articles: [[<-- prev]](../spring-boot-properties-2) From bfd7a0ecf91610b0239d07c762fde981f99e1d5f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:15:32 +0800 Subject: [PATCH 090/162] Update README.md [skip ci] --- testing-modules/testing-libraries-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/testing-libraries-2/README.md b/testing-modules/testing-libraries-2/README.md index 7cc08a8140..d075c40919 100644 --- a/testing-modules/testing-libraries-2/README.md +++ b/testing-modules/testing-libraries-2/README.md @@ -4,3 +4,4 @@ - [Guide to the System Stubs Library](https://www.baeldung.com/java-system-stubs) - [Code Coverage with SonarQube and JaCoCo](https://www.baeldung.com/sonarqube-jacoco-code-coverage) - [Exclusions from Jacoco Report](https://www.baeldung.com/jacoco-report-exclude) +- [Gray Box Testing Using the OAT Technique](https://www.baeldung.com/java-gray-box-orthogonal-array-testing) From 17fc896c98ac3c2a92e4573b6f8866e5cd76bc02 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 2 Jun 2023 17:47:05 +0300 Subject: [PATCH 091/162] Update README.md --- core-java-modules/core-java-lang-3/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-3/README.md b/core-java-modules/core-java-lang-3/README.md index d23feaeffe..f0e7c8b7b4 100644 --- a/core-java-modules/core-java-lang-3/README.md +++ b/core-java-modules/core-java-lang-3/README.md @@ -4,7 +4,7 @@ This module contains articles about core features in the Java language - [Class.isInstance vs Class.isAssignableFrom and instanceof](https://www.baeldung.com/java-isinstance-isassignablefrom) - [Converting a Java String Into a Boolean](https://www.baeldung.com/java-string-to-boolean) -- [When Are Static Variables Initialized in Java?](https://staging8.baeldung.com/java-static-variables-initialization) +- [When Are Static Variables Initialized in Java?](https://www.baeldung.com/java-static-variables-initialization) - [Checking if a Class Exists in Java](https://www.baeldung.com/java-check-class-exists) - [The Difference Between a.getClass() and A.class in Java](https://www.baeldung.com/java-getclass-vs-class) - [Constants in Java: Patterns and Anti-Patterns](https://www.baeldung.com/java-constants-good-practices) From 70acdb27ee5e90718266018b725c5824ff60ac62 Mon Sep 17 00:00:00 2001 From: psevestre Date: Fri, 2 Jun 2023 13:24:47 -0300 Subject: [PATCH 092/162] [BAEL-6275] PostgreSQL NOTIFY/LISTEN (#14153) * [BAEL-4849] Article code * [BAEL-4968] Article code * [BAEL-4968] Article code * [BAEL-4968] Article code * [BAEL-4968] Remove extra comments * [BAEL-5258] Article Code * [BAEL-2765] PKCE Support for Secret Clients * [BAEL-5698] Article code * [BAEL-5698] Article code * [BAEL-5905] Initial code * [BAEL-5905] Article code * [BAEL-5905] Relocate article code to new module * [BAEL-6275] PostgreSQL NOTIFY/LISTEN * [BAEL-6275] Minor correction --------- Co-authored-by: Philippe Sevestre --- messaging-modules/pom.xml | 1 + messaging-modules/postgres-notify/.gitignore | 1 + messaging-modules/postgres-notify/pom.xml | 78 +++++++++++++++++++ .../messaging/postgresql/Application.java | 12 +++ .../postgresql/config/CacheConfiguration.java | 34 ++++++++ .../config/ListenerConfiguration.java | 25 ++++++ .../config/NotifierConfiguration.java | 30 +++++++ .../controller/OrdersController.java | 53 +++++++++++++ .../messaging/postgresql/domain/Order.java | 21 +++++ .../postgresql/domain/OrderType.java | 12 +++ .../repository/OrdersRepository.java | 9 +++ .../service/NotificationHandler.java | 31 ++++++++ .../postgresql/service/NotifierService.java | 55 +++++++++++++ .../postgresql/service/OrdersService.java | 61 +++++++++++++++ .../src/main/resources/application.properties | 5 ++ .../src/main/resources/schema.sql | 7 ++ .../postgresql/ApplicationLiveTest.java | 47 +++++++++++ .../src/test/resources/application.properties | 3 + 18 files changed, 485 insertions(+) create mode 100644 messaging-modules/postgres-notify/.gitignore create mode 100644 messaging-modules/postgres-notify/pom.xml create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/Application.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/CacheConfiguration.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/ListenerConfiguration.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/NotifierConfiguration.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/Order.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/OrderType.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/repository/OrdersRepository.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotifierService.java create mode 100644 messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java create mode 100644 messaging-modules/postgres-notify/src/main/resources/application.properties create mode 100644 messaging-modules/postgres-notify/src/main/resources/schema.sql create mode 100644 messaging-modules/postgres-notify/src/test/java/com/baeldung/messaging/postgresql/ApplicationLiveTest.java create mode 100644 messaging-modules/postgres-notify/src/test/resources/application.properties diff --git a/messaging-modules/pom.xml b/messaging-modules/pom.xml index 71ff25d71b..6fd14f7c64 100644 --- a/messaging-modules/pom.xml +++ b/messaging-modules/pom.xml @@ -22,6 +22,7 @@ spring-amqp spring-apache-camel spring-jms + postgres-notify \ No newline at end of file diff --git a/messaging-modules/postgres-notify/.gitignore b/messaging-modules/postgres-notify/.gitignore new file mode 100644 index 0000000000..0776e6f133 --- /dev/null +++ b/messaging-modules/postgres-notify/.gitignore @@ -0,0 +1 @@ +/application-local.properties diff --git a/messaging-modules/postgres-notify/pom.xml b/messaging-modules/postgres-notify/pom.xml new file mode 100644 index 0000000000..174d66b7f5 --- /dev/null +++ b/messaging-modules/postgres-notify/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + postgres-notify + postgres-notify + PostgreSQL as a Message Broker + + + com.baeldung + messaging-modules + 0.0.1-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-jdbc + + + org.postgresql + postgresql + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + + + + + 1.8 + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + instance1 + + + + org.springframework.boot + spring-boot-maven-plugin + + -Dserver.port=8081 + + + + + + + + \ No newline at end of file diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/Application.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/Application.java new file mode 100644 index 0000000000..b3b1f83d2f --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.messaging.postgresql; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/CacheConfiguration.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/CacheConfiguration.java new file mode 100644 index 0000000000..73763316c3 --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/CacheConfiguration.java @@ -0,0 +1,34 @@ +package com.baeldung.messaging.postgresql.config; + +import java.util.Arrays; +import java.util.Collection; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.concurrent.ConcurrentMapCache; +import org.springframework.cache.support.SimpleCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.ConcurrentLruCache; + +import com.baeldung.messaging.postgresql.domain.Order; + +@Configuration +public class CacheConfiguration { + + @Bean + Cache ordersCache(CacheManager cm) { + return cm.getCache("orders"); + } + + @Bean + @ConditionalOnMissingBean + CacheManager defaultCacheManager() { + SimpleCacheManager cm = new SimpleCacheManager(); + Cache cache = new ConcurrentMapCache("orders",false); + cm.setCaches(Arrays.asList(cache)); + + return cm; + } +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/ListenerConfiguration.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/ListenerConfiguration.java new file mode 100644 index 0000000000..b053ba8bc2 --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/ListenerConfiguration.java @@ -0,0 +1,25 @@ +package com.baeldung.messaging.postgresql.config; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.messaging.postgresql.service.NotifierService; +import com.baeldung.messaging.postgresql.service.NotificationHandler; + +import lombok.extern.slf4j.Slf4j; + +@Configuration +@Slf4j +public class ListenerConfiguration { + + @Bean + CommandLineRunner startListener(NotifierService notifier, NotificationHandler handler) { + return (args) -> { + log.info("Starting order listener thread..."); + Runnable listener = notifier.createNotificationHandler(handler); + Thread t = new Thread(listener, "order-listener"); + t.start(); + }; + } +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/NotifierConfiguration.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/NotifierConfiguration.java new file mode 100644 index 0000000000..51d6016c57 --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/config/NotifierConfiguration.java @@ -0,0 +1,30 @@ +package com.baeldung.messaging.postgresql.config; + +import java.util.Properties; + +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; + +import com.baeldung.messaging.postgresql.service.NotifierService; +import com.zaxxer.hikari.util.DriverDataSource; + +@Configuration +public class NotifierConfiguration { + + @Bean + NotifierService notifier(DataSourceProperties props) { + + DriverDataSource ds = new DriverDataSource( + props.determineUrl(), + props.determineDriverClassName(), + new Properties(), + props.determineUsername(), + props.determinePassword()); + + JdbcTemplate tpl = new JdbcTemplate(ds); + + return new NotifierService(tpl); + } +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java new file mode 100644 index 0000000000..70daa14abd --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/controller/OrdersController.java @@ -0,0 +1,53 @@ +package com.baeldung.messaging.postgresql.controller; + +import java.math.BigDecimal; +import java.util.Optional; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.messaging.postgresql.domain.Order; +import com.baeldung.messaging.postgresql.domain.OrderType; +import com.baeldung.messaging.postgresql.service.OrdersService; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequiredArgsConstructor +@Slf4j +public class OrdersController { + + private final OrdersService orders; + + @PostMapping("/orders/sell") + public ResponseEntity postSellOrder(String symbol, BigDecimal quantity, BigDecimal price) { + log.info("postSellOrder: symbol={},quantity={},price={}", symbol,quantity,price); + Order order = orders.createOrder(OrderType.SELL, symbol, quantity, price); + return ResponseEntity.status(HttpStatus.CREATED).body(order); + } + + @PostMapping("/orders/buy") + public ResponseEntity postBuyOrder(String symbol, BigDecimal quantity, BigDecimal price) { + log.info("postBuyOrder: symbol={},quantity={},price={}", symbol,quantity,price); + Order order = orders.createOrder(OrderType.BUY, symbol, quantity, price); + return ResponseEntity.status(HttpStatus.CREATED).body(order); + } + + @GetMapping("/orders/{id}") + public ResponseEntity getOrderById(@PathVariable Long id) { + + Optional o = orders.findById(id); + if (o.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + return ResponseEntity.ok(o.get()); + + } + +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/Order.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/Order.java new file mode 100644 index 0000000000..d7b19aa10d --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/Order.java @@ -0,0 +1,21 @@ +package com.baeldung.messaging.postgresql.domain; + +import java.math.BigDecimal; + +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Table; + +import lombok.Data; +import lombok.ToString; + +@Data +@ToString +@Table(name = "orders") +public class Order { + @Id + private Long id; + private String symbol; + private OrderType orderType; + private BigDecimal price; + private BigDecimal quantity; +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/OrderType.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/OrderType.java new file mode 100644 index 0000000000..6c053bc25c --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/domain/OrderType.java @@ -0,0 +1,12 @@ +package com.baeldung.messaging.postgresql.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum OrderType { + BUY('B'), + SELL('S'); + private final char c; +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/repository/OrdersRepository.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/repository/OrdersRepository.java new file mode 100644 index 0000000000..d131017930 --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/repository/OrdersRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.messaging.postgresql.repository; + +import org.springframework.data.repository.CrudRepository; + +import com.baeldung.messaging.postgresql.domain.Order; + +public interface OrdersRepository extends CrudRepository{ + +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java new file mode 100644 index 0000000000..61b970f3a2 --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotificationHandler.java @@ -0,0 +1,31 @@ +package com.baeldung.messaging.postgresql.service; + +import java.util.Optional; +import java.util.function.Consumer; + +import org.postgresql.PGNotification; +import org.springframework.cache.Cache; +import org.springframework.stereotype.Component; + +import com.baeldung.messaging.postgresql.domain.Order; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +@RequiredArgsConstructor +public class NotificationHandler implements Consumer{ + + private final OrdersService orders; + + @Override + public void accept(PGNotification t) { + log.info("Notification received: pid={}, name={}, param={}",t.getPID(),t.getName(),t.getParameter()); + Optional order = orders.findById(Long.valueOf(t.getParameter())); + if ( !order.isEmpty()) { + log.info("order details: {}", order.get()); + } + } + +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotifierService.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotifierService.java new file mode 100644 index 0000000000..bc8215c7b3 --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/NotifierService.java @@ -0,0 +1,55 @@ +package com.baeldung.messaging.postgresql.service; + +import java.sql.Connection; +import java.util.function.Consumer; + +import org.postgresql.PGConnection; +import org.postgresql.PGNotification; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.messaging.postgresql.domain.Order; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public class NotifierService { + private static final String ORDERS_CHANNEL = "orders"; + private final JdbcTemplate tpl; + + + @Transactional + public void notifyOrderCreated(Order order) { + tpl.execute("NOTIFY " + ORDERS_CHANNEL + ", '" + order.getId() + "'"); + } + + public Runnable createNotificationHandler(Consumer consumer) { + + return () -> { + tpl.execute((Connection c) -> { + log.info("notificationHandler: sending LISTEN command..."); + c.createStatement().execute("LISTEN " + ORDERS_CHANNEL); + + PGConnection pgconn = c.unwrap(PGConnection.class); + + while(!Thread.currentThread().isInterrupted()) { + PGNotification[] nts = pgconn.getNotifications(10000); + if ( nts == null || nts.length == 0 ) { + continue; + } + + for( PGNotification nt : nts) { + consumer.accept(nt); + } + } + + return 0; + }); + + }; + } +} diff --git a/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java new file mode 100644 index 0000000000..cc369c1f3e --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/java/com/baeldung/messaging/postgresql/service/OrdersService.java @@ -0,0 +1,61 @@ +package com.baeldung.messaging.postgresql.service; + +import java.math.BigDecimal; +import java.util.Optional; + +import javax.sql.DataSource; + +import org.springframework.cache.Cache; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.messaging.postgresql.domain.Order; +import com.baeldung.messaging.postgresql.domain.OrderType; +import com.baeldung.messaging.postgresql.repository.OrdersRepository; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Service +@RequiredArgsConstructor +@Slf4j +public class OrdersService { + private final OrdersRepository repo; + private final NotifierService notifier; + private final Cache ordersCache; + + @Transactional + public Order createOrder(OrderType orderType, String symbol, BigDecimal quantity, BigDecimal price) { + + Order order = new Order(); + order.setOrderType(orderType); + order.setSymbol(symbol); + order.setQuantity(quantity); + order.setPrice(price); + order = repo.save(order); + + notifier.notifyOrderCreated(order); + + return order; + + } + + @Transactional(readOnly = true) + public Optional findById(Long id) { + Optional o = Optional.ofNullable(ordersCache.get(id, Order.class)); + if ( !o.isEmpty() ) { + log.info("findById: cache hit, id={}",id); + return o; + } + + log.info("findById: cache miss, id={}",id); + o = repo.findById(id); + if ( o.isEmpty()) { + return o; + } + + ordersCache.put(id, o.get()); + return o; + } + +} diff --git a/messaging-modules/postgres-notify/src/main/resources/application.properties b/messaging-modules/postgres-notify/src/main/resources/application.properties new file mode 100644 index 0000000000..836e01cdca --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/resources/application.properties @@ -0,0 +1,5 @@ +# Replace the properties below with proper values for your environment +spring.sql.init.mode=ALWAYS +#spring.datasource.url=jdbc:postgresql://some-postgresql-host/some-postgresql-database +#spring.datasource.username=your-postgresql-username +#spring.datasource.password=your-postgresql-password diff --git a/messaging-modules/postgres-notify/src/main/resources/schema.sql b/messaging-modules/postgres-notify/src/main/resources/schema.sql new file mode 100644 index 0000000000..fad33509bd --- /dev/null +++ b/messaging-modules/postgres-notify/src/main/resources/schema.sql @@ -0,0 +1,7 @@ +create table if not exists orders ( + id serial primary key, + symbol varchar(16) not null, + order_type varchar(8) not null, + price NUMERIC(10,2) not null, + quantity NUMERIC(10,2) not null +); diff --git a/messaging-modules/postgres-notify/src/test/java/com/baeldung/messaging/postgresql/ApplicationLiveTest.java b/messaging-modules/postgres-notify/src/test/java/com/baeldung/messaging/postgresql/ApplicationLiveTest.java new file mode 100644 index 0000000000..5311793fe7 --- /dev/null +++ b/messaging-modules/postgres-notify/src/test/java/com/baeldung/messaging/postgresql/ApplicationLiveTest.java @@ -0,0 +1,47 @@ +package com.baeldung.messaging.postgresql; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import com.baeldung.messaging.postgresql.domain.Order; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@Sql("/schema.sql") +class ApplicationLiveTest { + + + @LocalServerPort + int localPort; + + @Autowired + TestRestTemplate client; + + @Test + void whenCreateBuyOrder_thenSuccess() { + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + MultiValueMap data= new LinkedMultiValueMap<>(); + data.add("symbol", "BAEL"); + data.add("price", "14.56"); + data.add("quantity", "100"); + HttpEntity> request = new HttpEntity>(data, headers); + + client.postForEntity("http://localhost:" + localPort + "/orders/buy", data, Order.class); + + } + +} diff --git a/messaging-modules/postgres-notify/src/test/resources/application.properties b/messaging-modules/postgres-notify/src/test/resources/application.properties new file mode 100644 index 0000000000..ebc3ef54e1 --- /dev/null +++ b/messaging-modules/postgres-notify/src/test/resources/application.properties @@ -0,0 +1,3 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/baeldung +spring.datasource.username=baeldung +spring.datasource.password=SqD64PtsGhDXjn9f \ No newline at end of file From bb4c9bd411e45d67f60de95e7dd2f59f72f5f2d3 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 2 Jun 2023 21:12:06 +0300 Subject: [PATCH 093/162] JAVA-20163 Update example for UserType/CompositeUserType (#14143) Co-authored-by: timis1 --- .../hibernate/customtypes/Address.java | 10 +++ .../hibernate/customtypes/AddressType.java | 46 +------------- .../hibernate/customtypes/OfficeEmployee.java | 6 +- .../customtypes/PhoneNumberType.java | 61 ++++++++----------- .../hibernate/customtypes/Salary.java | 3 +- .../hibernate/customtypes/SalaryType.java | 53 ++++------------ .../HibernateCustomTypesIntegrationTest.java | 10 ++- 7 files changed, 62 insertions(+), 127 deletions(-) diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java index d559e5a6c2..b326363c60 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Address.java @@ -10,6 +10,16 @@ public class Address { private String country; private int zipCode; + public Address(String addressLine1, String addressLine2, String city, String country, int zipCode) { + this.addressLine1 = addressLine1; + this.addressLine2 = addressLine2; + this.city = city; + this.country = country; + this.zipCode = zipCode; + } + + public Address() {} + public String getAddressLine1() { return addressLine1; } diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java index f50d8fd7cc..ea92d516ae 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java @@ -2,19 +2,13 @@ package com.baeldung.hibernate.customtypes; import org.hibernate.HibernateException; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.metamodel.spi.ValueAccess; import org.hibernate.usertype.CompositeUserType; -import org.hibernate.usertype.UserType; import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; import java.util.Objects; -public class AddressType implements CompositeUserType
    , UserType
    { +public class AddressType implements CompositeUserType
    { @Override public Object getPropertyValue(Address component, int property) throws HibernateException { @@ -39,7 +33,8 @@ public class AddressType implements CompositeUserType
    , UserType
    , UserType
    returnedClass() { return Address.class; @@ -73,36 +63,6 @@ public class AddressType implements CompositeUserType
    , UserType
    { +public class PhoneNumberType implements CompositeUserType { @Override - public int getSqlType() { - return Types.INTEGER; + public Object getPropertyValue(PhoneNumber component, int property) throws HibernateException { + switch (property) { + case 0: + return component.getCountryCode(); + case 1: + return component.getCityCode(); + case 2: + return component.getNumber(); + default: + throw new IllegalArgumentException(property + " is an invalid property index for class type " + component.getClass().getName()); + } + } + + @Override + public PhoneNumber instantiate(ValueAccess values, SessionFactoryImplementor sessionFactory) { + return new PhoneNumber(values.getValue(0, Integer.class), values.getValue(1, Integer.class), values.getValue(2,Integer.class)); + } + + @Override + public Class embeddable() { + return PhoneNumber.class; } @Override @@ -37,32 +54,6 @@ public class PhoneNumberType implements UserType { return x.hashCode(); } - @Override - public PhoneNumber nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { - int countryCode = rs.getInt(position); - - if (rs.wasNull()) - return null; - - int cityCode = rs.getInt(position); - int number = rs.getInt(position); - - return new PhoneNumber(countryCode, cityCode, number); - } - - @Override - public void nullSafeSet(PreparedStatement st, PhoneNumber value, int index, SharedSessionContractImplementor session) throws SQLException { - if (Objects.isNull(value)) { - st.setNull(index, Types.INTEGER); - st.setNull(index+1, Types.INTEGER); - st.setNull(index+2, Types.INTEGER); - } else { - st.setInt(index, value.getCountryCode()); - st.setInt(index+1, value.getCityCode()); - st.setInt(index+2, value.getNumber()); - } - } - @Override public PhoneNumber deepCopy(PhoneNumber value) { if (Objects.isNull(value)) diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java index f9a7ac5902..2402531869 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/Salary.java @@ -1,8 +1,9 @@ package com.baeldung.hibernate.customtypes; +import java.io.Serializable; import java.util.Objects; -public class Salary { +public class Salary implements Serializable { private Long amount; private String currency; diff --git a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java index 69e34c1363..49294abe89 100644 --- a/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java +++ b/persistence-modules/hibernate-annotations/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java @@ -1,10 +1,6 @@ package com.baeldung.hibernate.customtypes; -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.metamodel.spi.ValueAccess; -import org.hibernate.usertype.CompositeUserType; import org.hibernate.usertype.DynamicParameterizedType; import org.hibernate.usertype.UserType; @@ -16,38 +12,13 @@ import java.sql.Types; import java.util.Objects; import java.util.Properties; -public class SalaryType implements UserType, CompositeUserType, DynamicParameterizedType { +public class SalaryType implements UserType, DynamicParameterizedType { private String localCurrency; - @Override - public Object getPropertyValue(Salary component, int property) throws HibernateException { - - switch (property) { - case 0: - return component.getAmount(); - case 1: - return component.getCurrency(); - default: - throw new IllegalArgumentException(property + - " is an invalid property index for class type " + - component.getClass().getName()); - } - } - - @Override - public Salary instantiate(ValueAccess values, SessionFactoryImplementor sessionFactory) { - return null; - } - - @Override - public Class embeddable() { - return Salary.class; - } - @Override public int getSqlType() { - return Types.BIGINT; + return Types.VARCHAR; } @Override @@ -74,12 +45,12 @@ public class SalaryType implements UserType, CompositeUserType, @Override public Salary nullSafeGet(ResultSet rs, int position, SharedSessionContractImplementor session, Object owner) throws SQLException { Salary salary = new Salary(); - salary.setAmount(rs.getLong(position)); - if (rs.wasNull()) - return null; + String salaryValue = rs.getString(position); - salary.setCurrency(rs.getString(position)); + salary.setAmount(Long.parseLong(salaryValue.split(" ")[1])); + + salary.setCurrency(salaryValue.split(" ")[0]); return salary; } @@ -87,13 +58,11 @@ public class SalaryType implements UserType, CompositeUserType, @Override public void nullSafeSet(PreparedStatement st, Salary value, int index, SharedSessionContractImplementor session) throws SQLException { if (Objects.isNull(value)) - st.setNull(index, Types.BIGINT); + st.setNull(index, Types.VARCHAR); else { - - st.setLong(index, SalaryCurrencyConvertor.convert( - value.getAmount(), - value.getCurrency(), localCurrency)); - st.setString(index + 1, value.getCurrency()); + Long salaryValue = SalaryCurrencyConvertor.convert(value.getAmount(), + value.getCurrency(), localCurrency); + st.setString(index, value.getCurrency() + " " + salaryValue); } } @@ -117,7 +86,7 @@ public class SalaryType implements UserType, CompositeUserType, @Override public Serializable disassemble(Salary value) { - return (Serializable) deepCopy(value); + return deepCopy(value); } @Override diff --git a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java index 9da3a90034..8e7a71c49b 100644 --- a/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java +++ b/persistence-modules/hibernate-annotations/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesIntegrationTest.java @@ -11,10 +11,12 @@ import org.junit.Test; import jakarta.persistence.TypedQuery; import java.time.LocalDate; import java.util.HashMap; +import java.util.List; import java.util.Map; import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; public class HibernateCustomTypesIntegrationTest { @@ -74,12 +76,18 @@ public class HibernateCustomTypesIntegrationTest { doInHibernate(this::sessionFactory, session -> { session.save(e); + session.flush(); + session.refresh(e); TypedQuery query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipCode = :pinCode", OfficeEmployee.class); query.setParameter("pinCode",100); - int size = query.getResultList().size(); + final List resultList = query.getResultList(); + int size = resultList.size(); assertEquals(1, size); + assertNotNull(resultList.get(0).getEmployeeNumber()); + assertNotNull(resultList.get(0).getEmpAddress()); + assertNotNull(resultList.get(0).getSalary()); }); } From ad2e59fb47a5aaac8d8abeba131da13bb3dff1a3 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Fri, 2 Jun 2023 23:07:07 +0300 Subject: [PATCH 094/162] JAVA-20164 Add missing dependency (#14137) * JAVA-20164 Add missing dependency * JAVA-20164 Fix redis config file error maxheap --------- Co-authored-by: timis1 --- persistence-modules/java-jpa/pom.xml | 6 ++++++ .../src/test/java/com/baeldung/JedisIntegrationTest.java | 2 +- .../com/baeldung/RedissonConfigurationIntegrationTest.java | 2 +- .../src/test/java/com/baeldung/RedissonIntegrationTest.java | 2 +- .../DeleteEverythingInRedisIntegrationTest.java | 2 +- .../baeldung/redis_scan/NaiveApproachIntegrationTest.java | 2 +- .../baeldung/redis_scan/ScanStrategyIntegrationTest.java | 2 +- 7 files changed, 12 insertions(+), 6 deletions(-) diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index b70fd0daec..b96b24582e 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -69,6 +69,11 @@ javax.annotation-api ${javax.annotation.version} + + mysql + mysql-connector-java + ${mysql.version} + @@ -130,6 +135,7 @@ 2.1.214 4.0.0 1.3.2 + 8.0.33 \ No newline at end of file diff --git a/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java index 664ed1d0c3..63f9f1c9e7 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java @@ -38,7 +38,7 @@ public class JedisIntegrationTest { redisServer = RedisServer.builder() .port(port) - .setting("maxheap 128M") + .setting("maxmemory 128M") .build(); redisServer.start(); diff --git a/persistence-modules/redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java index b80cae98d8..c4a24f5d05 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/RedissonConfigurationIntegrationTest.java @@ -34,7 +34,7 @@ public class RedissonConfigurationIntegrationTest { redisServer = RedisServer.builder() .port(port) - .setting("maxheap 128M") + .setting("maxmemory 128M") .build(); redisServer.start(); } diff --git a/persistence-modules/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java index 79581df989..aeda20435b 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/RedissonIntegrationTest.java @@ -32,7 +32,7 @@ public class RedissonIntegrationTest { public static void setUp() { redisServer = RedisServer.builder() .port(6379) - .setting("maxheap 128M") + .setting("maxmemory 128M") .build(); redisServer.start(); client = Redisson.create(); diff --git a/persistence-modules/redis/src/test/java/com/baeldung/redis/deleteeverything/DeleteEverythingInRedisIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/redis/deleteeverything/DeleteEverythingInRedisIntegrationTest.java index 54123afdea..84fc060e2f 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/redis/deleteeverything/DeleteEverythingInRedisIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/redis/deleteeverything/DeleteEverythingInRedisIntegrationTest.java @@ -25,7 +25,7 @@ public class DeleteEverythingInRedisIntegrationTest { redisServer = RedisServer.builder() .port(port) - .setting("maxheap 128M") + .setting("maxmemory 128M") .build(); redisServer.start(); diff --git a/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/NaiveApproachIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/NaiveApproachIntegrationTest.java index 5c325e8ea0..7ba7ff4310 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/NaiveApproachIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/NaiveApproachIntegrationTest.java @@ -27,7 +27,7 @@ public class NaiveApproachIntegrationTest { redisServer = RedisServer.builder() .port(port) - .setting("maxheap 128M") + .setting("maxmemory 128M") .build(); } diff --git a/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/ScanStrategyIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/ScanStrategyIntegrationTest.java index 838d0144dc..ff00b6ddc6 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/ScanStrategyIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/redis_scan/ScanStrategyIntegrationTest.java @@ -33,7 +33,7 @@ public class ScanStrategyIntegrationTest { redisServer = RedisServer.builder() .port(port) - .setting("maxheap 128M") + .setting("maxmemory 128M") .build(); } From 95e8e24ddd4c269b5e5b162e6536a799692fad7f Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Fri, 2 Jun 2023 19:37:30 -0300 Subject: [PATCH 095/162] test adjustments --- .../baeldung/commons/untar/impl/TarExtractorVfs.java | 4 +--- .../java/com/baeldung/commons/untar/Resources.java | 10 ++++++++-- .../commons/untar/TarExtractorAntUnitTest.java | 4 ++-- .../untar/TarExtractorCommonsCompressUnitTest.java | 4 ++-- .../commons/untar/TarExtractorVfsUnitTest.java | 4 ++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java index add009aae0..2932b9c3bc 100644 --- a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java +++ b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java @@ -41,11 +41,9 @@ public class TarExtractorVfs extends TarExtractor { if (entry.isReadable() && entry.getType() == FileType.FILE) { Files.createDirectories(extractTo.getParent()); - try (FileContent fc = entry.getContent(); InputStream stream = fc.getInputStream()) { + try (FileContent content = entry.getContent(); InputStream stream = content.getInputStream()) { Files.copy(stream, extractTo, StandardCopyOption.REPLACE_EXISTING); } - } else { - Files.createDirectories(extractTo); } } diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java index 3336a3ec39..5b9b022d7f 100644 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java @@ -3,6 +3,12 @@ package com.baeldung.commons.untar; import java.io.InputStream; public interface Resources { - InputStream TAR_FILE = Resources.class.getResourceAsStream("/untar/test.tar"); - InputStream TAR_GZ_FILE = Resources.class.getResourceAsStream("/untar/test.tar.gz"); + + static InputStream tarFile() { + return Resources.class.getResourceAsStream("/untar/test.tar"); + } + + static InputStream tarGzFile() { + return Resources.class.getResourceAsStream("/untar/test.tar.gz"); + } } diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java index 01b4866a04..80b8fda104 100644 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java @@ -17,7 +17,7 @@ public class TarExtractorAntUnitTest { public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { Path destination = Paths.get("/tmp/ant"); - new TarExtractorAnt(Resources.TAR_FILE, false, destination).untar(); + new TarExtractorAnt(Resources.tarFile(), false, destination).untar(); assertTrue(Files.list(destination) .findFirst() @@ -28,7 +28,7 @@ public class TarExtractorAntUnitTest { public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { Path destination = Paths.get("/tmp/ant-gz"); - new TarExtractorAnt(Resources.TAR_GZ_FILE, true, destination).untar(); + new TarExtractorAnt(Resources.tarGzFile(), true, destination).untar(); assertTrue(Files.list(destination) .findFirst() diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java index b43a437a64..bea67ea3f5 100644 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java @@ -17,7 +17,7 @@ public class TarExtractorCommonsCompressUnitTest { public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { Path destination = Paths.get("/tmp/commons-compress"); - new TarExtractorCommonsCompress(Resources.TAR_FILE, false, destination).untar(); + new TarExtractorCommonsCompress(Resources.tarFile(), false, destination).untar(); assertTrue(Files.list(destination) .findFirst() @@ -28,7 +28,7 @@ public class TarExtractorCommonsCompressUnitTest { public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { Path destination = Paths.get("/tmp/commons-compress-gz"); - new TarExtractorCommonsCompress(Resources.TAR_GZ_FILE, true, destination).untar(); + new TarExtractorCommonsCompress(Resources.tarGzFile(), true, destination).untar(); assertTrue(Files.list(destination) .findFirst() diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java index 8f513055ae..9a00fd7e56 100644 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java +++ b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java @@ -17,7 +17,7 @@ public class TarExtractorVfsUnitTest { public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { Path destination = Paths.get("/tmp/vfs"); - new TarExtractorVfs(Resources.TAR_FILE, false, destination).untar(); + new TarExtractorVfs(Resources.tarFile(), false, destination).untar(); assertTrue(Files.list(destination) .findFirst() @@ -28,7 +28,7 @@ public class TarExtractorVfsUnitTest { public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { Path destination = Paths.get("/tmp/vfs-gz"); - new TarExtractorVfs(Resources.TAR_GZ_FILE, true, destination).untar(); + new TarExtractorVfs(Resources.tarGzFile(), true, destination).untar(); assertTrue(Files.list(destination) .findFirst() From 3ddf5fa6a4d200f3914f8d1f6aa5b4902fec2cee Mon Sep 17 00:00:00 2001 From: Michael Olayemi Date: Sat, 3 Jun 2023 03:42:18 +0000 Subject: [PATCH 096/162] How to Display a Full HTTP Response Body with Gatling (#14148) --- testing-modules/gatling-java/pom.xml | 11 +++-- .../http/FetchSinglePostSimulation.java | 23 ++++++++++ .../http/FetchSinglePostSimulationLog.java | 42 +++++++++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulation.java create mode 100644 testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulationLog.java diff --git a/testing-modules/gatling-java/pom.xml b/testing-modules/gatling-java/pom.xml index 54e18b3ac1..abe033f298 100644 --- a/testing-modules/gatling-java/pom.xml +++ b/testing-modules/gatling-java/pom.xml @@ -60,7 +60,12 @@ gatling-maven-plugin ${gatling-maven-plugin.version} - org.baeldung.EmployeeRegistrationSimulation + + org.baeldung.EmployeeRegistrationSimulation + org.baeldung.gatling.http.FetchSinglePostSimulation + org.baeldung.gatling.http.FetchSinglePostSimulationLog + + true @@ -70,8 +75,8 @@ 1.8 1.8 UTF-8 - 3.9.0 - 4.2.9 + 3.9.5 + 4.3.0 1.0.2 2.7.5 diff --git a/testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulation.java b/testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulation.java new file mode 100644 index 0000000000..16cf25faef --- /dev/null +++ b/testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulation.java @@ -0,0 +1,23 @@ +package org.baeldung.gatling.http; + +import io.gatling.javaapi.core.*; +import io.gatling.javaapi.http.*; +import static io.gatling.javaapi.http.HttpDsl.*; +import static io.gatling.javaapi.core.CoreDsl.*; + +public class FetchSinglePostSimulation extends Simulation { + + public FetchSinglePostSimulation() { + HttpProtocolBuilder httpProtocolBuilder = http.baseUrl("https://jsonplaceholder.typicode.com"); + + ScenarioBuilder scn = scenario("Display Full HTTP Response Body").exec(http("GET Request").get("/posts/1") + .check(status().is(200)) + .check(bodyString().saveAs("responseBody"))) + .exec(session -> { + System.out.println("Response Body:"); + System.out.println(session.getString("responseBody")); + return session; + }); + setUp(scn.injectOpen(atOnceUsers(1))).protocols(httpProtocolBuilder); + } +} diff --git a/testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulationLog.java b/testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulationLog.java new file mode 100644 index 0000000000..9ad4d6edf6 --- /dev/null +++ b/testing-modules/gatling-java/src/test/java/org/baeldung/gatling/http/FetchSinglePostSimulationLog.java @@ -0,0 +1,42 @@ +package org.baeldung.gatling.http; + +import io.gatling.javaapi.core.ScenarioBuilder; +import io.gatling.javaapi.core.Simulation; +import io.gatling.javaapi.http.HttpProtocolBuilder; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; + +import static io.gatling.javaapi.core.CoreDsl.*; +import static io.gatling.javaapi.http.HttpDsl.http; +import static io.gatling.javaapi.http.HttpDsl.status; + +public class FetchSinglePostSimulationLog extends Simulation { + + public FetchSinglePostSimulationLog() { + HttpProtocolBuilder httpProtocolBuilder = http.baseUrl("https://jsonplaceholder.typicode.com"); + + ScenarioBuilder scn = scenario("Display Full HTTP Response Body").exec(http("GET Request").get("/posts/1") + .check(status().is(200)) + .check(bodyString().saveAs("responseBody"))) + .exec(session -> { + + String responseBody = session.getString("responseBody"); + try { + writeFile("response_body.log", responseBody); + } catch (IOException e) { + System.err.println("error writing file"); + } + return session; + }); + setUp(scn.injectOpen(atOnceUsers(1))).protocols(httpProtocolBuilder); + } + + private void writeFile(String fileName, String content) throws IOException { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true))) { + writer.write(content); + writer.newLine(); + } + } +} From 104df66ef8af4c43fe135588595e4788278cfce2 Mon Sep 17 00:00:00 2001 From: Abhinav Pandey Date: Mon, 5 Jun 2023 09:12:47 +0530 Subject: [PATCH 097/162] BAEL-5734 - Mocking private fields (#14085) * BAEL-5734 - Mocking private fields * BAEL-5734 - reducing spring version to make it compatible --- testing-modules/mocks-2/pom.xml | 7 +++ .../com/baeldung/mockprivate/MockService.java | 10 +++ .../java/com/baeldung/mockprivate/Person.java | 14 +++++ .../mockprivate/MockServiceUnitTest.java | 62 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/MockService.java create mode 100644 testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/Person.java create mode 100644 testing-modules/mocks-2/src/test/java/com/baeldung/mockprivate/MockServiceUnitTest.java diff --git a/testing-modules/mocks-2/pom.xml b/testing-modules/mocks-2/pom.xml index e47649ca33..22a5198b8c 100644 --- a/testing-modules/mocks-2/pom.xml +++ b/testing-modules/mocks-2/pom.xml @@ -23,11 +23,18 @@ jackson-databind ${jackson.version} + + org.springframework + spring-test + ${spring-test.version} + test + 1.6.0 2.13.4 + 5.3.25 \ No newline at end of file diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/MockService.java b/testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/MockService.java new file mode 100644 index 0000000000..ab5624d973 --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/MockService.java @@ -0,0 +1,10 @@ +package com.baeldung.mockprivate; + +public class MockService { + + private final Person person = new Person("John Doe"); + + public String getName() { + return person.getName(); + } +} diff --git a/testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/Person.java b/testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/Person.java new file mode 100644 index 0000000000..405b9d58dd --- /dev/null +++ b/testing-modules/mocks-2/src/main/java/com/baeldung/mockprivate/Person.java @@ -0,0 +1,14 @@ +package com.baeldung.mockprivate; + +public class Person { + + private final String name; + + public Person(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/testing-modules/mocks-2/src/test/java/com/baeldung/mockprivate/MockServiceUnitTest.java b/testing-modules/mocks-2/src/test/java/com/baeldung/mockprivate/MockServiceUnitTest.java new file mode 100644 index 0000000000..64367a2290 --- /dev/null +++ b/testing-modules/mocks-2/src/test/java/com/baeldung/mockprivate/MockServiceUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.mockprivate; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.platform.commons.util.ReflectionUtils; +import org.springframework.test.util.ReflectionTestUtils; + +import java.lang.reflect.Field; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class MockServiceUnitTest { + + private Person mockedPerson; + + @BeforeEach + public void setUp(){ + mockedPerson = mock(Person.class); + } + + @Test + void givenNameChangedWithReflection_whenGetName_thenReturnName() throws Exception { + Class mockServiceClass = Class.forName("com.baeldung.mockprivate.MockService"); + MockService mockService = (MockService) mockServiceClass.getDeclaredConstructor().newInstance(); + Field field = mockServiceClass.getDeclaredField("person"); + field.setAccessible(true); + field.set(mockService, mockedPerson); + + when(mockedPerson.getName()).thenReturn("Jane Doe"); + + Assertions.assertEquals("Jane Doe", mockService.getName()); + } + + @Test + void givenNameChangedWithReflectionUtils_whenGetName_thenReturnName() throws Exception { + MockService mockService = new MockService(); + Field field = ReflectionUtils + .findFields(MockService.class, f -> f.getName().equals("person"), + ReflectionUtils.HierarchyTraversalMode.TOP_DOWN) + .get(0); + + field.setAccessible(true); + field.set(mockService, mockedPerson); + + when(mockedPerson.getName()).thenReturn("Jane Doe"); + + Assertions.assertEquals("Jane Doe", mockService.getName()); + } + + @Test + void givenNameChangedWithReflectionTestUtils_whenGetName_thenReturnName() throws Exception { + MockService mockService = new MockService(); + + ReflectionTestUtils.setField(mockService, "person", mockedPerson); + + when(mockedPerson.getName()).thenReturn("Jane Doe"); + Assertions.assertEquals("Jane Doe", mockService.getName()); + } + +} \ No newline at end of file From c341505b4521532db2c6715028ebb565dcd394cc Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Mon, 5 Jun 2023 07:59:40 +0200 Subject: [PATCH 098/162] =?UTF-8?q?BAEL-5648:=20Thymeleaf=20-=20How=20to?= =?UTF-8?q?=20add=20checked=20attribute=20to=20input=20conditio=E2=80=A6?= =?UTF-8?q?=20(#14180)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BAEL-5648: Thymeleaf - How to add checked attribute to input conditionally * BAEL-5648: Thymeleaf - How to add checked attribute to input conditionally --- .../attribute/CheckedAttributeController.java | 29 +++++++++++++++++++ .../resources/templates/attribute/index.html | 27 +++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 spring-web-modules/spring-thymeleaf-5/src/main/java/com/baeldung/thymeleaf/attribute/CheckedAttributeController.java create mode 100644 spring-web-modules/spring-thymeleaf-5/src/main/resources/templates/attribute/index.html diff --git a/spring-web-modules/spring-thymeleaf-5/src/main/java/com/baeldung/thymeleaf/attribute/CheckedAttributeController.java b/spring-web-modules/spring-thymeleaf-5/src/main/java/com/baeldung/thymeleaf/attribute/CheckedAttributeController.java new file mode 100644 index 0000000000..165e98ac3a --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-5/src/main/java/com/baeldung/thymeleaf/attribute/CheckedAttributeController.java @@ -0,0 +1,29 @@ +package com.baeldung.thymeleaf.attribute; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class CheckedAttributeController { + + @GetMapping("/checked") + public String displayCheckboxForm(Model model) { + Engine engine = new Engine(true); + model.addAttribute("engine", engine); + model.addAttribute("flag", true); + return "attribute/index"; + } + + private static class Engine { + private Boolean active; + + public Engine(Boolean active) { + this.active = active; + } + + public Boolean getActive() { + return active; + } + } +} diff --git a/spring-web-modules/spring-thymeleaf-5/src/main/resources/templates/attribute/index.html b/spring-web-modules/spring-thymeleaf-5/src/main/resources/templates/attribute/index.html new file mode 100644 index 0000000000..a7c5b90296 --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-5/src/main/resources/templates/attribute/index.html @@ -0,0 +1,27 @@ + + + + + Spring Boot Thymeleaf Application - Checkbox Checked Conditionally + + +
    + +
    +
    +
    + + + +
    +
    +
    +
    + + \ No newline at end of file From 3779c5c50cc1b30afbc0294cf1aa960e3bf36e0f Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Mon, 5 Jun 2023 11:13:48 +0100 Subject: [PATCH 099/162] BAEL-6312 Add example code for @JsonMerge Jackson annotation --- .../baeldung/jackson/jsonmerge/Keyboard.java | 37 +++++++++++ .../jackson/jsonmerge/ObjectWithMap.java | 38 +++++++++++ .../jsonmerge/ProgrammerAnnotated.java | 38 +++++++++++ .../jsonmerge/ProgrammerNotAnnotated.java | 43 +++++++++++++ .../jackson/jsonmerge/JsonMergeUnitTest.java | 64 +++++++++++++++++++ 5 files changed, 220 insertions(+) create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/Keyboard.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ObjectWithMap.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerAnnotated.java create mode 100644 jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerNotAnnotated.java create mode 100644 jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonmerge/JsonMergeUnitTest.java diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/Keyboard.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/Keyboard.java new file mode 100644 index 0000000000..818b93bc36 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/Keyboard.java @@ -0,0 +1,37 @@ +package com.baeldung.jackson.jsonmerge; + +public class Keyboard { + + private String style; + private String layout; + + public Keyboard(){ + super(); + } + + public Keyboard(String style, String layout) { + this.style = style; + this.layout = layout; + } + + public String getStyle() { + return style; + } + + public void setStyle(String style) { + this.style = style; + } + + public String getLayout() { + return layout; + } + + public void setLayout(String layout) { + this.layout = layout; + } + + @Override + public String toString() { + return "Keyboard{" + "style='" + style + '\'' + ", layout='" + layout + '\'' + '}'; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ObjectWithMap.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ObjectWithMap.java new file mode 100644 index 0000000000..322229a241 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ObjectWithMap.java @@ -0,0 +1,38 @@ +package com.baeldung.jackson.jsonmerge; + +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonMerge; + +public class ObjectWithMap { + + private String name; + @JsonMerge + private Map stringPairs; + + public ObjectWithMap(String name, Map stringPairs) { + this.name = name; + this.stringPairs = stringPairs; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Map getStringPairs() { + return stringPairs; + } + + public void setStringPairs(Map stringPairs) { + this.stringPairs = stringPairs; + } + + @Override + public String toString() { + return "ObjectWithMap{" + "name='" + name + '\'' + ", something=" + stringPairs + '}'; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerAnnotated.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerAnnotated.java new file mode 100644 index 0000000000..56fba37a25 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerAnnotated.java @@ -0,0 +1,38 @@ +package com.baeldung.jackson.jsonmerge; + +import com.fasterxml.jackson.annotation.JsonMerge; + +public class ProgrammerAnnotated { + + private String name; + private String favouriteLanguage; + @JsonMerge + private Keyboard keyboard; + + public ProgrammerAnnotated(String name, String favouriteLanguage, Keyboard keyboard) { + this.name = name; + this.favouriteLanguage = favouriteLanguage; + this.keyboard = keyboard; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFavouriteLanguage() { + return favouriteLanguage; + } + + public Keyboard getKeyboard() { + return keyboard; + } + + @Override + public String toString() { + return "Programmer{" + "name='" + name + '\'' + ", favouriteLanguage='" + favouriteLanguage + '\'' + ", keyboard=" + keyboard + '}'; + } +} diff --git a/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerNotAnnotated.java b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerNotAnnotated.java new file mode 100644 index 0000000000..fae090c870 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/main/java/com/baeldung/jackson/jsonmerge/ProgrammerNotAnnotated.java @@ -0,0 +1,43 @@ +package com.baeldung.jackson.jsonmerge; + +public class ProgrammerNotAnnotated { + + private String name; + private String favouriteLanguage; + private Keyboard keyboard; + + public ProgrammerNotAnnotated(String name, String favouriteLanguage, Keyboard keyboard) { + this.name = name; + this.favouriteLanguage = favouriteLanguage; + this.keyboard = keyboard; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFavouriteLanguage() { + return favouriteLanguage; + } + + public void setFavouriteLanguage(String favouriteLanguage) { + this.favouriteLanguage = favouriteLanguage; + } + + public Keyboard getKeyboard() { + return keyboard; + } + + public void setKeyboard(Keyboard keyboard) { + this.keyboard = keyboard; + } + + @Override + public String toString() { + return "Programmer{" + "name='" + name + '\'' + ", favouriteLanguage='" + favouriteLanguage + '\'' + ", keyboard=" + keyboard + '}'; + } +} diff --git a/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonmerge/JsonMergeUnitTest.java b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonmerge/JsonMergeUnitTest.java new file mode 100644 index 0000000000..db9f253166 --- /dev/null +++ b/jackson-modules/jackson-annotations/src/test/java/com/baeldung/jackson/jsonmerge/JsonMergeUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.jackson.jsonmerge; + +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; + +public class JsonMergeUnitTest { + + @Test + public void givenAnObjectAndJson_whenUsingJsonMerge_thenExpectUpdateInPOJO() throws JsonProcessingException { + String newData = "{\"name\":\"Steve\",\"keyboard\":{\"style\":\"Mechanical\"}}"; + ProgrammerAnnotated programmerToUpdate = new ProgrammerAnnotated("John", "Java", new Keyboard("Membrane", "US")); + + ObjectMapper objectMapper = new ObjectMapper(); + ProgrammerAnnotated update = objectMapper.readerForUpdating(programmerToUpdate) + .readValue(newData); + + assert (update.getFavouriteLanguage()).equals("Java"); + // Only works with annotation + assert (update.getKeyboard() + .getLayout()).equals("US"); + } + + @Test + public void givenAnObjectAndJson_whenNotUsingJsonMerge_thenExpectNoUpdateInPOJO() throws JsonProcessingException { + String newData = "{\"name\":\"Steve\",\"keyboard\":{\"style\":\"Mechanical\"}}"; + ProgrammerNotAnnotated programmerToUpdate = new ProgrammerNotAnnotated("John", "Java", new Keyboard("Membrane", "US")); + + ObjectMapper objectMapper = new ObjectMapper(); + ObjectReader objectReader = objectMapper.readerForUpdating(programmerToUpdate); + ProgrammerNotAnnotated update = objectReader.readValue(newData); + + assert (update.getFavouriteLanguage()).equals("Java"); + assertNull(update.getKeyboard() + .getLayout()); + } + + @Test + public void givenAnObjectWithAMap_whenUsingJsonMerge_thenExpectAllFieldsInMap() throws JsonProcessingException { + String newData = "{\"stringPairs\":{\"field1\":\"value1\",\"field2\":\"value2\"}}"; + Map map = new HashMap<>(); + map.put("field3", "value3"); + ObjectWithMap objectToUpdateWith = new ObjectWithMap("James", map); + + ObjectMapper objectMapper = new ObjectMapper(); + ObjectWithMap update = objectMapper.readerForUpdating(objectToUpdateWith) + .readValue(newData); + + assertTrue(update.getStringPairs() + .containsKey("field1")); + assertTrue(update.getStringPairs() + .containsKey("field2")); + assertTrue(update.getStringPairs() + .containsKey("field3")); + } +} From 9ff3b1dd9bca962b40889d2c2dbd400b064ebcad Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Tue, 6 Jun 2023 03:43:28 +0200 Subject: [PATCH 100/162] [map-str-obj-to-str-str] converting a Map to a Map. (#14175) --- .../ConvertMapWithTypeParamUnitTest.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/generictypeconversion/ConvertMapWithTypeParamUnitTest.java diff --git a/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/generictypeconversion/ConvertMapWithTypeParamUnitTest.java b/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/generictypeconversion/ConvertMapWithTypeParamUnitTest.java new file mode 100644 index 0000000000..9548abd622 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/generictypeconversion/ConvertMapWithTypeParamUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.map.generictypeconversion; + +import static java.util.stream.Collectors.toMap; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import com.google.common.collect.Maps; + +public class ConvertMapWithTypeParamUnitTest { + private static final Map MAP1 = Maps.newHashMap(); + + static { + MAP1.put("K01", "GNU Linux"); + MAP1.put("K02", "Mac OS"); + MAP1.put("K03", "MS Windows"); + } + + private static final Map EXPECTED_MAP1 = Maps.newHashMap(); + + static { + EXPECTED_MAP1.put("K01", "GNU Linux"); + EXPECTED_MAP1.put("K02", "Mac OS"); + EXPECTED_MAP1.put("K03", "MS Windows"); + } + + private static final Map MAP2 = Maps.newHashMap(); + + static { + MAP2.put("K01", "GNU Linux"); + MAP2.put("K02", "Mac OS"); + MAP2.put("K03", BigDecimal.ONE); + } + + private static final Map EXPECTED_MAP2_STRING_VALUES = Maps.newHashMap(); + + static { + EXPECTED_MAP2_STRING_VALUES.put("K01", "GNU Linux"); + EXPECTED_MAP2_STRING_VALUES.put("K02", "Mac OS"); + EXPECTED_MAP2_STRING_VALUES.put("K03", "1"); + } + + @Test + void whenCastingToMap_shouldGetExpectedResult() { + Map result = (Map) MAP1; + assertEquals(EXPECTED_MAP1, result); + + Map result2 = (Map) MAP2; + assertFalse(result2.get("K03") instanceof String); + } + + Map checkAndTransform(Map inputMap) { + Map result = new HashMap<>(); + for (Map.Entry entry : inputMap.entrySet()) { + try { + result.put(entry.getKey(), (String) entry.getValue()); + } catch (ClassCastException e) { + throw e; + } + } + return result; + } + + @Test + void whenCheckAndTransform_shouldGetExpectedResult() { + Map result = checkAndTransform(MAP1); + assertEquals(EXPECTED_MAP1, result); + + assertThrows(ClassCastException.class, () -> checkAndTransform(MAP2)); + } + + @Test + void whenUsingStringValueOf_shouldGetExpectedResult() { + Map result = MAP1.entrySet() + .stream() + .collect(toMap(Map.Entry::getKey, e -> String.valueOf(e.getValue()))); + + assertEquals(EXPECTED_MAP1, result); + + Map result2 = MAP2.entrySet() + .stream() + .collect(toMap(Map.Entry::getKey, e -> String.valueOf(e.getValue()))); + + assertEquals(EXPECTED_MAP2_STRING_VALUES, result2); + } +} \ No newline at end of file From f265b518417056fecca2ca29a0170b0a363e3fa3 Mon Sep 17 00:00:00 2001 From: lucaCambi77 Date: Tue, 6 Jun 2023 03:52:46 +0200 Subject: [PATCH 101/162] [BAEL-6486] - Returning a Value After Finishing Thread's Job in Java (#14101) * feat: threads with return value * pmd violation --- .../task/FactorialCalculator.java | 29 +++++++++++++ .../task/callable/CallableExecutor.java | 38 ++++++++++++++++ .../task/callable/CallableFactorialTask.java | 20 +++++++++ .../task/fork/ForkExecutor.java | 34 +++++++++++++++ .../task/fork/ForkFactorialTask.java | 43 +++++++++++++++++++ .../callable/CallableUnitTest.java | 22 ++++++++++ .../CompletableFutureUnitTest.java | 39 +++++++++++++++++ .../threadreturnvalue/fork/ForkUnitTest.java | 27 ++++++++++++ 8 files changed, 252 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/FactorialCalculator.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableExecutor.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableFactorialTask.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkExecutor.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkFactorialTask.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/callable/CallableUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/completableFuture/CompletableFutureUnitTest.java create mode 100644 core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/fork/ForkUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/FactorialCalculator.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/FactorialCalculator.java new file mode 100644 index 0000000000..4d0c5ab69d --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/FactorialCalculator.java @@ -0,0 +1,29 @@ +package com.baeldung.concurrent.threadreturnvalue.task; + +import java.math.BigInteger; + +public class FactorialCalculator { + + public static BigInteger factorial(BigInteger end) { + BigInteger start = BigInteger.ONE; + BigInteger res = BigInteger.ONE; + + for (int i = start.add(BigInteger.ONE) + .intValue(); i <= end.intValue(); i++) { + res = res.multiply(BigInteger.valueOf(i)); + } + + return res; + } + + public static BigInteger factorial(BigInteger start, BigInteger end) { + BigInteger res = start; + + for (int i = start.add(BigInteger.ONE) + .intValue(); i <= end.intValue(); i++) { + res = res.multiply(BigInteger.valueOf(i)); + } + + return res; + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableExecutor.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableExecutor.java new file mode 100644 index 0000000000..260870d0a7 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableExecutor.java @@ -0,0 +1,38 @@ +package com.baeldung.concurrent.threadreturnvalue.task.callable; + +import java.math.BigInteger; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +public class CallableExecutor { + + public BigInteger execute(List tasks) { + + BigInteger result = BigInteger.ZERO; + + ExecutorService cachedPool = Executors.newCachedThreadPool(); + + List> futures; + + try { + futures = cachedPool.invokeAll(tasks); + } catch (InterruptedException e) { + // exception handling example + throw new RuntimeException(e); + } + + for (Future future : futures) { + try { + result = result.add(future.get()); + } catch (InterruptedException | ExecutionException e) { + // exception handling example + throw new RuntimeException(e); + } + } + + return result; + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableFactorialTask.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableFactorialTask.java new file mode 100644 index 0000000000..4c38d2fb19 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/callable/CallableFactorialTask.java @@ -0,0 +1,20 @@ +package com.baeldung.concurrent.threadreturnvalue.task.callable; + +import static com.baeldung.concurrent.threadreturnvalue.task.FactorialCalculator.factorial; + +import java.math.BigInteger; +import java.util.concurrent.Callable; + +public class CallableFactorialTask implements Callable { + + private final Integer value; + + public CallableFactorialTask(int value) { + this.value = value; + } + + @Override + public BigInteger call() { + return factorial(BigInteger.valueOf(value)); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkExecutor.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkExecutor.java new file mode 100644 index 0000000000..ed199973ce --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkExecutor.java @@ -0,0 +1,34 @@ +package com.baeldung.concurrent.threadreturnvalue.task.fork; + +import java.math.BigInteger; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.Future; + +public class ForkExecutor { + + private final ForkJoinPool forkJoinPool = ForkJoinPool.commonPool(); + + public BigInteger execute(ForkFactorialTask forkFactorial) { + return forkJoinPool.invoke(forkFactorial); + } + + public BigInteger execute(List> forkFactorials) { + List> futures = forkJoinPool.invokeAll(forkFactorials); + + BigInteger result = BigInteger.ZERO; + + for (Future future : futures) { + try { + result = result.add(future.get()); + } catch (InterruptedException | ExecutionException e) { + // exception handling example + throw new RuntimeException(e); + } + } + + return result; + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkFactorialTask.java b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkFactorialTask.java new file mode 100644 index 0000000000..b45a88655c --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/main/java/com/baeldung/concurrent/threadreturnvalue/task/fork/ForkFactorialTask.java @@ -0,0 +1,43 @@ +package com.baeldung.concurrent.threadreturnvalue.task.fork; + +import static com.baeldung.concurrent.threadreturnvalue.task.FactorialCalculator.factorial; + +import java.math.BigInteger; +import java.util.concurrent.RecursiveTask; + +public class ForkFactorialTask extends RecursiveTask { + + private final int start; + private final int end; + private final int threshold; + + public ForkFactorialTask(int end, int threshold) { + this.start = 1; + this.end = end; + this.threshold = threshold; + } + + public ForkFactorialTask(int start, int end, int threshold) { + this.start = start; + this.end = end; + this.threshold = threshold; + } + + @Override + protected BigInteger compute() { + + BigInteger sum = BigInteger.ONE; + + if (end - start > threshold) { + + int middle = (end + start) / 2; + + return sum.multiply(new ForkFactorialTask(start, middle, threshold).fork() + .join() + .multiply(new ForkFactorialTask(middle + 1, end, threshold).fork() + .join())); + } + + return sum.multiply(factorial(BigInteger.valueOf(start), BigInteger.valueOf(end))); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/callable/CallableUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/callable/CallableUnitTest.java new file mode 100644 index 0000000000..d9271b7603 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/callable/CallableUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.concurrent.threadreturnvalue.callable; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigInteger; +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +import com.baeldung.concurrent.threadreturnvalue.task.callable.CallableExecutor; +import com.baeldung.concurrent.threadreturnvalue.task.callable.CallableFactorialTask; + +public class CallableUnitTest { + + private final CallableExecutor callableExecutor = new CallableExecutor(); + + @Test + void givenCallableExecutor_whenExecuteFactorial_thenResultOk() { + BigInteger result = callableExecutor.execute(Arrays.asList(new CallableFactorialTask(5), new CallableFactorialTask(3))); + assertEquals(BigInteger.valueOf(126), result); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/completableFuture/CompletableFutureUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/completableFuture/CompletableFutureUnitTest.java new file mode 100644 index 0000000000..4322aa6847 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/completableFuture/CompletableFutureUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.concurrent.threadreturnvalue.completableFuture; + +import static com.baeldung.concurrent.threadreturnvalue.task.FactorialCalculator.factorial; +import static java.util.concurrent.CompletableFuture.allOf; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigInteger; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; + +import org.junit.jupiter.api.Test; + +public class CompletableFutureUnitTest { + + @Test + void givenCompletableFuture_whenSupplyAsyncFactorial_thenResultOk() throws ExecutionException, InterruptedException { + CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> factorial(BigInteger.valueOf(10))); + assertEquals(BigInteger.valueOf(3628800), completableFuture.get()); + } + + @Test + void givenCompletableFuture_whenComposeTasks_thenResultOk() throws ExecutionException, InterruptedException { + CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> factorial(BigInteger.valueOf(3))) + .thenCompose(inputFromFirstTask -> CompletableFuture.supplyAsync(() -> factorial(inputFromFirstTask))); + assertEquals(BigInteger.valueOf(720), completableFuture.get()); + } + + @Test + void givenCompletableFuture_whenAllOfTasks_thenResultOk() { + CompletableFuture asyncTask1 = CompletableFuture.supplyAsync(() -> BigInteger.valueOf(5)); + CompletableFuture asyncTask2 = CompletableFuture.supplyAsync(() -> "3"); + + BigInteger result = allOf(asyncTask1, asyncTask2).thenApplyAsync(fn -> factorial(asyncTask1.join()).add(factorial(new BigInteger(asyncTask2.join()))), Executors.newFixedThreadPool(1)) + .join(); + + assertEquals(BigInteger.valueOf(126), result); + } +} diff --git a/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/fork/ForkUnitTest.java b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/fork/ForkUnitTest.java new file mode 100644 index 0000000000..5012fc3745 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-3/src/test/java/com/baeldung/concurrent/threadreturnvalue/fork/ForkUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.concurrent.threadreturnvalue.fork; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigInteger; +import java.util.Arrays; + +import org.junit.jupiter.api.Test; + +import com.baeldung.concurrent.threadreturnvalue.task.callable.CallableFactorialTask; +import com.baeldung.concurrent.threadreturnvalue.task.fork.ForkExecutor; +import com.baeldung.concurrent.threadreturnvalue.task.fork.ForkFactorialTask; + +public class ForkUnitTest { + + private final ForkExecutor forkExecutor = new ForkExecutor(); + + @Test + void givenForkExecutor_whenExecuteRecursiveTask_thenResultOk() { + assertEquals(BigInteger.valueOf(3628800), forkExecutor.execute(new ForkFactorialTask(10, 5))); + } + + @Test + void givenForkExecutor_whenExecuteCallable_thenResultOk() { + assertEquals(BigInteger.valueOf(126), forkExecutor.execute(Arrays.asList(new CallableFactorialTask(5), new CallableFactorialTask(3)))); + } +} From f0124dcca0d4ee745d01c937863d31a500748cd1 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Tue, 6 Jun 2023 04:02:36 +0200 Subject: [PATCH 102/162] [unique-elements-list] Get Unique Values From an ArrayList In Java (#14152) --- .../UniqueElementsInListUnitTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/uniqueelements/UniqueElementsInListUnitTest.java diff --git a/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/uniqueelements/UniqueElementsInListUnitTest.java b/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/uniqueelements/UniqueElementsInListUnitTest.java new file mode 100644 index 0000000000..348a7d8807 --- /dev/null +++ b/core-java-modules/core-java-collections-list-5/src/test/java/com/baeldung/java/uniqueelements/UniqueElementsInListUnitTest.java @@ -0,0 +1,41 @@ +package com.baeldung.java.uniqueelements; + +import static java.util.stream.Collectors.toList; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class UniqueElementsInListUnitTest { + // @formatter:off + private static final List MY_LIST = Arrays.asList(new String[]{ + "Microsoft Windows", + "Mac OS", + "GNU Linux", + "Free BSD", + "GNU Linux", + "Mac OS"}); + // @formatter:on + + @Test + void whenConvertToSet_thenGetExpectedResult() { + List result = new ArrayList<>(new HashSet<>(MY_LIST)); + assertThat(result).containsExactlyInAnyOrder("Free BSD", "Microsoft Windows", "Mac OS", "GNU Linux"); + + result = new ArrayList<>(new LinkedHashSet<>(MY_LIST)); + assertThat(result).containsExactly("Microsoft Windows", "Mac OS", "GNU Linux", "Free BSD"); + } + + @Test + void whenUsingStream_thenGetExpectedResult() { + List result = MY_LIST.stream() + .distinct() + .collect(toList()); + assertThat(result).containsExactly("Microsoft Windows", "Mac OS", "GNU Linux", "Free BSD"); + } +} \ No newline at end of file From 3f9bddc9ab91223111fbbe3105df0ac2e446f1c7 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 6 Jun 2023 09:30:56 +0530 Subject: [PATCH 103/162] JAVA-21456 Upgrade spring-boot-mvc-4 to use SpringDoc in place of SpringFox (#14139) * JAVA-21456 Upgrade spring-boot-mvc-4 to use SpringDoc in place of SpringFox * JAVA-21456 Replace no longer needed ModelAttribute with RequestBody * JAVA-21456 Review comments changes * JAVA-21456 Formatting changes pom * JAVA-21456 Correct formatting pom --- spring-boot-modules/spring-boot-mvc-4/pom.xml | 12 ++++++------ .../swagger/ArticleApplication.java | 18 ++++++------------ .../controller/ArticlesController.java | 2 +- .../springboot/swagger/model/Article.java | 19 +++++++------------ 4 files changed, 20 insertions(+), 31 deletions(-) diff --git a/spring-boot-modules/spring-boot-mvc-4/pom.xml b/spring-boot-modules/spring-boot-mvc-4/pom.xml index b1c079b715..800ca8e31e 100644 --- a/spring-boot-modules/spring-boot-mvc-4/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-4/pom.xml @@ -32,11 +32,11 @@ spring-boot-devtools true - - io.springfox - springfox-boot-starter - ${spring.fox.version} - + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + com.fasterxml.jackson.core jackson-databind @@ -70,7 +70,7 @@
    - 3.0.0 + 1.7.0 com.baeldung.springboot.swagger.ArticleApplication diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java index 8be380baa0..2b8388f914 100644 --- a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/ArticleApplication.java @@ -5,14 +5,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; @SpringBootApplication -@EnableSwagger2 @EnableWebMvc public class ArticleApplication { @@ -21,12 +17,10 @@ public class ArticleApplication { } @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); + public OpenAPI openAPI() { + return new OpenAPI().info(new Info().title("SpringDoc example") + .description("SpringDoc application") + .version("v0.0.1")); } } diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java index c4336a7cfe..96812e367a 100644 --- a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/controller/ArticlesController.java @@ -21,7 +21,7 @@ public class ArticlesController { } @PostMapping("") - public void addArticle(@ModelAttribute Article article) { + public void addArticle(@RequestBody Article article) { articleService.addArticle(article); } diff --git a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Article.java b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Article.java index f6318c04b3..8a54e54427 100644 --- a/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Article.java +++ b/spring-boot-modules/spring-boot-mvc-4/src/main/java/com/baeldung/springboot/swagger/model/Article.java @@ -1,21 +1,16 @@ package com.baeldung.springboot.swagger.model; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonView; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiParam; - +import io.swagger.v3.oas.annotations.Hidden; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.AccessMode; public class Article { - //@JsonIgnore - //@JsonProperty(access = JsonProperty.Access.READ_ONLY) - //@ApiModelProperty(hidden = true) - //@ApiParam(hidden = true) - //@ApiModelProperty(readOnly = true) - @ApiParam(hidden = true) + // @JsonIgnore + // @JsonProperty(access = JsonProperty.Access.READ_ONLY) + // @Schema(accessMode = AccessMode.READ_ONLY) + @Hidden private int id; private String title; private int numOfWords; From 0e4baeda6aed7916be070973bc7fa06492c8e497 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 6 Jun 2023 10:54:12 +0530 Subject: [PATCH 104/162] JAVA-21459 Upgrade spring-rest-http-2 to use SpringDoc in place of SpringFox (#14131) * JAVA-21459 Upgrade spring-rest-http-2 to use SpringDoc in place of SpringFox * JAVA-21459 Code Review changes * JAVA-21459 Formatting pom changes * JAVA-21459 Formatting pom changes --- spring-web-modules/spring-rest-http-2/pom.xml | 22 ++++++++------- .../endpoint/swagger/SpringDocConfig.java | 17 +++++++++++ .../endpoint/swagger/SpringFoxConfig.java | 21 -------------- .../disable/SwaggerUIDisableApplication.java | 12 ++++++++ .../disable/config/SwaggerConfig.java | 28 ++++++------------- .../controllers/VersionController.java | 4 +-- 6 files changed, 51 insertions(+), 53 deletions(-) create mode 100644 spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringDocConfig.java delete mode 100644 spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java create mode 100644 spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/SwaggerUIDisableApplication.java diff --git a/spring-web-modules/spring-rest-http-2/pom.xml b/spring-web-modules/spring-rest-http-2/pom.xml index 10d904e302..d83a83c690 100644 --- a/spring-web-modules/spring-rest-http-2/pom.xml +++ b/spring-web-modules/spring-rest-http-2/pom.xml @@ -24,16 +24,6 @@ org.springframework.boot spring-boot-starter-webflux - - io.springfox - springfox-swagger2 - ${swagger2.version} - - - io.springfox - springfox-swagger-ui - ${swagger2.version} - com.h2database h2 @@ -47,11 +37,23 @@ resilience4j-timelimiter ${resilience4j.version} + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + com.google.guava + guava + ${guava.version} + 2.9.2 1.6.1 + 1.7.0 + 31.0.1-jre \ No newline at end of file diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringDocConfig.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringDocConfig.java new file mode 100644 index 0000000000..2df6cd118c --- /dev/null +++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringDocConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.endpoint.swagger; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; + +@Configuration +public class SpringDocConfig { + + @Bean + public OpenAPI openAPI() { + return new OpenAPI().info(new Info().title("SpringDoc example") + .description("SpringDoc application") + .version("v0.0.1")); + } +} diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java deleted file mode 100644 index bd258122cd..0000000000 --- a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/endpoint/swagger/SpringFoxConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.endpoint.swagger; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -@Configuration -public class SpringFoxConfig { - - @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); - } -} diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/SwaggerUIDisableApplication.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/SwaggerUIDisableApplication.java new file mode 100644 index 0000000000..5aa4f219f0 --- /dev/null +++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/SwaggerUIDisableApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.swaggerui.disable; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SwaggerUIDisableApplication { + + public static void main(String[] args) { + SpringApplication.run(SwaggerUIDisableApplication.class, args); + } +} diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/config/SwaggerConfig.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/config/SwaggerConfig.java index e3c0237b06..d9981b7097 100644 --- a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/config/SwaggerConfig.java +++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/config/SwaggerConfig.java @@ -6,33 +6,21 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; @Profile("!prod && swagger") //@Profile("!prod") // @Profile("swagger") // @ConditionalOnExpression(value = "${useSwagger:false}") @Configuration -@EnableSwagger2 -public class SwaggerConfig implements WebMvcConfigurer { +public class SwaggerConfig { @Bean - public Docket api() { - return new Docket(DocumentationType.SWAGGER_2).select() - .apis(RequestHandlerSelectors.basePackage("com.baeldung")) - .paths(PathSelectors.regex("/.*")) - .build(); - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("swagger-ui.html") - .addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**") - .addResourceLocations("classpath:/META-INF/resources/webjars/"); + public OpenAPI openAPI() { + return new OpenAPI().info(new Info().title("SpringDoc Disable SwaggerUI example") + .description("SpringDoc Disable SwaggerUI application") + .version("v0.0.1")); } } diff --git a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/controllers/VersionController.java b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/controllers/VersionController.java index 8f8115197e..403c7f6aa5 100644 --- a/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/controllers/VersionController.java +++ b/spring-web-modules/spring-rest-http-2/src/main/java/com/baeldung/swaggerui/disable/controllers/VersionController.java @@ -1,6 +1,6 @@ package com.baeldung.swaggerui.disable.controllers; -import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.Operation; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -14,7 +14,7 @@ public class VersionController { this.environment = environment; } - @ApiOperation(value = "Get the currently deployed API version and active Spring profiles") + @Operation(summary = "Get the currently deployed API version and active Spring profiles") @GetMapping("/api/version") public Version getVersion() { return new Version("1.0", environment.getActiveProfiles()); From ccec4cbf91a06c0b6ed4cc0a8fb88aacf4f676e6 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:27:42 +0300 Subject: [PATCH 105/162] Java 15022 (#14174) * [JAVA-15022] Clean up * [JAVA-15022] Clean up --- .../httpclient/GetRequestMockServer.java | 7 +- .../httpclient/HttpAsyncClientLiveTest.java | 34 +++----- .../httpclient/GetRequestMockServer.java | 77 +++++++++++++++++++ .../httpclient/HttpAsyncClientV4LiveTest.java | 5 +- 4 files changed, 93 insertions(+), 30 deletions(-) create mode 100644 apache-httpclient4/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java index f65558906f..988a89e7af 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java @@ -21,7 +21,7 @@ public class GetRequestMockServer { public static String serviceOneUrl; public static String serviceTwoUrl; - private static int serverPort; + public static int serverPort; public static final String SERVER_ADDRESS = "127.0.0.1"; public static final String PATH_ONE = "/test1"; @@ -29,9 +29,8 @@ public class GetRequestMockServer { public static final String METHOD = "GET"; @BeforeAll - static void startServer() throws IOException, URISyntaxException { - //serverPort = getFreePort(); - serverPort = 8080; + static void startServer() throws IOException { + serverPort = getFreePort(); System.out.println("Free port "+serverPort); serviceOneUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_ONE; serviceTwoUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_TWO; diff --git a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java index f4b9266d7e..123c51bb86 100644 --- a/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java +++ b/apache-httpclient/src/test/java/com/baeldung/httpclient/HttpAsyncClientLiveTest.java @@ -9,6 +9,7 @@ import java.util.concurrent.Future; import javax.net.ssl.SSLContext; +import org.apache.hc.client5.http.impl.routing.DefaultProxyRoutePlanner; import org.junit.jupiter.api.Test; import org.apache.hc.client5.http.async.methods.SimpleHttpRequest; @@ -55,12 +56,12 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { @Test void whenUseHttpAsyncClient_thenCorrect() throws InterruptedException, ExecutionException, IOException { - final HttpHost target = new HttpHost(HOST); + final HttpHost target = new HttpHost(HOST_WITH_COOKIE); final SimpleHttpRequest request = SimpleRequestBuilder.get() .setHttpHost(target) .build(); - final CloseableHttpAsyncClient client = HttpAsyncClients.createDefault(); + final CloseableHttpAsyncClient client = HttpAsyncClients.custom().build(); client.start(); @@ -102,30 +103,15 @@ class HttpAsyncClientLiveTest extends GetRequestMockServer { @Test void whenUseProxyWithHttpClient_thenCorrect() throws Exception { - final CloseableHttpAsyncClient client = HttpAsyncClients.createDefault(); + final HttpHost proxy = new HttpHost("127.0.0.1", GetRequestMockServer.serverPort); + DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy); + final CloseableHttpAsyncClient client = HttpAsyncClients.custom() + .setRoutePlanner(routePlanner) + .build(); client.start(); - final HttpHost proxy = new HttpHost("127.0.0.1", 8080); - final RequestConfig config = RequestConfig.custom().setProxy(proxy).build(); + final SimpleHttpRequest request = new SimpleHttpRequest("GET" ,HOST_WITH_PROXY); - request.setConfig(config); - final Future future = client.execute(request, new FutureCallback<>(){ - @Override - public void completed(SimpleHttpResponse response) { - - System.out.println("responseData"); - } - - @Override - public void failed(Exception ex) { - System.out.println("Error executing HTTP request: " + ex.getMessage()); - } - - @Override - public void cancelled() { - System.out.println("HTTP request execution cancelled"); - } - }); - + final Future future = client.execute(request, null); final HttpResponse response = future.get(); assertThat(response.getCode(), equalTo(200)); client.close(); diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java new file mode 100644 index 0000000000..ae432e68f0 --- /dev/null +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/GetRequestMockServer.java @@ -0,0 +1,77 @@ +package com.baeldung.httpclient; + +import static org.mockserver.integration.ClientAndServer.startClientAndServer; +import static org.mockserver.matchers.Times.exactly; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.URISyntaxException; + +import org.apache.http.HttpStatus; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.mockserver.client.MockServerClient; +import org.mockserver.integration.ClientAndServer; + +public class GetRequestMockServer { + + public static ClientAndServer mockServer; + public static String serviceOneUrl; + public static String serviceTwoUrl; + + public static int serverPort; + + public static final String SERVER_ADDRESS = "127.0.0.1"; + public static final String PATH_ONE = "/test1"; + public static final String PATH_TWO = "/test2"; + public static final String METHOD = "GET"; + + @BeforeAll + static void startServer() throws IOException, URISyntaxException { + serverPort = getFreePort(); + serviceOneUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_ONE; + serviceTwoUrl = "http://" + SERVER_ADDRESS + ":" + serverPort + PATH_TWO; + mockServer = startClientAndServer(serverPort); + mockGetRequest(); + } + + @AfterAll + static void stopServer() { + mockServer.stop(); + } + + private static void mockGetRequest() { + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH_ONE) + .withMethod(METHOD), + exactly(5) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + .withBody("{\"status\":\"ok\"}") + ); + new MockServerClient(SERVER_ADDRESS, serverPort) + .when( + request() + .withPath(PATH_TWO) + .withMethod(METHOD), + exactly(1) + ) + .respond( + response() + .withStatusCode(HttpStatus.SC_OK) + .withBody("{\"status\":\"ok\"}") + ); + } + + private static int getFreePort () throws IOException { + try (ServerSocket serverSocket = new ServerSocket(0)) { + return serverSocket.getLocalPort(); + } + } +} diff --git a/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpAsyncClientV4LiveTest.java b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpAsyncClientV4LiveTest.java index dc0055c5ae..e097f9f511 100644 --- a/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpAsyncClientV4LiveTest.java +++ b/apache-httpclient4/src/test/java/com/baeldung/httpclient/HttpAsyncClientV4LiveTest.java @@ -31,7 +31,8 @@ import org.apache.http.protocol.HttpContext; import org.apache.http.ssl.SSLContexts; import org.junit.jupiter.api.Test; -class HttpAsyncClientV4LiveTest { + +class HttpAsyncClientV4LiveTest extends GetRequestMockServer { private static final String HOST = "http://www.google.com"; private static final String HOST_WITH_SSL = "https://mms.nw.ru/"; @@ -87,7 +88,7 @@ class HttpAsyncClientV4LiveTest { void whenUseProxyWithHttpClient_thenCorrect() throws Exception { final CloseableHttpAsyncClient client = HttpAsyncClients.createDefault(); client.start(); - final HttpHost proxy = new HttpHost("127.0.0.1", 8080); + final HttpHost proxy = new HttpHost("127.0.0.1", GetRequestMockServer.serverPort); final RequestConfig config = RequestConfig.custom().setProxy(proxy).build(); final HttpGet request = new HttpGet(HOST_WITH_PROXY); request.setConfig(config); From 3fe2a1ab3ffd870365bbb56d4a797feb97add6d5 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:33:29 +0300 Subject: [PATCH 106/162] [JAVA-21772] Clean up (#14178) --- server-modules/undertow/pom.xml | 1 - server-modules/wildfly/pom.xml | 5 ----- spf4j/pom.xml | 5 +++++ spf4j/spf4j-aspects-app/pom.xml | 8 +------- spf4j/spf4j-core-app/pom.xml | 8 +------- spring-actuator/pom.xml | 4 ++-- spring-aop-2/pom.xml | 2 -- spring-aop/pom.xml | 2 -- 8 files changed, 9 insertions(+), 26 deletions(-) diff --git a/server-modules/undertow/pom.xml b/server-modules/undertow/pom.xml index 7d446c29d2..42a46d9508 100644 --- a/server-modules/undertow/pom.xml +++ b/server-modules/undertow/pom.xml @@ -32,7 +32,6 @@ org.apache.maven.plugins maven-jar-plugin - ${maven-jar-plugin.version} diff --git a/server-modules/wildfly/pom.xml b/server-modules/wildfly/pom.xml index af742c7bd3..fece3c9866 100644 --- a/server-modules/wildfly/pom.xml +++ b/server-modules/wildfly/pom.xml @@ -63,7 +63,6 @@ org.apache.maven.plugins maven-war-plugin - ${maven-war-plugin.version} @@ -75,8 +74,4 @@ - - 3.3.2 - - \ No newline at end of file diff --git a/spf4j/pom.xml b/spf4j/pom.xml index 6d325947cf..9d747f11dc 100644 --- a/spf4j/pom.xml +++ b/spf4j/pom.xml @@ -19,4 +19,9 @@ spf4j-aspects-app + + 1.10.2 + 8.9.0 + 3.1.1 + \ No newline at end of file diff --git a/spf4j/spf4j-aspects-app/pom.xml b/spf4j/spf4j-aspects-app/pom.xml index 3eccdd879a..9769ff77f3 100644 --- a/spf4j/spf4j-aspects-app/pom.xml +++ b/spf4j/spf4j-aspects-app/pom.xml @@ -45,7 +45,7 @@ org.apache.avro avro - 1.10.2 + ${avro.version} @@ -59,7 +59,6 @@ org.apache.maven.plugins maven-dependency-plugin - ${dependency.plugin.version} copy-dependencies @@ -91,9 +90,4 @@ - - 8.9.0 - 3.1.1 - - \ No newline at end of file diff --git a/spf4j/spf4j-core-app/pom.xml b/spf4j/spf4j-core-app/pom.xml index 20251860aa..ee82ea869a 100644 --- a/spf4j/spf4j-core-app/pom.xml +++ b/spf4j/spf4j-core-app/pom.xml @@ -51,7 +51,7 @@ org.apache.avro avro - 1.10.2 + ${avro.version} @@ -65,7 +65,6 @@ org.apache.maven.plugins maven-dependency-plugin - ${dependency.plugin.version} copy-dependencies @@ -97,9 +96,4 @@ - - 8.9.0 - 3.1.1 - - \ No newline at end of file diff --git a/spring-actuator/pom.xml b/spring-actuator/pom.xml index 48dae45940..20b80d9924 100644 --- a/spring-actuator/pom.xml +++ b/spring-actuator/pom.xml @@ -19,7 +19,7 @@ jakarta.servlet jakarta.servlet-api - 5.0.0 + ${jakarta.servlet-api.version} provided @@ -49,7 +49,6 @@ org.apache.maven.plugins maven-war-plugin - 3.3.2 @@ -68,6 +67,7 @@ + 5.0.0 3.0.6 11.0.15 diff --git a/spring-aop-2/pom.xml b/spring-aop-2/pom.xml index cb84ed4ca2..e4748cdcbf 100644 --- a/spring-aop-2/pom.xml +++ b/spring-aop-2/pom.xml @@ -44,7 +44,6 @@ org.apache.maven.plugins maven-war-plugin - ${maven-war-plugin.version} false @@ -54,7 +53,6 @@ 1.14.0 - 3.3.2 \ No newline at end of file diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml index ae5ab5fce1..2b84e2a432 100644 --- a/spring-aop/pom.xml +++ b/spring-aop/pom.xml @@ -72,7 +72,6 @@ org.apache.maven.plugins maven-war-plugin - ${maven-war-plugin.version} false @@ -82,7 +81,6 @@ 1.14.0 - 3.3.2 \ No newline at end of file From 39c34bf1d616d2506203e286837d3f5790cd15a5 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:37:00 +0300 Subject: [PATCH 107/162] [JAVA-21538] (#14163) --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 8a494719a8..5c4ed1429e 100644 --- a/pom.xml +++ b/pom.xml @@ -370,6 +370,7 @@ persistence-modules/deltaspike persistence-modules/hibernate-ogm persistence-modules/java-cassandra + persistence-modules/spring-data-cassandra-reactive @@ -551,6 +552,7 @@ persistence-modules/deltaspike persistence-modules/hibernate-ogm persistence-modules/java-cassandra + persistence-modules/spring-data-cassandra-reactive From dcda0ca76997f387a4e084feea938f9a02926468 Mon Sep 17 00:00:00 2001 From: timis1 <12120641+timis1@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:43:33 +0300 Subject: [PATCH 108/162] JAVA-20164 Renaming test methods (#14177) Co-authored-by: timis1 --- .../com/baeldung/dao/PersonDaoIntegrationTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/persistence-modules/querydsl/src/test/java/com/baeldung/dao/PersonDaoIntegrationTest.java b/persistence-modules/querydsl/src/test/java/com/baeldung/dao/PersonDaoIntegrationTest.java index e9cf679c43..879b4238db 100644 --- a/persistence-modules/querydsl/src/test/java/com/baeldung/dao/PersonDaoIntegrationTest.java +++ b/persistence-modules/querydsl/src/test/java/com/baeldung/dao/PersonDaoIntegrationTest.java @@ -25,7 +25,7 @@ public class PersonDaoIntegrationTest { // @Test - public void testCreation() { + public void givenExistingPersons_whenFindingPersonByFirstName_thenFound() { personDao.save(new Person("Erich", "Gamma")); final Person person = new Person("Kent", "Beck"); personDao.save(person); @@ -36,7 +36,7 @@ public class PersonDaoIntegrationTest { } @Test - public void testMultipleFilter() { + public void givenExistingPersons_whenFindingPersonByFirstNameAndSurName_thenFound() { personDao.save(new Person("Erich", "Gamma")); final Person person = personDao.save(new Person("Ralph", "Beck")); final Person person2 = personDao.save(new Person("Ralph", "Johnson")); @@ -47,7 +47,7 @@ public class PersonDaoIntegrationTest { } @Test - public void testOrdering() { + public void givenExistingPersons_whenFindingPersonByFirstNameInDescendingOrder_thenFound() { final Person person = personDao.save(new Person("Kent", "Gamma")); personDao.save(new Person("Ralph", "Johnson")); final Person person2 = personDao.save(new Person("Kent", "Zivago")); @@ -58,7 +58,7 @@ public class PersonDaoIntegrationTest { } @Test - public void testMaxAge() { + public void givenExistingPersons_whenFindingMaxAge_thenFound() { personDao.save(new Person("Kent", "Gamma", 20)); personDao.save(new Person("Ralph", "Johnson", 35)); personDao.save(new Person("Kent", "Zivago", 30)); @@ -68,7 +68,7 @@ public class PersonDaoIntegrationTest { } @Test - public void testMaxAgeByName() { + public void givenExistingPersons_whenFindingMaxAgeByName_thenFound() { personDao.save(new Person("Kent", "Gamma", 20)); personDao.save(new Person("Ralph", "Johnson", 35)); personDao.save(new Person("Kent", "Zivago", 30)); From a66251654d85511c81b9ea9cc8b7ea3ba24f9173 Mon Sep 17 00:00:00 2001 From: panos-kakos <102670093+panos-kakos@users.noreply.github.com> Date: Tue, 6 Jun 2023 12:21:21 +0300 Subject: [PATCH 109/162] Task 20625 (#14164) * [TASK-20625] Upgraded testing-modules to jdk9-and-above profile * [TASK-20625] Fixed failing modules * [TASK-20625] Removed ninja submodule from build * Update pom.xml --------- Co-authored-by: Dhawal Kapil --- pom.xml | 6 ++---- testing-modules/junit-5-advanced/pom.xml | 2 ++ testing-modules/junit-5-basics/pom.xml | 11 ++++++++++ testing-modules/junit-5/pom.xml | 10 +++++++--- .../SelectPackagesSuiteUnitTest.java | 2 +- testing-modules/mocks/pom.xml | 20 +++++++++++++++++++ testing-modules/pom.xml | 1 + testing-modules/powermock/pom.xml | 16 ++++++++++++++- testing-modules/testing-libraries-2/pom.xml | 10 ++++++++++ testing-modules/testng/pom.xml | 2 +- web-modules/pom.xml | 4 ++-- 11 files changed, 72 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 5c4ed1429e..79b2071507 100644 --- a/pom.xml +++ b/pom.xml @@ -431,7 +431,6 @@ spring-soap spring-static-resources spring-swagger-codegen - testing-modules video-tutorials @@ -605,7 +604,6 @@ spring-soap spring-static-resources spring-swagger-codegen - testing-modules video-tutorials @@ -803,7 +801,7 @@ quarkus-modules spring-reactive-modules spring-swagger-codegen/custom-validations-opeanpi-codegen - testing-modules/testing-assertions + testing-modules testing-modules/mockito-simple rule-engines-modules @@ -1065,7 +1063,7 @@ quarkus-modules spring-reactive-modules spring-swagger-codegen/custom-validations-opeanpi-codegen - testing-modules/testing-assertions + testing-modules testing-modules/mockito-simple rule-engines-modules diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml index 998f6561ea..3ae62eac2e 100644 --- a/testing-modules/junit-5-advanced/pom.xml +++ b/testing-modules/junit-5-advanced/pom.xml @@ -53,6 +53,7 @@ org.apache.maven.plugins maven-surefire-plugin + ${maven-surefire-plugin.version} -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar @@ -70,6 +71,7 @@ 1.49 3.24.2 1.9.2 + 3.0.0 \ No newline at end of file diff --git a/testing-modules/junit-5-basics/pom.xml b/testing-modules/junit-5-basics/pom.xml index a758d79069..9c3cf7a7e4 100644 --- a/testing-modules/junit-5-basics/pom.xml +++ b/testing-modules/junit-5-basics/pom.xml @@ -61,6 +61,17 @@ true + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + + + + diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index 047eddcbcb..8afaa085b1 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -121,8 +121,13 @@ org.apache.maven.plugins - maven-surefire-report-plugin - ${surefire.report.plugin} + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.time=ALL-UNNAMED + + @@ -131,7 +136,6 @@ 2.17.1 2.0.9 5.0.1.RELEASE - 3.0.0-M3 3.3.0 diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java index ef8756a2bb..088fc00853 100644 --- a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java @@ -4,7 +4,7 @@ import org.junit.platform.suite.api.SelectPackages; import org.junit.platform.suite.api.Suite; @Suite -@SelectPackages({ "com.baeldung.java.suite.childpackage1", "com.baeldung.java.suite.childpackage2" }) +@SelectPackages({ "com.baeldung.java.suite.junit4", "com.baeldung.java.suite.junit5" }) public class SelectPackagesSuiteUnitTest { } diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index e447639288..281fff38c2 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -43,6 +43,26 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + -Djdk.attach.allowAttachSelf + + true + + **/testsuite/**/*UnitTest.java + + + + + + 0.15 1.5 diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 9080d5a0ea..8040113a03 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -44,6 +44,7 @@ spring-mockito spring-testing-2 spring-testing + testing-assertions test-containers testing-libraries-2 testing-libraries diff --git a/testing-modules/powermock/pom.xml b/testing-modules/powermock/pom.xml index f3237ed4df..8eedc818af 100644 --- a/testing-modules/powermock/pom.xml +++ b/testing-modules/powermock/pom.xml @@ -26,9 +26,23 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + + + + + + 2.21.0 - 2.0.7 + 2.0.9 \ No newline at end of file diff --git a/testing-modules/testing-libraries-2/pom.xml b/testing-modules/testing-libraries-2/pom.xml index b0680c1e40..6e8ab599b4 100644 --- a/testing-modules/testing-libraries-2/pom.xml +++ b/testing-modules/testing-libraries-2/pom.xml @@ -93,6 +93,16 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.lang=ALL-UNNAMED + + + diff --git a/testing-modules/testng/pom.xml b/testing-modules/testng/pom.xml index 72c220c118..62e2b2e578 100644 --- a/testing-modules/testng/pom.xml +++ b/testing-modules/testng/pom.xml @@ -79,7 +79,7 @@ - 7.1.0 + 7.8.0 \ No newline at end of file diff --git a/web-modules/pom.xml b/web-modules/pom.xml index efd87ba642..cdbc2db036 100644 --- a/web-modules/pom.xml +++ b/web-modules/pom.xml @@ -26,7 +26,7 @@ jooby linkrest - ninja + ratpack @@ -49,4 +49,4 @@ - \ No newline at end of file + From 0d8db7af6ab4a6cea989e4660332e6a12802540c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Peterli=C4=87?= Date: Tue, 6 Jun 2023 15:17:16 +0200 Subject: [PATCH 110/162] BAEL-6491 - Why is Field Injection not Recommended? (#14146) --- .../baeldung/fieldinjection/EmailService.java | 21 ++++++++++ .../fieldinjection/EmailValidator.java | 17 +++++++++ .../fieldinjection/EmailServiceUnitTest.java | 38 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailService.java create mode 100644 spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailValidator.java create mode 100644 spring-di-4/src/test/java/com/baeldung/fieldinjection/EmailServiceUnitTest.java diff --git a/spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailService.java b/spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailService.java new file mode 100644 index 0000000000..2c28b5baf4 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailService.java @@ -0,0 +1,21 @@ +package com.baeldung.fieldinjection; + +import org.springframework.stereotype.Service; + +@Service +public class EmailService { + + public static final String INVALID_EMAIL = "Invalid email"; + private final EmailValidator emailValidator; + + public EmailService(final EmailValidator emailValidator) { + this.emailValidator = emailValidator; + } + + public void process(String email) { + if (!emailValidator.isValid(email)) { + throw new IllegalArgumentException(INVALID_EMAIL); + } + // ... + } +} \ No newline at end of file diff --git a/spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailValidator.java b/spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailValidator.java new file mode 100644 index 0000000000..884a139781 --- /dev/null +++ b/spring-di-4/src/main/java/com/baeldung/fieldinjection/EmailValidator.java @@ -0,0 +1,17 @@ +package com.baeldung.fieldinjection; + +import org.springframework.stereotype.Component; + +import java.util.regex.Pattern; + +@Component +public class EmailValidator { + + private static final String REGEX_PATTERN = "^(.+)@(\\S+)$"; + + public boolean isValid(final String email) { + return Pattern.compile(REGEX_PATTERN) + .matcher(email) + .matches(); + } +} diff --git a/spring-di-4/src/test/java/com/baeldung/fieldinjection/EmailServiceUnitTest.java b/spring-di-4/src/test/java/com/baeldung/fieldinjection/EmailServiceUnitTest.java new file mode 100644 index 0000000000..b2bcbad811 --- /dev/null +++ b/spring-di-4/src/test/java/com/baeldung/fieldinjection/EmailServiceUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.fieldinjection; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class EmailServiceUnitTest { + + private EmailValidator emailValidator; + + private EmailService emailService; + + @BeforeEach + public void setup() { + this.emailValidator = Mockito.mock(EmailValidator.class); + this.emailService = new EmailService(emailValidator); + } + + @Test + void givenInvalidEmail_whenProcess_thenThrowException() { + String email = "testbaeldung.com"; + + when(emailValidator.isValid(email)).thenReturn(false); + + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> emailService.process(email)); + + assertNotNull(exception); + assertEquals(EmailService.INVALID_EMAIL, exception.getMessage()); + } +} From a0d7405115011b3afbece6d68bc0cf05d560cf66 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Tue, 6 Jun 2023 23:27:46 +0200 Subject: [PATCH 111/162] BAEL-5776 - Mock a URL Connection in Java (#14184) * BAEL-4706 - Spring Boot with Spring Batch * BAEL-3948 - Fix test(s) in spring-batch which leaves repository.sqlite changed * BAEL-4736 - Convert JSONArray to List of Object using camel-jackson * BAEL-4756 - Mockito MockSettings * BAEL-4756 - Mockito MockSettings - fix spelling * BAEL-2674 - Upgrade the Okhttp article * BAEL-4204 - Adding Interceptors in OkHTTP * BAEL-4836 - Mocking Static Methods with Mockito * BAEL-4205 - A Guide to Events in OkHTTP * BAEL-5408 - Update Camel version in spring-boot-camel module * BAEL-5234 - Apache Camel Routes Testing in Spring Boot * BAEL-5234 - Apache Camel Routes Testing in Spring Boot * BAEL-5237 - Apache Camel Conditional Routing * BAEL-5236 - Apache Camel Exception Handling * BAEL-5890 - Jackson's Deserialization with Lombok * BAEL-5890 - Jackson's Deserialization with Lombok * BAEL-5890 - Jackson's Deserialization with Lombok * BAEL-5890 - Jackson's Deserialization with Lombok * BAEL-5890 - Jackson's Deserialization with Lombok * BAEL-5776 - Mock a URL Connection in Java * BAEL-5776 - Mock a URL Connection in Java --------- Co-authored-by: Jonathan Cook Co-authored-by: jcook02 --- libraries-http-2/pom.xml | 25 +++++++++++ .../com/baeldung/mock/url/UrlFetcher.java | 23 ++++++++++ .../mock/url/MockHttpURLConnection.java | 35 ++++++++++++++++ .../mock/url/MockURLStreamHandler.java | 21 ++++++++++ .../mock/url/MockURLStreamHandlerFactory.java | 19 +++++++++ .../mock/url/UrlFetcherJMockitUnitTest.java | 42 +++++++++++++++++++ .../mock/url/UrlFetcherMockitoUnitTest.java | 39 +++++++++++++++++ .../baeldung/mock/url/UrlFetcherUnitTest.java | 40 ++++++++++++++++++ 8 files changed, 244 insertions(+) create mode 100644 libraries-http-2/src/main/java/com/baeldung/mock/url/UrlFetcher.java create mode 100644 libraries-http-2/src/test/java/com/baeldung/mock/url/MockHttpURLConnection.java create mode 100644 libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandler.java create mode 100644 libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandlerFactory.java create mode 100644 libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherJMockitUnitTest.java create mode 100644 libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherMockitoUnitTest.java create mode 100644 libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherUnitTest.java diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml index d8479def3c..77498dd248 100644 --- a/libraries-http-2/pom.xml +++ b/libraries-http-2/pom.xml @@ -82,7 +82,31 @@ converter-gson ${retrofit.version} + + org.mockito + mockito-inline + ${mockito.version} + test + + + org.jmockit + jmockit + ${jmockit.version} + + + + + + maven-surefire-plugin + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + + + + 4.9.1 @@ -95,6 +119,7 @@ 5.1.9.RELEASE 1.0.3 3.2.12.RELEASE + 1.49 \ No newline at end of file diff --git a/libraries-http-2/src/main/java/com/baeldung/mock/url/UrlFetcher.java b/libraries-http-2/src/main/java/com/baeldung/mock/url/UrlFetcher.java new file mode 100644 index 0000000000..bb9ba4a5f9 --- /dev/null +++ b/libraries-http-2/src/main/java/com/baeldung/mock/url/UrlFetcher.java @@ -0,0 +1,23 @@ +package com.baeldung.mock.url; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class UrlFetcher { + + private URL url; + + public UrlFetcher(URL url) throws IOException { + this.url = url; + } + + public boolean isUrlAvailable() throws IOException { + return getResponseCode() == HttpURLConnection.HTTP_OK; + } + + private int getResponseCode() throws IOException { + HttpURLConnection con = (HttpURLConnection) this.url.openConnection(); + return con.getResponseCode(); + } +} diff --git a/libraries-http-2/src/test/java/com/baeldung/mock/url/MockHttpURLConnection.java b/libraries-http-2/src/test/java/com/baeldung/mock/url/MockHttpURLConnection.java new file mode 100644 index 0000000000..9df05fe0d0 --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/mock/url/MockHttpURLConnection.java @@ -0,0 +1,35 @@ +package com.baeldung.mock.url; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class MockHttpURLConnection extends HttpURLConnection { + + protected MockHttpURLConnection(URL url) { + super(url); + } + + @Override + public int getResponseCode() { + return responseCode; + } + + public void setResponseCode(int responseCode) { + this.responseCode = responseCode; + } + + @Override + public void disconnect() { + } + + @Override + public boolean usingProxy() { + return false; + } + + @Override + public void connect() throws IOException { + } + +} diff --git a/libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandler.java b/libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandler.java new file mode 100644 index 0000000000..1cc09dc2e9 --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandler.java @@ -0,0 +1,21 @@ +package com.baeldung.mock.url; + +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; + +public class MockURLStreamHandler extends URLStreamHandler { + + private MockHttpURLConnection mockHttpURLConnection; + + public MockURLStreamHandler(MockHttpURLConnection mockHttpURLConnection) { + this.mockHttpURLConnection = mockHttpURLConnection; + } + + @Override + protected URLConnection openConnection(URL url) throws IOException { + return this.mockHttpURLConnection; + } + +} diff --git a/libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandlerFactory.java b/libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandlerFactory.java new file mode 100644 index 0000000000..855c761b65 --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/mock/url/MockURLStreamHandlerFactory.java @@ -0,0 +1,19 @@ +package com.baeldung.mock.url; + +import java.net.URLStreamHandler; +import java.net.URLStreamHandlerFactory; + +public class MockURLStreamHandlerFactory implements URLStreamHandlerFactory { + + private MockHttpURLConnection mockHttpURLConnection; + + public MockURLStreamHandlerFactory(MockHttpURLConnection mockHttpURLConnection) { + this.mockHttpURLConnection = mockHttpURLConnection; + } + + @Override + public URLStreamHandler createURLStreamHandler(String protocol) { + return new MockURLStreamHandler(this.mockHttpURLConnection); + } + +} diff --git a/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherJMockitUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherJMockitUnitTest.java new file mode 100644 index 0000000000..b99dcd282d --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherJMockitUnitTest.java @@ -0,0 +1,42 @@ +package com.baeldung.mock.url; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.net.HttpURLConnection; +import java.net.URL; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import mockit.Expectations; +import mockit.Mocked; +import mockit.integration.junit5.JMockitExtension; + + +@ExtendWith(JMockitExtension.class) +class UrlFetcherJMockitUnitTest { + + @Test + void givenMockedUrl_whenRequestSent_thenIsUrlAvailableTrue(@Mocked URL anyURL, @Mocked HttpURLConnection mockConn) throws Exception { + new Expectations() {{ + mockConn.getResponseCode(); + result = HttpURLConnection.HTTP_OK; + }}; + + UrlFetcher fetcher = new UrlFetcher(new URL("https://www.baeldung.com/")); + assertTrue(fetcher.isUrlAvailable(), "Url should be available: "); + } + + @Test + void givenMockedUrl_whenRequestSent_thenIsUrlAvailableFalse(@Mocked URL anyURL, @Mocked HttpURLConnection mockConn) throws Exception { + new Expectations() {{ + mockConn.getResponseCode(); + result = HttpURLConnection.HTTP_INTERNAL_ERROR; + }}; + + UrlFetcher fetcher = new UrlFetcher(new URL("https://www.baeldung.com/")); + assertFalse(fetcher.isUrlAvailable(), "Url should NOT be available: "); + } + +} diff --git a/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherMockitoUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherMockitoUnitTest.java new file mode 100644 index 0000000000..bd998e83b4 --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherMockitoUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.mock.url; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.net.HttpURLConnection; +import java.net.URL; + +import org.junit.jupiter.api.Test; + +class UrlFetcherMockitoUnitTest { + + @Test + void givenMockedUrl_whenRequestSent_thenIsUrlAvailableTrue() throws Exception { + HttpURLConnection mockHttpURLConnection = mock(HttpURLConnection.class); + when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_OK); + + URL mockURL = mock(URL.class); + when(mockURL.openConnection()).thenReturn(mockHttpURLConnection); + + UrlFetcher fetcher = new UrlFetcher(mockURL); + assertTrue(fetcher.isUrlAvailable(), "Url should be available: "); + } + + @Test + void givenMockedUrl_whenRequestSent_thenIsUrlAvailableFalse() throws Exception { + HttpURLConnection mockHttpURLConnection = mock(HttpURLConnection.class); + when(mockHttpURLConnection.getResponseCode()).thenReturn(HttpURLConnection.HTTP_NOT_FOUND); + + URL mockURL = mock(URL.class); + when(mockURL.openConnection()).thenReturn(mockHttpURLConnection); + + UrlFetcher fetcher = new UrlFetcher(mockURL); + assertFalse(fetcher.isUrlAvailable(), "Url should NOT be available: "); + } + +} diff --git a/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherUnitTest.java b/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherUnitTest.java new file mode 100644 index 0000000000..be3a784a99 --- /dev/null +++ b/libraries-http-2/src/test/java/com/baeldung/mock/url/UrlFetcherUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.mock.url; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.net.HttpURLConnection; +import java.net.URL; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class UrlFetcherUnitTest { + + private static MockHttpURLConnection mockHttpURLConnection; + + @BeforeAll + public static void setUp() { + mockHttpURLConnection = new MockHttpURLConnection(null); + URL.setURLStreamHandlerFactory(new MockURLStreamHandlerFactory(mockHttpURLConnection)); + } + + @Test + void givenMockedUrl_whenRequestSent_thenIsUrlAvailableTrue() throws Exception { + mockHttpURLConnection.setResponseCode(HttpURLConnection.HTTP_OK); + URL url = new URL("https://www.baeldung.com/"); + + UrlFetcher fetcher = new UrlFetcher(url); + assertTrue(fetcher.isUrlAvailable(), "Url should be available: "); + } + + @Test + void givenMockedUrl_whenRequestSent_thenIsUrlAvailableFalse() throws Exception { + mockHttpURLConnection.setResponseCode(HttpURLConnection.HTTP_FORBIDDEN); + URL url = new URL("https://www.baeldung.com/"); + + UrlFetcher fetcher = new UrlFetcher(url); + assertFalse(fetcher.isUrlAvailable(), "Url should NOT be available: "); + } + +} From a0380bab527babbc6d3e2b3d88594bfeebdf340d Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 7 Jun 2023 12:20:38 +0530 Subject: [PATCH 112/162] JAVA-21776 Renamed module names --- .../gradle-customization/{protobuf => gradle-protobuf}/README.md | 0 .../{protobuf => gradle-protobuf}/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradle-customization/{protobuf => gradle-protobuf}/gradlew | 0 .../{protobuf => gradle-protobuf}/gradlew.bat | 0 .../gradle-customization/gradle-protobuf/settings.gradle | 1 + .../src/main/resources/application.properties | 0 .../src/sample_protofiles/user_message.proto | 0 .../com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java | 0 gradle-modules/gradle-customization/protobuf/settings.gradle | 1 - .../Deployment/Deployment.yaml | 0 .../Deployment/PersitantVoulumeClaim.yaml | 0 .../Deployment/Service.yaml | 0 .../StatefulSets/PersistantVolumeClaim.yaml | 0 .../StatefulSets/Service.yaml | 0 .../StatefulSets/StatefulSet.yaml | 0 linux-bash-modules/{json => linux-bash-json}/README.md | 0 .../{json => linux-bash-json}/src/main/bash/fruit.json | 0 .../{json => linux-bash-json}/src/main/bash/fruits.json | 0 linux-bash-modules/{json => linux-bash-json}/src/main/bash/jq.sh | 0 .../{json => linux-bash-json}/src/main/bash/wikipedia.json | 0 linux-bash-modules/{loops => linux-bash-loops}/README.md | 0 .../src/main/bash/find_directories.sh | 0 .../src/main/bash/loop_directories.sh | 0 linux-bash-modules/{read => linux-bash-read}/README.md | 0 .../{read => linux-bash-read}/src/main/bash/file.csv | 0 .../{read => linux-bash-read}/src/main/bash/read_inputs.sh | 0 linux-bash-modules/{text => linux-bash-text}/README.md | 0 .../src/main/bash/append_multiple_lines.sh | 0 .../{text => linux-bash-text}/src/main/bash/remove_characters.sh | 0 30 files changed, 1 insertion(+), 1 deletion(-) rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/README.md (100%) rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/build.gradle (100%) rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/gradle/wrapper/gradle-wrapper.properties (100%) rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/gradlew (100%) rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/gradlew.bat (100%) create mode 100644 gradle-modules/gradle-customization/gradle-protobuf/settings.gradle rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/src/main/resources/application.properties (100%) rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/src/sample_protofiles/user_message.proto (100%) rename gradle-modules/gradle-customization/{protobuf => gradle-protobuf}/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java (100%) delete mode 100644 gradle-modules/gradle-customization/protobuf/settings.gradle rename kubernetes-modules/{Deployment_Vs_StatefulSet => deployment-and-statefulset-configs}/Deployment/Deployment.yaml (100%) rename kubernetes-modules/{Deployment_Vs_StatefulSet => deployment-and-statefulset-configs}/Deployment/PersitantVoulumeClaim.yaml (100%) rename kubernetes-modules/{Deployment_Vs_StatefulSet => deployment-and-statefulset-configs}/Deployment/Service.yaml (100%) rename kubernetes-modules/{Deployment_Vs_StatefulSet => deployment-and-statefulset-configs}/StatefulSets/PersistantVolumeClaim.yaml (100%) rename kubernetes-modules/{Deployment_Vs_StatefulSet => deployment-and-statefulset-configs}/StatefulSets/Service.yaml (100%) rename kubernetes-modules/{Deployment_Vs_StatefulSet => deployment-and-statefulset-configs}/StatefulSets/StatefulSet.yaml (100%) rename linux-bash-modules/{json => linux-bash-json}/README.md (100%) rename linux-bash-modules/{json => linux-bash-json}/src/main/bash/fruit.json (100%) rename linux-bash-modules/{json => linux-bash-json}/src/main/bash/fruits.json (100%) rename linux-bash-modules/{json => linux-bash-json}/src/main/bash/jq.sh (100%) rename linux-bash-modules/{json => linux-bash-json}/src/main/bash/wikipedia.json (100%) rename linux-bash-modules/{loops => linux-bash-loops}/README.md (100%) rename linux-bash-modules/{loops => linux-bash-loops}/src/main/bash/find_directories.sh (100%) rename linux-bash-modules/{loops => linux-bash-loops}/src/main/bash/loop_directories.sh (100%) rename linux-bash-modules/{read => linux-bash-read}/README.md (100%) rename linux-bash-modules/{read => linux-bash-read}/src/main/bash/file.csv (100%) rename linux-bash-modules/{read => linux-bash-read}/src/main/bash/read_inputs.sh (100%) rename linux-bash-modules/{text => linux-bash-text}/README.md (100%) rename linux-bash-modules/{text => linux-bash-text}/src/main/bash/append_multiple_lines.sh (100%) rename linux-bash-modules/{text => linux-bash-text}/src/main/bash/remove_characters.sh (100%) diff --git a/gradle-modules/gradle-customization/protobuf/README.md b/gradle-modules/gradle-customization/gradle-protobuf/README.md similarity index 100% rename from gradle-modules/gradle-customization/protobuf/README.md rename to gradle-modules/gradle-customization/gradle-protobuf/README.md diff --git a/gradle-modules/gradle-customization/protobuf/build.gradle b/gradle-modules/gradle-customization/gradle-protobuf/build.gradle similarity index 100% rename from gradle-modules/gradle-customization/protobuf/build.gradle rename to gradle-modules/gradle-customization/gradle-protobuf/build.gradle diff --git a/gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties b/gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from gradle-modules/gradle-customization/protobuf/gradle/wrapper/gradle-wrapper.properties rename to gradle-modules/gradle-customization/gradle-protobuf/gradle/wrapper/gradle-wrapper.properties diff --git a/gradle-modules/gradle-customization/protobuf/gradlew b/gradle-modules/gradle-customization/gradle-protobuf/gradlew similarity index 100% rename from gradle-modules/gradle-customization/protobuf/gradlew rename to gradle-modules/gradle-customization/gradle-protobuf/gradlew diff --git a/gradle-modules/gradle-customization/protobuf/gradlew.bat b/gradle-modules/gradle-customization/gradle-protobuf/gradlew.bat similarity index 100% rename from gradle-modules/gradle-customization/protobuf/gradlew.bat rename to gradle-modules/gradle-customization/gradle-protobuf/gradlew.bat diff --git a/gradle-modules/gradle-customization/gradle-protobuf/settings.gradle b/gradle-modules/gradle-customization/gradle-protobuf/settings.gradle new file mode 100644 index 0000000000..8f8b559eb6 --- /dev/null +++ b/gradle-modules/gradle-customization/gradle-protobuf/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'gradle-protobuf' diff --git a/gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties b/gradle-modules/gradle-customization/gradle-protobuf/src/main/resources/application.properties similarity index 100% rename from gradle-modules/gradle-customization/protobuf/src/main/resources/application.properties rename to gradle-modules/gradle-customization/gradle-protobuf/src/main/resources/application.properties diff --git a/gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto b/gradle-modules/gradle-customization/gradle-protobuf/src/sample_protofiles/user_message.proto similarity index 100% rename from gradle-modules/gradle-customization/protobuf/src/sample_protofiles/user_message.proto rename to gradle-modules/gradle-customization/gradle-protobuf/src/sample_protofiles/user_message.proto diff --git a/gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java b/gradle-modules/gradle-customization/gradle-protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java similarity index 100% rename from gradle-modules/gradle-customization/protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java rename to gradle-modules/gradle-customization/gradle-protobuf/src/test/java/com/baeldung/protobuf/ProtobufCodeGenerationUnitTest.java diff --git a/gradle-modules/gradle-customization/protobuf/settings.gradle b/gradle-modules/gradle-customization/protobuf/settings.gradle deleted file mode 100644 index 63483bae11..0000000000 --- a/gradle-modules/gradle-customization/protobuf/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'protobuf' diff --git a/kubernetes-modules/Deployment_Vs_StatefulSet/Deployment/Deployment.yaml b/kubernetes-modules/deployment-and-statefulset-configs/Deployment/Deployment.yaml similarity index 100% rename from kubernetes-modules/Deployment_Vs_StatefulSet/Deployment/Deployment.yaml rename to kubernetes-modules/deployment-and-statefulset-configs/Deployment/Deployment.yaml diff --git a/kubernetes-modules/Deployment_Vs_StatefulSet/Deployment/PersitantVoulumeClaim.yaml b/kubernetes-modules/deployment-and-statefulset-configs/Deployment/PersitantVoulumeClaim.yaml similarity index 100% rename from kubernetes-modules/Deployment_Vs_StatefulSet/Deployment/PersitantVoulumeClaim.yaml rename to kubernetes-modules/deployment-and-statefulset-configs/Deployment/PersitantVoulumeClaim.yaml diff --git a/kubernetes-modules/Deployment_Vs_StatefulSet/Deployment/Service.yaml b/kubernetes-modules/deployment-and-statefulset-configs/Deployment/Service.yaml similarity index 100% rename from kubernetes-modules/Deployment_Vs_StatefulSet/Deployment/Service.yaml rename to kubernetes-modules/deployment-and-statefulset-configs/Deployment/Service.yaml diff --git a/kubernetes-modules/Deployment_Vs_StatefulSet/StatefulSets/PersistantVolumeClaim.yaml b/kubernetes-modules/deployment-and-statefulset-configs/StatefulSets/PersistantVolumeClaim.yaml similarity index 100% rename from kubernetes-modules/Deployment_Vs_StatefulSet/StatefulSets/PersistantVolumeClaim.yaml rename to kubernetes-modules/deployment-and-statefulset-configs/StatefulSets/PersistantVolumeClaim.yaml diff --git a/kubernetes-modules/Deployment_Vs_StatefulSet/StatefulSets/Service.yaml b/kubernetes-modules/deployment-and-statefulset-configs/StatefulSets/Service.yaml similarity index 100% rename from kubernetes-modules/Deployment_Vs_StatefulSet/StatefulSets/Service.yaml rename to kubernetes-modules/deployment-and-statefulset-configs/StatefulSets/Service.yaml diff --git a/kubernetes-modules/Deployment_Vs_StatefulSet/StatefulSets/StatefulSet.yaml b/kubernetes-modules/deployment-and-statefulset-configs/StatefulSets/StatefulSet.yaml similarity index 100% rename from kubernetes-modules/Deployment_Vs_StatefulSet/StatefulSets/StatefulSet.yaml rename to kubernetes-modules/deployment-and-statefulset-configs/StatefulSets/StatefulSet.yaml diff --git a/linux-bash-modules/json/README.md b/linux-bash-modules/linux-bash-json/README.md similarity index 100% rename from linux-bash-modules/json/README.md rename to linux-bash-modules/linux-bash-json/README.md diff --git a/linux-bash-modules/json/src/main/bash/fruit.json b/linux-bash-modules/linux-bash-json/src/main/bash/fruit.json similarity index 100% rename from linux-bash-modules/json/src/main/bash/fruit.json rename to linux-bash-modules/linux-bash-json/src/main/bash/fruit.json diff --git a/linux-bash-modules/json/src/main/bash/fruits.json b/linux-bash-modules/linux-bash-json/src/main/bash/fruits.json similarity index 100% rename from linux-bash-modules/json/src/main/bash/fruits.json rename to linux-bash-modules/linux-bash-json/src/main/bash/fruits.json diff --git a/linux-bash-modules/json/src/main/bash/jq.sh b/linux-bash-modules/linux-bash-json/src/main/bash/jq.sh similarity index 100% rename from linux-bash-modules/json/src/main/bash/jq.sh rename to linux-bash-modules/linux-bash-json/src/main/bash/jq.sh diff --git a/linux-bash-modules/json/src/main/bash/wikipedia.json b/linux-bash-modules/linux-bash-json/src/main/bash/wikipedia.json similarity index 100% rename from linux-bash-modules/json/src/main/bash/wikipedia.json rename to linux-bash-modules/linux-bash-json/src/main/bash/wikipedia.json diff --git a/linux-bash-modules/loops/README.md b/linux-bash-modules/linux-bash-loops/README.md similarity index 100% rename from linux-bash-modules/loops/README.md rename to linux-bash-modules/linux-bash-loops/README.md diff --git a/linux-bash-modules/loops/src/main/bash/find_directories.sh b/linux-bash-modules/linux-bash-loops/src/main/bash/find_directories.sh similarity index 100% rename from linux-bash-modules/loops/src/main/bash/find_directories.sh rename to linux-bash-modules/linux-bash-loops/src/main/bash/find_directories.sh diff --git a/linux-bash-modules/loops/src/main/bash/loop_directories.sh b/linux-bash-modules/linux-bash-loops/src/main/bash/loop_directories.sh similarity index 100% rename from linux-bash-modules/loops/src/main/bash/loop_directories.sh rename to linux-bash-modules/linux-bash-loops/src/main/bash/loop_directories.sh diff --git a/linux-bash-modules/read/README.md b/linux-bash-modules/linux-bash-read/README.md similarity index 100% rename from linux-bash-modules/read/README.md rename to linux-bash-modules/linux-bash-read/README.md diff --git a/linux-bash-modules/read/src/main/bash/file.csv b/linux-bash-modules/linux-bash-read/src/main/bash/file.csv similarity index 100% rename from linux-bash-modules/read/src/main/bash/file.csv rename to linux-bash-modules/linux-bash-read/src/main/bash/file.csv diff --git a/linux-bash-modules/read/src/main/bash/read_inputs.sh b/linux-bash-modules/linux-bash-read/src/main/bash/read_inputs.sh similarity index 100% rename from linux-bash-modules/read/src/main/bash/read_inputs.sh rename to linux-bash-modules/linux-bash-read/src/main/bash/read_inputs.sh diff --git a/linux-bash-modules/text/README.md b/linux-bash-modules/linux-bash-text/README.md similarity index 100% rename from linux-bash-modules/text/README.md rename to linux-bash-modules/linux-bash-text/README.md diff --git a/linux-bash-modules/text/src/main/bash/append_multiple_lines.sh b/linux-bash-modules/linux-bash-text/src/main/bash/append_multiple_lines.sh similarity index 100% rename from linux-bash-modules/text/src/main/bash/append_multiple_lines.sh rename to linux-bash-modules/linux-bash-text/src/main/bash/append_multiple_lines.sh diff --git a/linux-bash-modules/text/src/main/bash/remove_characters.sh b/linux-bash-modules/linux-bash-text/src/main/bash/remove_characters.sh similarity index 100% rename from linux-bash-modules/text/src/main/bash/remove_characters.sh rename to linux-bash-modules/linux-bash-text/src/main/bash/remove_characters.sh From 80e0f8b2e6760da4423bec12e61570898a1f4c0c Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Wed, 7 Jun 2023 12:20:25 -0300 Subject: [PATCH 113/162] check instanceof Movie --- .../baeldung/equalshashcoderecords/Movie.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java b/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java index e94638e8b5..9ee0f1ac95 100644 --- a/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java +++ b/core-java-modules/core-java-records/src/main/java/com/baeldung/equalshashcoderecords/Movie.java @@ -4,20 +4,24 @@ import java.util.Objects; record Movie(String name, Integer yearOfRelease, String distributor) { -@Override -public boolean equals(Object other) { - if (this == other) { - return true; - } - if (other == null) { + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (other == null) { + return false; + } + if (!(other instanceof Movie)) { + return false; + } + + Movie movie = (Movie) other; + if (movie.name.equals(this.name) && movie.yearOfRelease.equals(this.yearOfRelease)) { + return true; + } return false; } - Movie movie = (Movie) other; - if (movie.name.equals(this.name) && movie.yearOfRelease.equals(this.yearOfRelease)) { - return true; - } - return false; -} @Override public int hashCode() { From c697704d9d7c544f51c83caccc76713c24cace7d Mon Sep 17 00:00:00 2001 From: Ulisses Lima Date: Wed, 7 Jun 2023 12:34:50 -0300 Subject: [PATCH 114/162] removing unrelated code --- libraries-apache-commons-2/README.md | 7 --- libraries-apache-commons-2/log4j.properties | 1 - libraries-apache-commons-2/pom.xml | 39 ------------- .../baeldung/commons/untar/TarExtractor.java | 39 ------------- .../commons/untar/impl/TarExtractorAnt.java | 37 ------------- .../impl/TarExtractorCommonsCompress.java | 38 ------------- .../commons/untar/impl/TarExtractorVfs.java | 52 ------------------ .../src/main/resources/logback.xml | 13 ----- .../com/baeldung/commons/untar/Resources.java | 14 ----- .../untar/TarExtractorAntUnitTest.java | 37 ------------- .../TarExtractorCommonsCompressUnitTest.java | 37 ------------- .../untar/TarExtractorVfsUnitTest.java | 37 ------------- .../src/test/resources/untar/test.tar | Bin 5632 -> 0 bytes .../src/test/resources/untar/test.tar.gz | Bin 211 -> 0 bytes libraries-apache-commons/README.md | 3 +- pom.xml | 2 - 16 files changed, 1 insertion(+), 355 deletions(-) delete mode 100644 libraries-apache-commons-2/README.md delete mode 100644 libraries-apache-commons-2/log4j.properties delete mode 100644 libraries-apache-commons-2/pom.xml delete mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java delete mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java delete mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java delete mode 100644 libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java delete mode 100644 libraries-apache-commons-2/src/main/resources/logback.xml delete mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java delete mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java delete mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java delete mode 100644 libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java delete mode 100644 libraries-apache-commons-2/src/test/resources/untar/test.tar delete mode 100644 libraries-apache-commons-2/src/test/resources/untar/test.tar.gz diff --git a/libraries-apache-commons-2/README.md b/libraries-apache-commons-2/README.md deleted file mode 100644 index 7f91a737d5..0000000000 --- a/libraries-apache-commons-2/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## Apache Commons - -This module contains articles about Apache Commons libraries. - -### Relevant articles - -- More articles: [[<--prev]](../libraries-apache-commons) \ No newline at end of file diff --git a/libraries-apache-commons-2/log4j.properties b/libraries-apache-commons-2/log4j.properties deleted file mode 100644 index 2173c5d96f..0000000000 --- a/libraries-apache-commons-2/log4j.properties +++ /dev/null @@ -1 +0,0 @@ -log4j.rootLogger=INFO, stdout diff --git a/libraries-apache-commons-2/pom.xml b/libraries-apache-commons-2/pom.xml deleted file mode 100644 index c8392ac561..0000000000 --- a/libraries-apache-commons-2/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - 4.0.0 - libraries-apache-commons-2 - libraries-apache-commons-2 - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.apache.commons - commons-compress - ${commons-compress.version} - - - org.apache.ant - ant - ${ant.version} - - - org.apache.commons - commons-vfs2 - ${commons-vfs2.version} - - - - - 1.23.0 - 1.10.13 - 2.9.0 - - - diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java deleted file mode 100644 index bd19a872f6..0000000000 --- a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/TarExtractor.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.commons.untar; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; - -public abstract class TarExtractor { - - private InputStream tarStream; - private boolean gzip; - private Path destination; - - public TarExtractor(InputStream in, boolean gzip, Path destination) throws IOException { - this.tarStream = in; - this.gzip = gzip; - this.destination = destination; - - Files.createDirectories(destination); - } - - public TarExtractor(Path tarFile, Path destination) throws IOException { - this(Files.newInputStream(tarFile), tarFile.endsWith("gz"), destination); - } - - public Path getDestination() { - return destination; - } - - public InputStream getTarStream() { - return tarStream; - } - - public boolean isGzip() { - return gzip; - } - - abstract public void untar() throws IOException; -} diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java deleted file mode 100644 index 5bb4d74beb..0000000000 --- a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorAnt.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.commons.untar.impl; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.zip.GZIPInputStream; - -import org.apache.tools.tar.TarEntry; -import org.apache.tools.tar.TarInputStream; - -import com.baeldung.commons.untar.TarExtractor; - -public class TarExtractorAnt extends TarExtractor { - - public TarExtractorAnt(InputStream in, boolean gzip, Path destination) throws IOException { - super(in, gzip, destination); - } - - @Override - public void untar() throws IOException { - try (TarInputStream tar = new TarInputStream(new BufferedInputStream( // - isGzip() ? new GZIPInputStream(getTarStream()) : getTarStream()))) { - TarEntry entry; - while ((entry = tar.getNextEntry()) != null) { - Path extractTo = getDestination().resolve(entry.getName()); - if (entry.isDirectory()) { - Files.createDirectories(extractTo); - } else { - Files.copy(tar, extractTo, StandardCopyOption.REPLACE_EXISTING); - } - } - } - } -} \ No newline at end of file diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java deleted file mode 100644 index 0f6d557f61..0000000000 --- a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorCommonsCompress.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.commons.untar.impl; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; - -import org.apache.commons.compress.archivers.ArchiveEntry; -import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; - -import com.baeldung.commons.untar.TarExtractor; - -public class TarExtractorCommonsCompress extends TarExtractor { - - public TarExtractorCommonsCompress(InputStream in, boolean gzip, Path destination) throws IOException { - super(in, gzip, destination); - } - - @Override - public void untar() throws IOException { - try (BufferedInputStream inputStream = new BufferedInputStream(getTarStream()); // - TarArchiveInputStream tar = new TarArchiveInputStream( // - isGzip() ? new GzipCompressorInputStream(inputStream) : inputStream)) { - ArchiveEntry entry; - while ((entry = tar.getNextEntry()) != null) { - Path extractTo = getDestination().resolve(entry.getName()); - if (entry.isDirectory()) { - Files.createDirectories(extractTo); - } else { - Files.copy(tar, extractTo, StandardCopyOption.REPLACE_EXISTING); - } - } - } - } -} diff --git a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java b/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java deleted file mode 100644 index 2932b9c3bc..0000000000 --- a/libraries-apache-commons-2/src/main/java/com/baeldung/commons/untar/impl/TarExtractorVfs.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.commons.untar.impl; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.Iterator; - -import org.apache.commons.vfs2.FileContent; -import org.apache.commons.vfs2.FileObject; -import org.apache.commons.vfs2.FileSystemManager; -import org.apache.commons.vfs2.FileType; -import org.apache.commons.vfs2.VFS; - -import com.baeldung.commons.untar.TarExtractor; - -public class TarExtractorVfs extends TarExtractor { - - public TarExtractorVfs(InputStream in, boolean gzip, Path destination) throws IOException { - super(in, gzip, destination); - } - - @Override - public void untar() throws IOException { - Path tmpTar = Files.createTempFile("temp", isGzip() ? ".tar.gz" : ".tar"); - Files.copy(getTarStream(), tmpTar, StandardCopyOption.REPLACE_EXISTING); - - FileSystemManager fsManager = VFS.getManager(); - String uri = String.format("%s:file://%s", isGzip() ? "tgz" : "tar", tmpTar.toString()); - FileObject tar = fsManager.resolveFile(uri); - - Iterator contents = tar.iterator(); - while (contents.hasNext()) { - FileObject entry = contents.next(); - - Path extractTo = Paths.get(getDestination().toString(), entry.getName() - .getPath()); - - if (entry.isReadable() && entry.getType() == FileType.FILE) { - Files.createDirectories(extractTo.getParent()); - - try (FileContent content = entry.getContent(); InputStream stream = content.getInputStream()) { - Files.copy(stream, extractTo, StandardCopyOption.REPLACE_EXISTING); - } - } - } - - Files.delete(tmpTar); - } -} diff --git a/libraries-apache-commons-2/src/main/resources/logback.xml b/libraries-apache-commons-2/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/libraries-apache-commons-2/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java deleted file mode 100644 index 5b9b022d7f..0000000000 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/Resources.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.commons.untar; - -import java.io.InputStream; - -public interface Resources { - - static InputStream tarFile() { - return Resources.class.getResourceAsStream("/untar/test.tar"); - } - - static InputStream tarGzFile() { - return Resources.class.getResourceAsStream("/untar/test.tar.gz"); - } -} diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java deleted file mode 100644 index 80b8fda104..0000000000 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorAntUnitTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.commons.untar; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.junit.Test; - -import com.baeldung.commons.untar.impl.TarExtractorAnt; - -public class TarExtractorAntUnitTest { - - @Test - public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { - Path destination = Paths.get("/tmp/ant"); - - new TarExtractorAnt(Resources.tarFile(), false, destination).untar(); - - assertTrue(Files.list(destination) - .findFirst() - .isPresent()); - } - - @Test - public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { - Path destination = Paths.get("/tmp/ant-gz"); - - new TarExtractorAnt(Resources.tarGzFile(), true, destination).untar(); - - assertTrue(Files.list(destination) - .findFirst() - .isPresent()); - } -} diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java deleted file mode 100644 index bea67ea3f5..0000000000 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorCommonsCompressUnitTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.commons.untar; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.junit.jupiter.api.Test; - -import com.baeldung.commons.untar.impl.TarExtractorCommonsCompress; - -public class TarExtractorCommonsCompressUnitTest { - - @Test - public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { - Path destination = Paths.get("/tmp/commons-compress"); - - new TarExtractorCommonsCompress(Resources.tarFile(), false, destination).untar(); - - assertTrue(Files.list(destination) - .findFirst() - .isPresent()); - } - - @Test - public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { - Path destination = Paths.get("/tmp/commons-compress-gz"); - - new TarExtractorCommonsCompress(Resources.tarGzFile(), true, destination).untar(); - - assertTrue(Files.list(destination) - .findFirst() - .isPresent()); - } -} diff --git a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java b/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java deleted file mode 100644 index 9a00fd7e56..0000000000 --- a/libraries-apache-commons-2/src/test/java/com/baeldung/commons/untar/TarExtractorVfsUnitTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.commons.untar; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.junit.Test; - -import com.baeldung.commons.untar.impl.TarExtractorVfs; - -public class TarExtractorVfsUnitTest { - - @Test - public void givenTarFile_whenUntar_thenExtractedToDestination() throws IOException { - Path destination = Paths.get("/tmp/vfs"); - - new TarExtractorVfs(Resources.tarFile(), false, destination).untar(); - - assertTrue(Files.list(destination) - .findFirst() - .isPresent()); - } - - @Test - public void givenTarGzFile_whenUntar_thenExtractedToDestination() throws IOException { - Path destination = Paths.get("/tmp/vfs-gz"); - - new TarExtractorVfs(Resources.tarGzFile(), true, destination).untar(); - - assertTrue(Files.list(destination) - .findFirst() - .isPresent()); - } -} diff --git a/libraries-apache-commons-2/src/test/resources/untar/test.tar b/libraries-apache-commons-2/src/test/resources/untar/test.tar deleted file mode 100644 index a0c9e8714fc9c02482ceb12119b972e3b7327f81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeHJyAHxI49wiG$QOW}=l3Lt0f~vU5}%Kg3fiSGC9;IGbg*P!F23HS)BK!O-va<4 zIIRFMdf0!d(oWFmoV5lqV$^`v1W+3K!dkm8Wlj%*w%l)}T+89eU-k7O^>X#-!#>Ok zY0A@OVg^d!3}Ya3)4y>||2~TTM=XKpe+0{XXOtzMd!r*ijM49X|D6MxS2n-=_&)^% z@_&e^wC@e9_WyJLukW9+uL;ltf6sr2TmEx3|2ay4^8X*P{)r5L5}-uD5o9x*QT3l# c>EAZ}8!!4Fu`Z(j5iH9LVL%uV2KX`X0$IO(CIA2c diff --git a/libraries-apache-commons-2/src/test/resources/untar/test.tar.gz b/libraries-apache-commons-2/src/test/resources/untar/test.tar.gz deleted file mode 100644 index 99bc3ec9339c01c9214b6f2db104e7868b742c93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmV;^04)C>iwFSng?3~B1MQYg4gw(zMrS>z-~`(8*YkjJVd6@L#N%5qI&O4U%#5LL z(*-1yG>?yPnC{ci769ZyeuWj|;k@&v`;(y}IwFaKfopBLDFARLry z-B_V>|I7R%whe*B_aAYdzb*ei%LyRw{~81i08RjjfKDm?hh6z^s{h)F|7#%r3xXi@ N$pic9;O_ty001@SXGQ=3 diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index 1c2215d8b0..aceea3282a 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -13,5 +13,4 @@ This module contains articles about Apache Commons libraries. - [Apache Commons BeanUtils](https://www.baeldung.com/apache-commons-beanutils) - [Histograms with Apache Commons Frequency](https://www.baeldung.com/apache-commons-frequency) - [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) -- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) -- More articles: [[next-->]](../libraries-apache-commons-2) \ No newline at end of file +- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library) \ No newline at end of file diff --git a/pom.xml b/pom.xml index 16156c0d91..79b2071507 100644 --- a/pom.xml +++ b/pom.xml @@ -872,7 +872,6 @@ libraries-6 libraries-apache-commons - libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io libraries-data-2 @@ -1135,7 +1134,6 @@ libraries-5 libraries-6 libraries-apache-commons - libraries-apache-commons-2 libraries-apache-commons-collections libraries-apache-commons-io libraries-data-2 From 7e6dd2359a7871a15760c0e53457d061f8adeac7 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 21:35:13 +0800 Subject: [PATCH 115/162] Update README.md [skip ci] --- persistence-modules/hibernate-mapping-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate-mapping-2/README.md b/persistence-modules/hibernate-mapping-2/README.md index 36c9f8c304..9994640f1a 100644 --- a/persistence-modules/hibernate-mapping-2/README.md +++ b/persistence-modules/hibernate-mapping-2/README.md @@ -7,3 +7,4 @@ This module contains articles about Hibernate Mappings. - [Hibernate Many to Many Annotation Tutorial](https://www.baeldung.com/hibernate-many-to-many) - [Boolean Converters in Hibernate 6](https://www.baeldung.com/java-hibernate-6-boolean-converters) - [Generate UUIDs as Primary Keys With Hibernate](https://www.baeldung.com/java-hibernate-uuid-primary-key) +- [Understanding JPA/Hibernate Associations](https://www.baeldung.com/jpa-hibernate-associations) From 4cf8629b0d2e59ff6c4a6c4d917af2785a53f489 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 21:42:19 +0800 Subject: [PATCH 116/162] Update README.md [skip ci] --- apache-poi-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-poi-2/README.md b/apache-poi-2/README.md index e2b5160109..0132147201 100644 --- a/apache-poi-2/README.md +++ b/apache-poi-2/README.md @@ -12,4 +12,5 @@ This module contains articles about Apache POI. - [Finding the Last Row in an Excel Spreadsheet From Java](https://www.baeldung.com/java-excel-find-last-row) - [Setting Formulas in Excel with Apache POI](https://www.baeldung.com/java-apache-poi-set-formulas) - [Set the Date Format Using Apache POI](https://www.baeldung.com/java-apache-poi-date-format) +- [Replacing Variables in a Document Template with Java](https://www.baeldung.com/java-replace-pattern-word-document-doc-docx) - More articles: [[<-- prev]](../apache-poi) From 0ce665956e911d481c0cad5e83e2a5a5a0798fdf Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 21:45:22 +0800 Subject: [PATCH 117/162] Update README.md [skip ci] --- testing-modules/gatling-java/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/gatling-java/README.md b/testing-modules/gatling-java/README.md index 4bc07b1910..02c271cd07 100644 --- a/testing-modules/gatling-java/README.md +++ b/testing-modules/gatling-java/README.md @@ -1,6 +1,6 @@ ### Relevant Articles: - [Load Testing Rest Endpoint Using Gatling](https://www.baeldung.com/gatling-load-testing-rest-endpoint) - +- [How to Display a Full HTTP Response Body With Gatling](https://www.baeldung.com/java-gatling-show-response-body) ### Running a simualtion From a31023faa93075549b80bcc9aa8691e5fef4a7a7 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 22:58:45 +0800 Subject: [PATCH 118/162] Update README.md [skip ci] --- testing-modules/mocks-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing-modules/mocks-2/README.md b/testing-modules/mocks-2/README.md index 5746da09bb..52486eb50b 100644 --- a/testing-modules/mocks-2/README.md +++ b/testing-modules/mocks-2/README.md @@ -1,4 +1,4 @@ ## Relevant articles: - [Introduction to Datafaker](https://www.baeldung.com/java-datafaker) - +- [Mocking Private Fields With Mockito](https://www.baeldung.com/java-mockito-private-fields) From a428334e819b65953701d89d4f290aa1a1e86a96 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:03:13 +0800 Subject: [PATCH 119/162] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-6/README.md b/core-java-modules/core-java-collections-maps-6/README.md index 5b45752e74..9575a02c73 100644 --- a/core-java-modules/core-java-collections-maps-6/README.md +++ b/core-java-modules/core-java-collections-maps-6/README.md @@ -1,3 +1,4 @@ ## Relevant Articles - [Copying All Keys and Values From One Hashmap Onto Another Without Replacing Existing Keys and Values](https://www.baeldung.com/java-copy-hashmap-no-changes) - [Convert Hashmap to JSON Object in Java](https://www.baeldung.com/java-convert-hashmap-to-json-object) +- [Converting Map to Map in Java](https://www.baeldung.com/java-converting-map-string-object-to-string-string) From 33ed21921a60161fc77f6c19d3cab714cf4d346f Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:09:26 +0800 Subject: [PATCH 120/162] Update README.md [skip ci] --- core-java-modules/core-java-concurrency-basic-3/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-concurrency-basic-3/README.md b/core-java-modules/core-java-concurrency-basic-3/README.md index da148599b0..619a68cdef 100644 --- a/core-java-modules/core-java-concurrency-basic-3/README.md +++ b/core-java-modules/core-java-concurrency-basic-3/README.md @@ -7,4 +7,5 @@ This module contains articles about basic Java concurrency. - [How to Handle InterruptedException in Java](https://www.baeldung.com/java-interrupted-exception) - [Thread.sleep() vs Awaitility.await()](https://www.baeldung.com/java-thread-sleep-vs-awaitility-await) - [Is CompletableFuture Non-blocking?](https://www.baeldung.com/java-completablefuture-non-blocking) +- [Returning a Value After Finishing Thread’s Job in Java](https://www.baeldung.com/java-return-value-after-thread-finish) - [[<-- Prev]](../core-java-concurrency-basic-2) From 029216e65b3b46fa2bf4d9229d452eb8f440ffc0 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:12:41 +0800 Subject: [PATCH 121/162] Update README.md [skip ci] --- core-java-modules/core-java-collections-list-5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-list-5/README.md b/core-java-modules/core-java-collections-list-5/README.md index ff40ae3725..947cf234b9 100644 --- a/core-java-modules/core-java-collections-list-5/README.md +++ b/core-java-modules/core-java-collections-list-5/README.md @@ -9,3 +9,4 @@ This module contains articles about the Java List collection - [Check if a List Contains an Element From Another List in Java](https://www.baeldung.com/java-check-elements-between-lists) - [Array vs. List Performance in Java](https://www.baeldung.com/java-array-vs-list-performance) - [Set Default Value for Elements in List](https://www.baeldung.com/java-list-set-default-values) +- [Get Unique Values From an ArrayList In Java](https://www.baeldung.com/java-unique-values-arraylist) From bce3bce1e5d1db785ff4d44307c4ccc429b3b0b9 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:19:21 +0800 Subject: [PATCH 122/162] Update README.md [skip ci] --- spring-di-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-di-4/README.md b/spring-di-4/README.md index d4b0d94385..8e73aff437 100644 --- a/spring-di-4/README.md +++ b/spring-di-4/README.md @@ -6,4 +6,5 @@ This module contains articles about dependency injection with Spring - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) - [Spring @Component Annotation](https://www.baeldung.com/spring-component-annotation) +- [Why Is Field Injection Not Recommended?](https://www.baeldung.com/java-spring-field-injection-cons) - More articles: [[<-- prev]](../spring-di-3) From e75bd1bea505a96f0fa04c9d7357b99e9d21d81e Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:28:40 +0800 Subject: [PATCH 123/162] Create README.md [skip ci] --- messaging-modules/postgres-notify/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 messaging-modules/postgres-notify/README.md diff --git a/messaging-modules/postgres-notify/README.md b/messaging-modules/postgres-notify/README.md new file mode 100644 index 0000000000..32c1f6bf3e --- /dev/null +++ b/messaging-modules/postgres-notify/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Using PostgreSQL as a Message Broker](https://www.baeldung.com/spring-postgresql-message-broker) From 8becf2883dca2d94c57a08921ec0a808d580bb44 Mon Sep 17 00:00:00 2001 From: edizor <113095366+edizor@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:30:21 +0800 Subject: [PATCH 124/162] Update README.md [skip ci] --- core-java-modules/core-java-collections-maps-6/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-collections-maps-6/README.md b/core-java-modules/core-java-collections-maps-6/README.md index 9575a02c73..0b5d69e8f6 100644 --- a/core-java-modules/core-java-collections-maps-6/README.md +++ b/core-java-modules/core-java-collections-maps-6/README.md @@ -2,3 +2,4 @@ - [Copying All Keys and Values From One Hashmap Onto Another Without Replacing Existing Keys and Values](https://www.baeldung.com/java-copy-hashmap-no-changes) - [Convert Hashmap to JSON Object in Java](https://www.baeldung.com/java-convert-hashmap-to-json-object) - [Converting Map to Map in Java](https://www.baeldung.com/java-converting-map-string-object-to-string-string) +- [Converting Object To Map in Java](https://www.baeldung.com/java-convert-object-to-map) From e881e00b1680cdf3f6b99ee8a6cfad2c2d03fcd0 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 8 Jun 2023 19:32:16 +0300 Subject: [PATCH 125/162] remove duplicate code --- .../README.md | 1 - .../pom.xml | 59 ------------------- .../reflection/PrivateConstructorClass.java | 8 --- .../PrivateConstructorUnitTest.java | 17 ------ 4 files changed, 85 deletions(-) delete mode 100644 core-java-modules/core-java-reflection-private-constructor/README.md delete mode 100644 core-java-modules/core-java-reflection-private-constructor/pom.xml delete mode 100644 core-java-modules/core-java-reflection-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java delete mode 100644 core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java diff --git a/core-java-modules/core-java-reflection-private-constructor/README.md b/core-java-modules/core-java-reflection-private-constructor/README.md deleted file mode 100644 index 7d843af9ea..0000000000 --- a/core-java-modules/core-java-reflection-private-constructor/README.md +++ /dev/null @@ -1 +0,0 @@ -### Relevant Articles: diff --git a/core-java-modules/core-java-reflection-private-constructor/pom.xml b/core-java-modules/core-java-reflection-private-constructor/pom.xml deleted file mode 100644 index aee7815e23..0000000000 --- a/core-java-modules/core-java-reflection-private-constructor/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - 4.0.0 - core-java-reflection-private-constructor - core-java-reflection-private-constructor - jar - - - com.baeldung.core-java-modules - core-java-modules - 0.0.1-SNAPSHOT - - - - - org.springframework - spring-test - ${spring.version} - test - - - org.reflections - reflections - ${reflections.version} - - - - - core-java-reflection-private-constructor - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${source.version} - ${target.version} - -parameters - - - - - - - 0.9.12 - 1.8 - 1.8 - 5.3.4 - - - \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java b/core-java-modules/core-java-reflection-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java deleted file mode 100644 index 24e7d435c7..0000000000 --- a/core-java-modules/core-java-reflection-private-constructor/src/main/java/com/baeldung/reflection/PrivateConstructorClass.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.reflection; - -public class PrivateConstructorClass { - - private PrivateConstructorClass() { - System.out.println("Used the private constructor!"); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java b/core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java deleted file mode 100644 index cd1f48d720..0000000000 --- a/core-java-modules/core-java-reflection-private-constructor/src/test/java/com/baeldung/reflection/PrivateConstructorUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.reflection; - -import java.lang.reflect.Constructor; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class PrivateConstructorUnitTest { - - @Test - public void whenConstructorIsPrivate_thenInstanceSuccess() throws Exception { - Constructor pcc = PrivateConstructorClass.class.getDeclaredConstructor(); - pcc.setAccessible(true); - PrivateConstructorClass privateConstructorInstance = pcc.newInstance(); - Assertions.assertTrue(privateConstructorInstance instanceof PrivateConstructorClass); - } -} \ No newline at end of file From 9918d614e643c403391a29f8f8e3d79491979c01 Mon Sep 17 00:00:00 2001 From: sdhiray7 Date: Thu, 8 Jun 2023 22:55:28 +0530 Subject: [PATCH 126/162] BAEL-5621 Combining two byte arrays (#14129) * Initial commit for Object copy in Java * review comments commit for Object copy in Java * Initial commit for parseInt vs valueOf java * Review comments commit for parseInt vs valueOf java * Modify readme * review comments * build failure * build failure retry * build failure retry remove parseInt(java.lang.String,int,int,int) * build failure add comment * change examples * review comments * review comments 2 * review comments 3 * Initial commit for get current stacktrace * Remove old files * Name updates * Jenkins error * changes to file name * Review comments * Create unit test file * Remove unnecessary files * Update package name * BAEL-5321 Initial commit * BAEL-5321 Initial commit 2 * [BAEL-5321] review comments * [BAEL-5321] constructor * [BAEL-5321] inline * BAEL-6396 Initial commit * BAEL-6396 Files reorg --- .../arrayconcat/CombiningByteArrays.java | 49 +++++++++++++ .../CombiningByteArraysUnitTest.java | 73 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arrayconcat/CombiningByteArrays.java create mode 100644 core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayconcat/CombiningByteArraysUnitTest.java diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arrayconcat/CombiningByteArrays.java b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arrayconcat/CombiningByteArrays.java new file mode 100644 index 0000000000..d05cafc677 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/src/main/java/com/baeldung/arrayconcat/CombiningByteArrays.java @@ -0,0 +1,49 @@ +package com.baeldung.arrayconcat; + +import com.google.common.primitives.Bytes; +import org.apache.commons.lang3.ArrayUtils; + +import java.nio.ByteBuffer; + +public class CombiningByteArrays { + + public byte[] combineArraysUsingArrayCopy(byte[] first, byte[] second) { + byte[] combined = new byte[first.length + second.length]; + + System.arraycopy(first, 0, combined, 0, first.length); + System.arraycopy(second, 0, combined, first.length, second.length); + return combined; + } + + public byte[] combineArraysUsingByteBuffer(byte[] first, byte[] second, byte[] third) { + byte[] combined = new byte[first.length + second.length + third.length]; + + ByteBuffer buffer = ByteBuffer.wrap(combined); + buffer.put(first); + buffer.put(second); + buffer.put(third); + return buffer.array(); + } + + public byte[] combineArraysUsingCustomMethod(byte[] first, byte[] second) { + byte[] combined = new byte[first.length + second.length]; + + for (int i = 0; i < combined.length; ++i) { + combined[i] = i < first.length ? first[i] : second[i - first.length]; + } + return combined; + } + + public byte[] combineArraysUsingGuava(byte[] first, byte[] second, byte[] third) { + byte[] combined = Bytes.concat(first, second, third); + + return combined; + } + + public byte[] combineArraysUsingApacheCommons(byte[] first, byte[] second) { + byte[] combined = ArrayUtils.addAll(first, second); + + return combined; + } + +} diff --git a/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayconcat/CombiningByteArraysUnitTest.java b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayconcat/CombiningByteArraysUnitTest.java new file mode 100644 index 0000000000..2aa06b7570 --- /dev/null +++ b/core-java-modules/core-java-arrays-operations-advanced/src/test/java/com/baeldung/arrayconcat/CombiningByteArraysUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.arrayconcat; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertArrayEquals; + +public class CombiningByteArraysUnitTest { + + CombiningByteArrays combiningByteArrays; + + @Before + public void init() { + combiningByteArrays = new CombiningByteArrays(); + } + + @Test + public void givenTwoArrays_whenCombinedUsingArraysCopy_thenArrayContainingAllElementsMustBeReturned() { + byte[] first = {69, 121, 101, 45, 62, 118, 114}; + byte[] second = {58, 120, 100, 46, 64, 114, 103, 117}; + + byte[] combined = combiningByteArrays.combineArraysUsingArrayCopy(first, second); + + byte[] expectedArray = {69, 121, 101, 45, 62, 118, 114, 58, 120, 100, 46, 64, 114, 103, 117}; + assertArrayEquals(expectedArray, combined); + } + + @Test + public void givenTwoArrays_whenCombinedUsingByteBuffer_thenArrayContainingAllElementsMustBeReturned() { + byte[] first = {69, 121, 101, 45}; + byte[] second = {64, 114, 103, 117}; + byte[] third = {11, 22, 33}; + + byte[] combined = combiningByteArrays.combineArraysUsingByteBuffer(first, second, third); + + byte[] expectedArray = {69, 121, 101, 45, 64, 114, 103, 117, 11, 22, 33}; + assertArrayEquals(expectedArray, combined); + } + + @Test + public void givenTwoArrays_whenCombinedUsingCustomMethod_thenArrayContainingAllElementsMustBeReturned() { + byte[] first = {101, 45, 62 }; + byte[] second = {58, 120, 100, 46, 64, 114}; + + byte[] combined = combiningByteArrays.combineArraysUsingCustomMethod(first, second); + + byte[] expectedArray = {101, 45, 62, 58, 120, 100, 46, 64, 114}; + assertArrayEquals(expectedArray, combined); + } + + @Test + public void givenTwoArrays_whenCombinedUsingGuava_thenArrayContainingAllElementsMustBeReturned() { + byte[] first = {69, 121, 101, 118, 114}; + byte[] second = {58, 120, 114, 103, 117}; + byte[] third = {11, 22, 33}; + + byte[] combined = combiningByteArrays.combineArraysUsingGuava(first, second, third); + + byte[] expectedArray = {69, 121, 101, 118, 114, 58, 120, 114, 103, 117, 11, 22, 33}; + assertArrayEquals(expectedArray, combined); + } + + @Test + public void givenTwoArrays_whenCombinedUsingApacheCommons_thenArrayContainingAllElementsMustBeReturned() { + byte[] first = {45, 62, 114}; + byte[] second = {58, 120, 100}; + + byte[] combined = combiningByteArrays.combineArraysUsingApacheCommons(first, second); + + byte[] expectedArray = {45, 62, 114, 58, 120, 100}; + assertArrayEquals(expectedArray, combined); + } +} From 5bfb63b2a159e0cb10d251826c948ec1b6a2a2a6 Mon Sep 17 00:00:00 2001 From: Azhwani <13301425+azhwani@users.noreply.github.com> Date: Thu, 8 Jun 2023 21:43:31 +0200 Subject: [PATCH 127/162] BAEL-6545: Update article https://www.baeldung.com/java-read-lines-large-file (#14168) --- .../readlargefile/ReadLargeFileUnitTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/readlargefile/ReadLargeFileUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/readlargefile/ReadLargeFileUnitTest.java index b2923d9c01..772d97d287 100644 --- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/readlargefile/ReadLargeFileUnitTest.java +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/readlargefile/ReadLargeFileUnitTest.java @@ -1,9 +1,16 @@ package com.baeldung.readlargefile; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; +import java.io.FileReader; import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.SeekableByteChannel; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.util.Scanner; +import java.util.stream.Stream; import org.apache.commons.io.FileUtils; import org.apache.commons.io.LineIterator; @@ -93,6 +100,61 @@ public class ReadLargeFileUnitTest { logMemory(); } + @Test + public void givenUsingBufferedReader_whenIteratingAFile_thenCorrect() throws IOException { + String fileName = "src/test/resources/myFile"; + + logMemory(); + try (BufferedReader br = new BufferedReader(new FileReader(fileName))) { + while (br.readLine() != null) { + // do something with each line + } + } + logMemory(); + } + + @Test + public void givenUsingNewBufferedReader_whenIteratingAFile_thenCorrect() throws IOException { + String fileName = "src/test/resources/myFile"; + + logMemory(); + try (BufferedReader br = java.nio.file.Files.newBufferedReader(Paths.get(fileName))) { + while (br.readLine() != null) { + // do something with each line + } + } + logMemory(); + } + + @Test + public void givenUsingSeekableByteChannel_whenIteratingAFile_thenCorrect() throws IOException { + String fileName = "src/test/resources/myFile"; + + logMemory(); + try (SeekableByteChannel ch = java.nio.file.Files.newByteChannel(Paths.get(fileName), StandardOpenOption.READ)) { + ByteBuffer bf = ByteBuffer.allocate(1000); + while (ch.read(bf) > 0) { + bf.flip(); + // System.out.println(new String(bf.array())); + bf.clear(); + } + } + logMemory(); + } + + @Test + public void givenUsingStreamApi_whenIteratingAFile_thenCorrect() throws IOException { + String fileName = "src/test/resources/myFile"; + + logMemory(); + try (Stream lines = java.nio.file.Files.lines(Paths.get(fileName))) { + lines.forEach(line -> { + // do something with each line + }); + } + logMemory(); + } + // utils private final void logMemory() { From 4bff7895a83cb4593d93cf59439d0e7da830a3d1 Mon Sep 17 00:00:00 2001 From: Harry9656 Date: Thu, 8 Jun 2023 21:58:24 +0200 Subject: [PATCH 128/162] JAVA-6503: Image compression in Java (#14081) --- image-compressing/README.md | 1 + image-compressing/pom.xml | 36 ++++++++++++++++++ .../image/compression/ImageCompressor.java | 36 ++++++++++++++++++ .../compression/ThumbnailsCompressor.java | 19 +++++++++ .../compression/ImageCompressorUnitTest.java | 25 ++++++++++++ .../ThumbnailsCompressorUnitTest.java | 24 ++++++++++++ .../src/test/resources/input.jpg | Bin 0 -> 808289 bytes pom.xml | 2 + 8 files changed, 143 insertions(+) create mode 100644 image-compressing/README.md create mode 100644 image-compressing/pom.xml create mode 100644 image-compressing/src/main/java/com/baeldung/image/compression/ImageCompressor.java create mode 100644 image-compressing/src/main/java/com/baeldung/image/compression/ThumbnailsCompressor.java create mode 100644 image-compressing/src/test/java/com/baeldung/image/compression/ImageCompressorUnitTest.java create mode 100644 image-compressing/src/test/java/com/baeldung/image/compression/ThumbnailsCompressorUnitTest.java create mode 100644 image-compressing/src/test/resources/input.jpg diff --git a/image-compressing/README.md b/image-compressing/README.md new file mode 100644 index 0000000000..b2556062b8 --- /dev/null +++ b/image-compressing/README.md @@ -0,0 +1 @@ +This module contains tutorials related to the image compression in Java. \ No newline at end of file diff --git a/image-compressing/pom.xml b/image-compressing/pom.xml new file mode 100644 index 0000000000..99cdd65647 --- /dev/null +++ b/image-compressing/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + image-compressing + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + net.coobird + thumbnailator + ${thumbnailator.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + + + + + 0.4.19 + + + \ No newline at end of file diff --git a/image-compressing/src/main/java/com/baeldung/image/compression/ImageCompressor.java b/image-compressing/src/main/java/com/baeldung/image/compression/ImageCompressor.java new file mode 100644 index 0000000000..13b1b9560c --- /dev/null +++ b/image-compressing/src/main/java/com/baeldung/image/compression/ImageCompressor.java @@ -0,0 +1,36 @@ +package com.baeldung.image.compression; + + +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.ImageOutputStream; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.Iterator; + + +public class ImageCompressor { + + public static void compressImage(String inputPath, String outputPath) throws IOException { + File inputFile = new File(inputPath); + BufferedImage inputImage = ImageIO.read(inputFile); + + Iterator writers = ImageIO.getImageWritersByFormatName("jpg"); + ImageWriter writer = writers.next(); + + File outputFile = new File(outputPath); + ImageOutputStream outputStream = ImageIO.createImageOutputStream(outputFile); + writer.setOutput(outputStream); + + ImageWriteParam params = writer.getDefaultWriteParam(); + params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + params.setCompressionQuality(0.5f); + + writer.write(null, new javax.imageio.IIOImage(inputImage, null, null), params); + + outputStream.close(); + writer.dispose(); + } +} \ No newline at end of file diff --git a/image-compressing/src/main/java/com/baeldung/image/compression/ThumbnailsCompressor.java b/image-compressing/src/main/java/com/baeldung/image/compression/ThumbnailsCompressor.java new file mode 100644 index 0000000000..63e81b5d70 --- /dev/null +++ b/image-compressing/src/main/java/com/baeldung/image/compression/ThumbnailsCompressor.java @@ -0,0 +1,19 @@ +package com.baeldung.image.compression; + + +import net.coobird.thumbnailator.Thumbnails; + +import java.io.File; +import java.io.IOException; + +public class ThumbnailsCompressor { + + public static void compressImage(String inputPath, String outputPath) throws IOException { + File input = new File(inputPath); + File output = new File(outputPath); + Thumbnails.of(input) + .scale(1) + .outputQuality(0.5) + .toFile(output); + } +} \ No newline at end of file diff --git a/image-compressing/src/test/java/com/baeldung/image/compression/ImageCompressorUnitTest.java b/image-compressing/src/test/java/com/baeldung/image/compression/ImageCompressorUnitTest.java new file mode 100644 index 0000000000..374de8a83a --- /dev/null +++ b/image-compressing/src/test/java/com/baeldung/image/compression/ImageCompressorUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.image.compression; + +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertTrue; + + +class ImageCompressorUnitTest { + @Test + void testSecondFileIsSmaller() throws IOException { + String inputImagePath = ImageCompressorUnitTest.class.getClassLoader() + .getResource("input.jpg").getPath(); + File inputImage = new File(inputImagePath); + long inputImageSize = inputImage.length(); + String outputPath = inputImagePath + "compressed.jpg"; + ImageCompressor.compressImage(inputImagePath, outputPath); + File compressedImage = new File(outputPath); + long compressedImageSize = compressedImage.length(); + + assertTrue(compressedImageSize < inputImageSize, "The compressed image is smaller in size"); + } +} \ No newline at end of file diff --git a/image-compressing/src/test/java/com/baeldung/image/compression/ThumbnailsCompressorUnitTest.java b/image-compressing/src/test/java/com/baeldung/image/compression/ThumbnailsCompressorUnitTest.java new file mode 100644 index 0000000000..cb89b56cc7 --- /dev/null +++ b/image-compressing/src/test/java/com/baeldung/image/compression/ThumbnailsCompressorUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.image.compression; + +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class ThumbnailsCompressorUnitTest { + @Test + void testCompressedImageIsSmaller() throws IOException { + String inputImagePath = ThumbnailsCompressor.class.getClassLoader() + .getResource("input.jpg").getPath(); + File inputImage = new File(inputImagePath); + long inputImageSize = inputImage.length(); + String outputPath = inputImagePath + "compressed.jpg"; + ThumbnailsCompressor.compressImage(inputImagePath, outputPath); + File compressedImage = new File(outputPath); + long compressedImageSize = compressedImage.length(); + + assertTrue(compressedImageSize < inputImageSize, "The compressed image is smaller in size"); + } +} \ No newline at end of file diff --git a/image-compressing/src/test/resources/input.jpg b/image-compressing/src/test/resources/input.jpg new file mode 100644 index 0000000000000000000000000000000000000000..985b0898401c8d3cec079493ada923bc3b4e68fc GIT binary patch literal 808289 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