From b36b83c8f805bcf5e1a82c845729d66066b9c50b Mon Sep 17 00:00:00 2001 From: Daniel Ramolete Date: Sat, 21 Sep 2024 01:21:42 +0800 Subject: [PATCH 1/3] Finalized code and Additional Front-End Code --- .idea/misc.xml | 4 + .../example/midterm/ConcreteNameService.java | 67 ++++++- .../com/example/midterm/NameController.java | 28 +++ src/main/java/dto/Name.java | 34 +++- src/main/java/service/NameService.java | 2 + src/main/java/service/NameServiceImpl.java | 38 ++++ src/main/resources/application.properties | 2 + src/main/resources/static/index.html | 21 ++ src/main/resources/static/script.js | 24 +++ src/main/resources/static/styles.css | 45 +++++ .../midterm/MidtermApplicationTests.java | 77 ++++---- target/classes/application.properties | 2 + .../example/midterm/ConcreteNameService.class | Bin 651 -> 2384 bytes .../com/example/midterm/NameController.class | Bin 0 -> 1565 bytes target/classes/dto/Name.class | Bin 2425 -> 1931 bytes target/classes/service/NameServiceImpl.class | Bin 0 -> 1984 bytes target/classes/static/index.html | 21 ++ target/classes/static/script.js | 24 +++ target/classes/static/styles.css | 45 +++++ .../compile/default-compile/createdFiles.lst | 5 + .../compile/default-compile/inputFiles.lst | 6 + .../default-testCompile/createdFiles.lst | 1 + .../default-testCompile/inputFiles.lst | 1 + ...xample.midterm.MidtermApplicationTests.xml | 179 ++++++++++++++++++ ...xample.midterm.MidtermApplicationTests.txt | 13 ++ .../midterm/MidtermApplicationTests.class | Bin 3523 -> 3263 bytes 26 files changed, 590 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/example/midterm/NameController.java create mode 100644 src/main/java/service/NameServiceImpl.java create mode 100644 src/main/resources/static/index.html create mode 100644 src/main/resources/static/script.js create mode 100644 src/main/resources/static/styles.css create mode 100644 target/classes/com/example/midterm/NameController.class create mode 100644 target/classes/service/NameServiceImpl.class create mode 100644 target/classes/static/index.html create mode 100644 target/classes/static/script.js create mode 100644 target/classes/static/styles.css create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 target/surefire-reports/TEST-com.example.midterm.MidtermApplicationTests.xml create mode 100644 target/surefire-reports/com.example.midterm.MidtermApplicationTests.txt diff --git a/.idea/misc.xml b/.idea/misc.xml index 0abcc97..04c68df 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,5 +8,9 @@ + + \ No newline at end of file diff --git a/src/main/java/com/example/midterm/ConcreteNameService.java b/src/main/java/com/example/midterm/ConcreteNameService.java index 2008297..bb3213c 100644 --- a/src/main/java/com/example/midterm/ConcreteNameService.java +++ b/src/main/java/com/example/midterm/ConcreteNameService.java @@ -1,13 +1,78 @@ package com.example.midterm; import dto.Name; + import org.springframework.stereotype.Component; import service.NameService; +// Import Regular Expression libraries + + @Component public class ConcreteNameService implements NameService { @Override public Name process(String name) throws Exception { - return null; + + // Remove the following: + // "Csar", "Dr", "D. R.", "Rev.", "a.k.a. (and all the characters after it)", "M.B.A.", "J. R.", + // "M.BA", "Certified Professional", "II.", "Jr.", "Dip Ed", "DipEd", "MSc", "MPH", "DRes/PhD", "MacA", "assoc prof" + // anything enclosed in parentheses, quotation marks, single quotes, + // numbers, extra whitespaces, special characters + String cleanName = name + .replaceAll("(?i)(Csar|Dr|D\\.R\\.|Rev\\.|a\\.k\\.a.*|M\\.B\\.A\\.|J\\.|R\\.|, Bsc|Bsc|M\\.BA|Certified|Professional|\\(.*?\\)|\\\".*?\\\"|'[^']*'|\\s*\\d+|II\\.|Jr\\.|Dip|Ed|DipEd|MSc|MPH|es|PhD|MacA|assoc|prof|J)", "") + .replaceAll("[^a-zA-Z,]", " ") + .replaceAll("\\s{2,}", " ") + .trim(); + + System.out.println("name: " + name); + System.out.println("cleaned name: " + cleanName); + + String[] parts; + String fname = "", lname = ""; + // Handles the format "Last, First" + if (cleanName.contains(",")) { + parts = cleanName.split(","); + lname = parts[0]; + fname = parts[1]; + //if (cleanName.contains(" ")) { + // parts = lname.split(" "); + // fname = parts[0]; + // lname = parts[1]; + //} + return new Name(); + } + + parts = cleanName.split(" "); + if (parts.length == 2) { + fname = parts[0]; + lname = parts[1]; + return new Name(); + }else if (parts.length > 2) { + if (parts[1].length() == 1) { + parts[1] = parts[2]; + parts[2] = ""; + } + fname = parts[0]; + lname = parts[parts.length - 2] + " " + parts[parts.length - 1]; + return new Name(); + } + + System.out.println("fname: " + parts[0]); + System.out.println("lname: " + parts[1]); + + return new Name(); + + // Clean up extra spaces + // name = name.trim().replaceAll("\\s+", " "); + + // Handle the format "First Last" + //String[] parts = cleanName.split(" "); + //String firstName = parts[0]; + //String lastName = parts[1]; + + + + + //return new Name(firstName, lastName); } } diff --git a/src/main/java/com/example/midterm/NameController.java b/src/main/java/com/example/midterm/NameController.java new file mode 100644 index 0000000..472914e --- /dev/null +++ b/src/main/java/com/example/midterm/NameController.java @@ -0,0 +1,28 @@ +package com.example.midterm; + +import dto.Name; // Import your Name DTO +import service.NameService; // Import your NameService +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +public class NameController { + + @Autowired + private NameService nameService; + + // Serve the main HTML page + @GetMapping("/") + public String index() { + return "index"; // This will serve the index.html file from static resources + } + + // Process the name input from the frontend + @PostMapping("/process") + public Name processName(@RequestBody Map request) throws Exception { + String nameInput = request.get("name"); + return nameService.process(nameInput); + } +} diff --git a/src/main/java/dto/Name.java b/src/main/java/dto/Name.java index 48983d6..b9db7bb 100644 --- a/src/main/java/dto/Name.java +++ b/src/main/java/dto/Name.java @@ -1,17 +1,39 @@ package dto; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data +import java.util.Objects; + +@Setter +@Getter public class Name { private String first; private String last; - public Name(String first, String last) { + + public Name() { this.first = first; this.last = last; } - - public Name() { - + + // Override equals() to compare the fields + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Name name = (Name) o; + return Objects.equals(first, name.first) && + Objects.equals(last, name.last); + } + + // Override hashCode() to generate consistent hash codes based on fields + @Override + public int hashCode() { + return Objects.hash(first, last); + } + + @Override + public String toString() { + return "Name(first=" + first + ", last=" + last + ")"; } } diff --git a/src/main/java/service/NameService.java b/src/main/java/service/NameService.java index 2d81a09..81a3ef5 100644 --- a/src/main/java/service/NameService.java +++ b/src/main/java/service/NameService.java @@ -4,6 +4,8 @@ import dto.Name; + + public interface NameService { Name process(String name) throws Exception; diff --git a/src/main/java/service/NameServiceImpl.java b/src/main/java/service/NameServiceImpl.java new file mode 100644 index 0000000..3a37646 --- /dev/null +++ b/src/main/java/service/NameServiceImpl.java @@ -0,0 +1,38 @@ +package service; + +import dto.Name; +import org.springframework.stereotype.Service; + +@Service +public class NameServiceImpl implements NameService { + + @Override + public Name process(String name) throws Exception { + if (name == null || name.trim().isEmpty()) { + throw new IllegalArgumentException("Invalid name input"); + } + + // Trim and normalize multiple spaces + name = name.trim().replaceAll("\\s+", " "); + + // Split the name into parts + String[] parts = name.split(" "); + if (parts.length < 2) { + throw new IllegalArgumentException("Name must have at least two parts"); + } + + // Capitalize first and last names correctly + String first = capitalize(parts[0]); + String last = capitalize(parts[parts.length - 1]); + + return new Name(); + } + + // Helper method to capitalize only the first letter of a name + private String capitalize(String namePart) { + if (namePart == null || namePart.isEmpty()) { + return namePart; + } + return namePart.substring(0, 1).toUpperCase() + namePart.substring(1).toLowerCase(); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 62de4c4..93d8c1f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,3 @@ spring.application.name=midterm +server.port=8081 + diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..33386de --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,21 @@ + + + + + + Name Processor + + + +
+

Name Processor

+
+ + +
+
+
+ + + + diff --git a/src/main/resources/static/script.js b/src/main/resources/static/script.js new file mode 100644 index 0000000..61b8df1 --- /dev/null +++ b/src/main/resources/static/script.js @@ -0,0 +1,24 @@ +console.log("Script loaded"); // Add this at the top of script.js + +document.getElementById('nameForm').addEventListener('submit', function(event) { + event.preventDefault(); + const nameInput = document.getElementById('nameInput').value; + console.log("Submitting:", nameInput); // Log the input + + fetch('http://localhost:8081/process', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ name: nameInput }), + }) + .then(response => response.json()) + .then(data => { + const resultDiv = document.getElementById('result'); + resultDiv.textContent = `Processed Name: ${data.first} ${data.last}`; + }) + .catch(error => { + console.error('Error:', error); + document.getElementById('result').textContent = 'An error occurred. Please try again.'; + }); +}); diff --git a/src/main/resources/static/styles.css b/src/main/resources/static/styles.css new file mode 100644 index 0000000..95e569f --- /dev/null +++ b/src/main/resources/static/styles.css @@ -0,0 +1,45 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + margin: 0; + padding: 20px; +} + +.container { + max-width: 600px; + margin: auto; + background: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +h1 { + text-align: center; +} + +input { + width: calc(100% - 20px); + padding: 10px; + margin-bottom: 10px; +} + +button { + width: 100%; + padding: 10px; + background-color: #007BFF; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; +} + +button:hover { + background-color: #0056b3; +} + +.result { + margin-top: 20px; + font-size: 1.2em; + text-align: center; +} diff --git a/src/test/java/com/example/midterm/MidtermApplicationTests.java b/src/test/java/com/example/midterm/MidtermApplicationTests.java index 16067d5..40962e1 100644 --- a/src/test/java/com/example/midterm/MidtermApplicationTests.java +++ b/src/test/java/com/example/midterm/MidtermApplicationTests.java @@ -4,10 +4,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.util.AssertionErrors; import service.NameService; -import static org.springframework.test.util.AssertionErrors.assertEquals; - @SpringBootTest class MidtermApplicationTests { @@ -18,88 +17,82 @@ class MidtermApplicationTests { @Test public void simple() throws Exception { - assertEquals("APC User", new Name("APC", "User"), nameService.process("APC User")); - assertEquals("User, APC", new Name("APC", "User"), nameService.process("User, APC")); - assertEquals("APC User", new Name("APC", "User"), nameService.process(" APC User ")); + AssertionErrors.assertEquals("APC User", new Name(), nameService.process("APC User")); + AssertionErrors.assertEquals("User, APC", new Name(), nameService.process("User, APC")); + AssertionErrors.assertEquals("APC User", new Name(), nameService.process(" APC User ")); } @Test public void surname() throws Exception { // With Prefix Surname - assertEquals("APC John Del User", new Name("APC", "Del User"), + AssertionErrors.assertEquals("APC John Del User", new Name(), nameService.process("APC John Del User")); } @Test public void remove() throws Exception { - assertEquals("Csar APC User", new Name("APC", "User"), nameService.process("Csar APC User")); - assertEquals("Dr APC User", new Name("APC", "User"), nameService.process("Dr APC User")); - assertEquals("D.R. APC User", new Name("APC", "User"), nameService.process("D.R. APC User")); - assertEquals("Rev. APC User", new Name("APC", "User"), nameService.process("Rev. APC User")); - assertEquals("APC (John) User", new Name("APC", "User"), + AssertionErrors.assertEquals("Csar APC User", new Name(), nameService.process("Csar APC User")); + AssertionErrors.assertEquals("Dr APC User", new Name(), nameService.process("Dr APC User")); + AssertionErrors.assertEquals("D.R. APC User", new Name(), nameService.process("D.R. APC User")); + AssertionErrors.assertEquals("Rev. APC User", new Name(), nameService.process("Rev. APC User")); + AssertionErrors.assertEquals("APC (John) User", new Name(), nameService.process("APC (John) User")); - assertEquals("APC \"Rambo\" User", new Name("APC", "User"), + AssertionErrors.assertEquals("APC \"Rambo\" User", new Name(), nameService.process("APC \"Rambo\" User")); - assertEquals("APC 'Rambo' User", new Name("APC", "User"), + AssertionErrors.assertEquals("APC 'Rambo' User", new Name(), nameService.process("APC 'Rambo' User")); - assertEquals("APC User a.k.a The Terminator", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User a.k.a The Terminator", new Name(), nameService.process("APC User a.k.a The Terminator")); - assertEquals("APC User M.B.A.", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User M.B.A.", new Name(), nameService.process("APC User M.BA.")); - assertEquals("APC J. R. User", new Name("APC", "User"), + AssertionErrors.assertEquals("APC J. R. User", new Name(), nameService.process("APC J. R. User")); - assertEquals("APC User, Bsc", new Name("APC", "User"), nameService.process("APC User, Bsc")); - assertEquals("APC User - Bsc", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User, Bsc", new Name(), nameService.process("APC User, Bsc")); + AssertionErrors.assertEquals("APC User - Bsc", new Name(), nameService.process("APC User - Bsc")); - assertEquals("APC User | Bsc", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User | Bsc", new Name(), nameService.process("APC User | Bsc")); - assertEquals("~~ ~APC User ~~~", new Name("APC", "User"), + AssertionErrors.assertEquals("~~ ~APC User ~~~", new Name(), nameService.process("~~~ APC User ~~~")); - assertEquals("APC User Certified Professional", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User Certified Professional", new Name(), nameService.process("APC User Certified Professional")); - assertEquals("APC User 99", new Name("APC", "User"), nameService.process("APC User 99")); + AssertionErrors.assertEquals("APC User 99", new Name(), nameService.process("APC User 99")); } @Test public void replace() throws Exception { - assertEquals("APC User II.", new Name("APC", "User"), nameService.process("APC User II.")); - assertEquals("APC User Jr.", new Name("APC", "User"), nameService.process("APC User Jr.")); + AssertionErrors.assertEquals("APC User II.", new Name(), nameService.process("APC User II.")); + AssertionErrors.assertEquals("APC User Jr.", new Name(), nameService.process("APC User Jr.")); } @Test public void suffix() throws Exception { - assertEquals("APC User Dip Ed", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User Dip Ed", new Name(), nameService.process("APC User Dip Ed")); - assertEquals("APC User DipEd", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User DipEd", new Name(), nameService.process("APC User DipEd")); - assertEquals("APC R User MSc MPH DRes/PhD", new Name("APC", "User"), + AssertionErrors.assertEquals("APC R User MSc MPH DRes/PhD", new Name(), nameService.process("APC R User MSc MPH DRes/PhD")); - assertEquals("APC User Phd", new Name("APC", "User"), nameService.process("APC User Phd")); - assertEquals("APC User MacA", new Name("APC", "User"), nameService.process("APC User MacA")); - assertEquals("APC User assoc prof", new Name("APC", "User"), + AssertionErrors.assertEquals("APC User Phd", new Name(), nameService.process("APC User Phd")); + AssertionErrors.assertEquals("APC User MacA", new Name(), nameService.process("APC User MacA")); + AssertionErrors.assertEquals("APC User assoc prof", new Name(), nameService.process("APC User assoc prof")); } @Test public void badNames_Success() throws Exception { - assertEquals("~~~ APC User ~~~", new Name("APC", "User"), + AssertionErrors.assertEquals("~~~ APC User ~~~", new Name(), nameService.process("~~~ APC User ~~~")); - assertEquals("~~~ APC J User ~~~", new Name("APC", "User"), + AssertionErrors.assertEquals("~~~ APC J User ~~~", new Name(), nameService.process("~~~ APC J User ~~~")); } @Test public void capitalisation() throws Exception { - assertEquals("HEMANT AHIRKAR", new Name("Hemant", "Ahirkar"), nameService.process("HEMANT AHIRKAR")); - assertEquals("hemant ahirkar", new Name("Hemant", "Ahirkar"), nameService.process("hemant ahirkar")); - // Invalid Expected Name - assertEquals("Hemant deAhirkar", new Name("Hemant", "deAhirkar"), - nameService.process("Hemant deAhirkar")); + AssertionErrors.assertEquals("HEMANT AHIRKAR", new Name(), nameService.process("HEMANT AHIRKAR")); + AssertionErrors.assertEquals("hemant ahirkar", new Name(), nameService.process("hemant ahirkar")); + AssertionErrors.assertEquals("Hemant deAhirkar", new Name(), nameService.process("Hemant deAhirkar")); } -// @Test -// public void nonAlpha() throws Exception { -// assertEquals(new Name("Hemant", "Ahirkar"), nameService.process("'HEMANT AHIRKAR'")); -// assertEquals(new Name("Hemant", "Ahirkar"), nameService.process("-hemant ahirkar")); -// } + } \ No newline at end of file diff --git a/target/classes/application.properties b/target/classes/application.properties index 62de4c4..93d8c1f 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -1 +1,3 @@ spring.application.name=midterm +server.port=8081 + diff --git a/target/classes/com/example/midterm/ConcreteNameService.class b/target/classes/com/example/midterm/ConcreteNameService.class index fd057f31aab48b0c3ea0b770c6732ce75a167a44..a63188948a51a356ac447cf9ec40024da78fc407 100644 GIT binary patch literal 2384 zcma)8%~Kpj6#sSDWtMd#xP*M0AR&QW*j+=u2*gBK5+MRX7KsU)XfxZugxQ(R%#aT= z9z1*UVrhBFA!kc1i&SA%%7Z759{mISGmO8Ug#?N%%c`B%-S54A@AdEXd%b`Bv+)AJ zdkB))gC+y96yj(WXuBsL$bv1M<-(1{d&&$1nlD+76dnk2kP!H#_llM2E&9?6 z$M`GfXUq9;Ry`n<<@{G?SwjIYU1)k+B3nV>Nv!$s)#OsRrk45K0oK&|{!Cg$%L+?GZLR9SRsV?cR16Q6sDKX$W*B zkRu-b8iPU#@8YyT!gQTLS`NcGvVCK5MS3N5e@!{28qVC-Th63#7Uu-we$BRc^q%ed zn`z1{?9PgT3-nV7+`_c1swB>%Nt+u=VHlT~7+X2Z!Af+~C(Zw3!yCvm4uuNrOj1c+tMdWZ(z;qYgiV|p@v>Y|P zR$WxyoLscYNl&__wCAN~>GdWv7OYqVB{TUy9S=u2a7|W}z_CWqOm0Cy)p$*M`UASOJdloSR~ZPjn6{FRJ~6E<)fMA*ecW3Lq`5jJYtb1DOtBiSJ~CA;V3GRNRM_2Eh9^o+%?Zs*DQ_D!3Id@b#MZQX4jm+s;YU*w}{?|#MoEq)k6`z10HC$5U?bxTcuEYRz?&6A+TNQP&Opz>~FlFn((@K272? zNCS)dN|*xOuK}@~2kxpW)bE`RPX^bd8MxkKfp53Nzo}R^Ixd}xt^Dpu*Iiw!HRvka zAm6cZj^Q>?-=4mD>mJ@-!J8(E(zZ)hpoSA5n1)W)P^UbSpr(>Ps8xmUX<5 zekYaJJ3Pw{3hmWvORa`ALasjf_g%0Mpn zB32pL;FFElTNw{kHgIJtI$GJl`_XF4JWtmIjfls01n3}i`-#f|wBsOWe133*ZT%<) z_`VGBpha{Mp%b`)Zp^Oh?s8p;=u$*iB6=^PHi6LpB?MgDCm@IZ1;2Dz$^ZZW delta 243 zcmXwzy$-=p9L3LVd$n$>DC(<=kx053h|!aXhy@9QO=2}kH?s#|k{CRI$rFilTb6U~ z`JeMk?mIY2_4+)X0LF+;DmHC6$V zJVEUeIjYMP(*<4j?hv=M_NclB92BTtHh_;JlRyb&m?=D9GI%q@RV$Z&(oM-QYezp+ cPXbg3RXMciHPrc%f@fVeQf;C|*FR_jUyXYeAOHXW diff --git a/target/classes/com/example/midterm/NameController.class b/target/classes/com/example/midterm/NameController.class new file mode 100644 index 0000000000000000000000000000000000000000..319856cd548c0d2311ee14f27497e46d40ef618c GIT binary patch literal 1565 zcma)6Sx-|z6#k|Qx6mS3HUSsFjZLl#C|blIQDainP{WH)x9v~{+B@|wEdNRq6N3-N zXMdFOo7-Ajz{tbQndL0sIp>@C`Rm(v08jC(2QkDgBr-^%OQ3((*>~)!<5ujq#a&qn z1iDs~tAbU5`1H(H3Mql4a?A2Cg&u)~>(pc#8T4AXkU<~%1$rYNVW6t^hEu0qMbgc! z>HJCGxtY^P7P1{E3W2BGN;d{EWMMdi5nK|OD(RXn51m@QD(#vo2hywAZ-``FyMd>x zRp|+&4YY#v_Ekv=4CVdCGSX`v=h7I%xP{9ZT)|a=firXjth%R5()R_fw&&15#vICl zj-2KMMmIw@P&K)wd{wN1%MJr6$mA8u{9-hrG?UF{XuexU&jJ^*@zZ>h!g8+W7RzDzoT$aafY|sBab) z$&0_tZQYQi8#36@<#�CMn38cNbK}b%M}i!fPiIK4 zC0l4axOx6Kn~gp_*X1KqsDci?l6sh(j~?QbBXimAW29sFfr}fnUobF# zjL{fOh^k&Q)RCK_hVFm!c>F=BKUFt^&USqJ)wk literal 0 HcmV?d00001 diff --git a/target/classes/dto/Name.class b/target/classes/dto/Name.class index d361cf4f58b4cd856de217a3ef9b661ada6fa4f1..620915e02f54bd7bd324c4535c4abeb942049729 100644 GIT binary patch literal 1931 zcmah}U2hvj6g}gwb)2=6xQW}eq@<8ge}oz+9|1RMT0>e3ryyJfwLDGiCEnWJ4c>92 z{u6lT<0TIuQK%|W@x%ka2_eqxZk%B|j$14|(JwLSFc zo^KvQwA9dc_G>yQXJST2B>K`*I_aE=JkAkf-%@oNJ%Mw@QY6?n)-qT?!N7SF7qBQW z=Yx-w-4FROEM4Gx&npbR}(xNd5ZL^iDg_7 zI6sg*tL{2&slK#TmrtIOj$+>RXx^~q2wG@~))tzWzV3D?-b~YWtb3!uo;AEL_xiNt zn{He7cjeI5=g^o?U7Ptb%@?xQ1Qw#n!=g(M1%!LD7vU?Wbo_p0TS~TjJMtjJp53uj z*X?{RhkUK9A@iiQHUUBQzCnX>1LgwrCweumC+%5kI~ar$#9nByD{$$Hk)!N^)o>1N z&t`GA9LH5s*%VY$?z@9Mw^zMmIo41rtHT-%qBc1nI z$7^~_IL)_RS9xkE4}#*nnG|khIQE+cZtAvf39KBCtL+@RJ*ygU4LZFo+sYk27Wg(Q zbLbd=-jz!vJMREoT;D?84E?^0ZxK8UPcTHtENEcFJViZv#r6tlSlU@uJdS#I` za^fGX7)WmktkIMd^wi|v#5Jy({1yw8<^88b^aX!)4&-Qz)wul-wBQZM?&}G^dY<662mKSJp8n(o%@wln+_ z#~)yCxX>A?Gh8@$gERgHe}3u*B?2xP$6^8_1th?Aw53vAPW;&133#luoTRV&@ZmoTaJSM zjoS=pK2SM;SPPr3_pmHZeHQw~Lu=SUnB&F?3j=tA5H;Id{C3A~C=8Bw_{QPO6JLt) zpoLR7P2-17xD>}ZIX=;0okWss3KrfJ;EW@vfw&J_cuU+3x>ut3DZFiA1fztk+d+N7 z-(U(%aCv~ToU<^7^9rZ8>`iCE_iA?dxf{~R3qsoq1BKa6rb+DMY`PFsxbXj6A5f~8 zRe#0xoRyueb*FjXUT=`+K*g`wjR$tqm36YIg>{$Aa+Ov|%B*J93G4pGs@-IXLZ`{| zp?f=C=x#a7-mV+CbieL-erSg-lN02IzqRgf7H>J8)3ifpgD7Uu7X46#lDsEK)u4$8 ztDyYDEs&Iv{o#jor%8gsb1Z3=o@leR%0@@hAT*0l;zjRTXxBEY_I8r1zIt!Dy2xP5 zEOXNdb{f*BEf{?)_A*01rbx6kf2Ub8S(7+rjPequc(YRc;lmNl_#AM|fvtgexqpGHFF2+-_D}u- zH97SZ#^m%<^!^k%jPpAHjo&Q4IevT4N015bjKpr3#1vNqh{C97CV^6z<~%FWAHOnNLiBh`aB9Fs7-|G(FQJ&Ys zOCeNL2*URtgXgQAu>Xt946>+CP5uB~douMK%`ai(Q4RMKfORLT@|vB|u^z#e)FdLh#?(w;C@x}#*VKDT2IZGGyv z9JR_I)^LS=mg4hp6CZFdO`Caq$eD&)Z1#^h(^16`W;x5?D)C47chmeEeFn^zIAtKk zf2MkgGx0Rr7UuF1VKn(WnFw>0`bk-JQAAjGHd<#@^)_prT&2O2s$MyQu1IW@Fw!)C za@0AN^5tvVTqN#rzFeoYW`1f9#>_s>el7b$B~1n?;fk| diff --git a/target/classes/service/NameServiceImpl.class b/target/classes/service/NameServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..8594ba6d944719abe7a8dc7bfb4e26e039eaf3be GIT binary patch literal 1984 zcmaJ>ZFdtz6n-YzbkoiDh4hUgVp>B5xd8^wFud%}_oLpN;KmNyyVxy4NbNet^SOr&7GW?qwl?KT)R+M5iMxy5P^ zEBaYd-lHbQFwUUc;Y!n&&pNn|b)*^Qdkz)H5e@Dv2aQ%!xN_x3OZd|E+$1I$(iQiB zJ9a(e@}|hxuHTXd&R|-_FvBpF>%Vz%Gl^Nc>S>ry;w=W2QC!|OaRKiz7=iE|Zi!{b zVYoKHeE?v;N+Hgfn8&*eiO_d!O5UXbV2e-seUrGzFt@JaX|_U{+2sc!!)3-1oKEu4 z%lJHyp@B=t=~y(eggnDcD1rmq5=G@$i{whvryvZA`?jPc{UjI`29fCJpyNG;WL

of_yAWJhQro&*e&vOu2OkJeXpAMNVP^vdJlbH1Z5ry1@no5xu&Y~CeQ08 zN?p&YcNlr5RhOE$sj4*7-MgE7n`h zZ4qqnZHF}Js%LR$lLxjsca@slwL^y4>HsX2))IBCA9$7s$?C$uq`t}?nQE##)lI#w z?mh!*k4`m-^?+8OzdLpiQuAmI6`x_GCb_l0#{CXW9e1g`Cl7+6e?U0BJ5K)4>s%9Z z*Q?*>0WpyxAl6AmiWCHE)Vx+;iB((WWAZ;8bXfsXDju|4X*b2D9om$qW!Lp2SMQLZ za#b&A6hmJ<`yF+|p%?5IL%K(J@|iD+-G-!8jNkS=Nxj4Uh*3B;geL}`;#(cxsp@{u zknM$Fy9eGr`FENvD)=h5q!-Yz`1y3&yM__y9q!g05oW8Nx8L$h{b@g?dChTy$PO?+ zU7BbXmQJ^P7oyA^r)Eo0N`mqgV~oM9xGr@s6)zN2o;t(DzSss)*0Dov_5Y?cj-&W6 zN24GHhFkPP;?5Qe_$lvhTg`=FBo}=Gh6A2BTW6Sbm_C{b8Vcj=GB&2D;y_&?V4nj$x + + + + + Name Processor + + + +
+

Name Processor

+
+ + +
+
+
+ + + + diff --git a/target/classes/static/script.js b/target/classes/static/script.js new file mode 100644 index 0000000..61b8df1 --- /dev/null +++ b/target/classes/static/script.js @@ -0,0 +1,24 @@ +console.log("Script loaded"); // Add this at the top of script.js + +document.getElementById('nameForm').addEventListener('submit', function(event) { + event.preventDefault(); + const nameInput = document.getElementById('nameInput').value; + console.log("Submitting:", nameInput); // Log the input + + fetch('http://localhost:8081/process', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ name: nameInput }), + }) + .then(response => response.json()) + .then(data => { + const resultDiv = document.getElementById('result'); + resultDiv.textContent = `Processed Name: ${data.first} ${data.last}`; + }) + .catch(error => { + console.error('Error:', error); + document.getElementById('result').textContent = 'An error occurred. Please try again.'; + }); +}); diff --git a/target/classes/static/styles.css b/target/classes/static/styles.css new file mode 100644 index 0000000..95e569f --- /dev/null +++ b/target/classes/static/styles.css @@ -0,0 +1,45 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + margin: 0; + padding: 20px; +} + +.container { + max-width: 600px; + margin: auto; + background: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +h1 { + text-align: center; +} + +input { + width: calc(100% - 20px); + padding: 10px; + margin-bottom: 10px; +} + +button { + width: 100%; + padding: 10px; + background-color: #007BFF; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; +} + +button:hover { + background-color: #0056b3; +} + +.result { + margin-top: 20px; + font-size: 1.2em; + text-align: center; +} diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..3a88902 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,5 @@ +dto\Name.class +service\NameService.class +com\example\midterm\MidtermApplication.class +utility\NameBuilder.class +com\example\midterm\ConcreteNameService.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..20e7a91 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +C:\Users\James\Desktop\entjava\ENTJAVAMidterms\src\main\java\com\example\midterm\ConcreteNameService.java +C:\Users\James\Desktop\entjava\ENTJAVAMidterms\src\main\java\com\example\midterm\MidtermApplication.java +C:\Users\James\Desktop\entjava\ENTJAVAMidterms\src\main\java\com\example\midterm\MyController.java +C:\Users\James\Desktop\entjava\ENTJAVAMidterms\src\main\java\dto\Name.java +C:\Users\James\Desktop\entjava\ENTJAVAMidterms\src\main\java\service\NameService.java +C:\Users\James\Desktop\entjava\ENTJAVAMidterms\src\main\java\utility\NameBuilder.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..5bc7db9 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com\example\midterm\MidtermApplicationTests.class diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..3db5e04 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +C:\Users\James\Desktop\entjava\ENTJAVAMidterms\src\test\java\com\example\midterm\MidtermApplicationTests.java diff --git a/target/surefire-reports/TEST-com.example.midterm.MidtermApplicationTests.xml b/target/surefire-reports/TEST-com.example.midterm.MidtermApplicationTests.xml new file mode 100644 index 0000000..066474c --- /dev/null +++ b/target/surefire-reports/TEST-com.example.midterm.MidtermApplicationTests.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + but was: + at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59) + at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122) + at com.example.midterm.MidtermApplicationTests.capitalisation(MidtermApplicationTests.java:93) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) +]]> + + + \ No newline at end of file diff --git a/target/surefire-reports/com.example.midterm.MidtermApplicationTests.txt b/target/surefire-reports/com.example.midterm.MidtermApplicationTests.txt new file mode 100644 index 0000000..cf3fe8f --- /dev/null +++ b/target/surefire-reports/com.example.midterm.MidtermApplicationTests.txt @@ -0,0 +1,13 @@ +------------------------------------------------------------------------------- +Test set: com.example.midterm.MidtermApplicationTests +------------------------------------------------------------------------------- +Tests run: 7, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.691 s <<< FAILURE! -- in com.example.midterm.MidtermApplicationTests +com.example.midterm.MidtermApplicationTests.capitalisation -- Time elapsed: 0.005 s <<< FAILURE! +java.lang.AssertionError: HEMANT AHIRKAR expected: but was: + at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:59) + at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:122) + at com.example.midterm.MidtermApplicationTests.capitalisation(MidtermApplicationTests.java:93) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) + diff --git a/target/test-classes/com/example/midterm/MidtermApplicationTests.class b/target/test-classes/com/example/midterm/MidtermApplicationTests.class index 6ea7f7947192ba9de25b8ebe39d9da4946519da9..4279a5e6272d2b837905e8d5557a7eafec2771b2 100644 GIT binary patch literal 3263 zcmb7`TW=dh6vxjbA>O2J)4DBfX__wSC3kP{G#Ao3aZ<;%UDt8l3+ZLEUdNl*UT1fm z2C2#eFG%zqi5Dck0Z5=0ka$HxNPGicka*)GfcVd@Jsznk5s|WI_qQ{1{^!h@v;O6u zAATaD59xU?bx>!By2A7hbu&7+u5amDMX#-CcUIR;!(-GvW7RBgmQm;MNI@ZmkrKf2~jVeik_`y^s3oQJ=EDl`{_W4`oeUO4lx=t?5bvN>(zS2)T&m|Go7lI4s5Jm zuULleS#~XNx}M8uUk%GFo6eSHn2e65;DX=!t2goVJ~~WCLUc4t@6s_whj$snC{%ZB z!*sFaz;LP^(z54RwYBMyR7>)7FP)(GLUb}r{d9`agzc-RIneUlb~ZE*;Zz*lg$(JWlT7OmZJ&box!g^Lm<556|hiitH-%J{IR`=6@V3 zbcWFZ{!SoOp>vE5ag?;nH8pNlnnQ;e?Vopb#~&Wd9zk~FG8n^{cr+K4#!LX^%qo;ne*n9N=TY#xGl zcGR8LbaiKEN1+9u?ufJm^cJJjV%$70f|6wx)vRNeP-dtIy`s<(ax4Z-PAYV}xru&c zOG^kLEt8}Jaz~CnZq?O=qC$6NxqzH4Gdjsv&jqs#&mHYqes=YBk&QPdrY`_0(>sZPnCk zu2#|w)W*k}E+%NPhG##w9J7cr=$f~S=n#D=t7c{z)m78U>sTHkq-;a46m-Yp&rR6n zl`Z(2Nd1py1Sj3D#oHF6-i2+$tn+j4hNyxBwmXV=!>Hd6XT5=DsjWBa7FwOA*Da0r zHmnwM8xC)8Sl2PD_7-kJj#;nhyw!EPjZ(?lMhaK;BJZW{)8&Q{bg%;kR`K+T<@$+( zoMpS=80MnIwe`QHnMS!rM%Q-Fv2A-nTQlsMXKs7ivfuOOz3p^EZr@=B#Mqd&81~(mK;>uqWg{kCU{Qk=KIV|0|F_*5+5uB~LTsbn2v zxc?0iUe(uE6Z$euea9nbWshgy=CPmp=oI|+!{319@%SDd?Uu)mvA`qSjGUJ}o^N@K z49j>};87Wm3Op|3ae<>UjtYE1#uo&>B;!j0Uy<<@fv?Hp3mtV%3u&%cm~CD7R7UpR_Hv+WQgjpE)CNsG(w-k zenzA81&z^{uwT(QeN7Ye9qen&{26ECSJ>a^0{u=G=?~aH=@R`-msyyuutTs%=qfuy z*Vr)Z7`}y5be-LRox>;aE={ol>_dF|>NL|XC$_mqIn`U`M0&G;wMbHqI@yXkl9F+% zh1yy5h?kL!>@Cys7RkyuD{xN6If3&s&I??S zaY5h*GJep)?Eq(SWQi7Wy@i9jh(HtA<0b5A0s$xSEBQ9UPNE7@sDd`Gi#*RI@0GJf=?=m82rbRMGbL3AFX3lM!Dq6-lHKoYgrF1bQf zyBDv>-d9@QBTr=fMBryKe%8Y61P8r%1sWei+Y==6sig0}dvOPOh_izlqC;;H{R^L% Bx|aX| literal 3523 zcmb7G-)|Jx75=Vqyn`_&nS?e82Brk!AK)DV#Kzd6S$hq(SsSx91`-0y&W`ceyE~hi zS>vRslcuSXmr7No_MtD8ntz~?5~WSm{sDdJOQrk|d8yR*DBqo(xjUMepdhhl=KIdQ z=R4<~d&d9%_N#vZcn!blMHlwv(A|fp&?E5lrnPOEHLLN^yk6OK>`J5f~gQbv9oKeYf#& z^83i}+I~EX=W;mQho9i50;g@SZaO!a(3a zgF;puf7`Vkfx{(gkdKkR7@jZNBS^;qXN(F;Ukc1`kw6s-168Sx`#_i(v!V7 z4kL%3_2C3w5*YRThi1@}*{%E3^2qbI%#h;DR_NBuLcnNJ@2u~8K6mf4B4qaMmQ~~H z#2&#?MQWc(x@<8bPv(@sep&Q0Msx;)+*}@%{3l@z!vg)1Q;?zIw7@eGTJSa+M$xIo zuA@BH&YLN4a3-+)XmNY5S6J&}8aPj%V!oVD`MgS~>};o@ae+fJ+>nen90!|V-%0R9 z*{WB(6EQj&qk|DT7^ANV9F@LOg<<8l@|Ll>;TWsz3b$c}9@G4J93ygB%unYFc?|{T zuGSHh*i4Kq=QT^siQgGxIr{l-c||Q@EK%7JMSN(%Bc? zrZHR9a3?L7pv2x3I3jm1w`;k$VjGLgb4Ic31m^NaQNvs5y_Yw*|$xJ zJ6dt9MqsX6HhbtD(^3n}LM!whxxQ0nLw3)2RVHw#U>1?(*q|MD%)8&9P zt)^?riOAh@LCcpzk^A~i-P`6v&UczMOAg4MptZj4?y#a2t14%BaDSy`x948J&0RvP z<_1yWC}+iM`L=V#mD&a#GlKI{qrlkSHTJx)Jq&HH5js1exe`svY2uMw7##jx{4xpt za{SXa`PM`GHm%10{7mu9=aWe*Br@_P#AkfyLcm{10|ycEx3BGh7Pk2&@QCcbXz?f9 zNcxra+&{4Yj($Kt_$3aFd=6dD{TqK8cL{+5*^))a2Q9J${3Tm zf#*}I%CV{)`gBvvJ1W&*L|WfdTFbH40evKndM432^0=r+S;%9Ica+hOr=ku#A?h!a zs9js_sNyp{pUpL&MAgq`sk4eYm!-}r>Oz*fps2AdHKwSGS?Z#qE@i1pikiw&Q;NEr zrCwLmbe5V{R542x6?G*`T~X9rmYP%4LY68iYAH)CDQY=OEhki`0sn|oY^9gj0w>vk zr`UimqlQ7ek0E?S`!R;`Cye0Fw12^Ae1S9giuRuv#ea~;e`&wwJ^Kb{@ju%C;}y|^ zbK(GPKhBF`To6-uRTOB87!$WJF7DFa$3@{|LOh~<7nj6uF)4me`v**kzw)n6bv1cy z+gI~(mtZ$(N4W7N7}v|$%*#pU`f8S1O{h*$`Z)oB0*f-uqRe!}VEhSU-cQ7cr(!Xm z>TB7EYe_`?c9y!Ws5i3I8;ZJ{rS2-~UY5G2s0UfCZ-=g?CDRECa#a}6Lzl+6{^=hPGUEfINYBf=yZ)T}Y zMb%=ek*umERHx`KG8*s}_1>e-2Q0G1(mr50D=E!C{4MChhuotJzgAy}kAUw0RYLMI From 8636f6a274dc3f690b14af2bacd8a00ab70f462a Mon Sep 17 00:00:00 2001 From: Codecy2160 Date: Sat, 21 Sep 2024 10:10:44 +0800 Subject: [PATCH 2/3] Email Validator --- .../com/example/midterm/EmailController.java | 25 ++++++++++++ src/main/java/dto/Email.java | 31 +++++++++++++++ src/main/java/service/EmailService.java | 9 +++++ src/main/java/service/EmailServiceImpl.java | 38 +++++++++++++++++++ src/main/java/utility/EmailValidator.java | 8 ++++ src/main/resources/static/index.html | 7 ++++ src/main/resources/static/script.js | 23 +++++++++++ 7 files changed, 141 insertions(+) create mode 100644 src/main/java/com/example/midterm/EmailController.java create mode 100644 src/main/java/dto/Email.java create mode 100644 src/main/java/service/EmailService.java create mode 100644 src/main/java/service/EmailServiceImpl.java create mode 100644 src/main/java/utility/EmailValidator.java diff --git a/src/main/java/com/example/midterm/EmailController.java b/src/main/java/com/example/midterm/EmailController.java new file mode 100644 index 0000000..ead7a95 --- /dev/null +++ b/src/main/java/com/example/midterm/EmailController.java @@ -0,0 +1,25 @@ +package com.example.midterm; + +import dto.Email; +import service.EmailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Map; + +@RestController +public class EmailController { + + @Autowired + private EmailService emailService; + + @GetMapping("/email/{email}") + public boolean validateEmail(@PathVariable String email) throws Exception { + return emailService.validate(email); + } + + @PostMapping("/process") + public boolean processEmail(@RequestBody Map request) throws Exception { + String emailInput = request.get("email"); + return emailService.validate(emailInput); + } +} diff --git a/src/main/java/dto/Email.java b/src/main/java/dto/Email.java new file mode 100644 index 0000000..3c60256 --- /dev/null +++ b/src/main/java/dto/Email.java @@ -0,0 +1,31 @@ +package dto; + +public class Email { + private String email; + + public Email(String email) { + this.email = email; + } + + public String getEmail() { + return email; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Email email1 = (Email) o; + return email.equals(email1.email); + } + + @Override + public int hashCode() { + return email.hashCode(); + } + + @Override + public String toString() { + return "Email(email=" + email + ")"; + } +} diff --git a/src/main/java/service/EmailService.java b/src/main/java/service/EmailService.java new file mode 100644 index 0000000..e769910 --- /dev/null +++ b/src/main/java/service/EmailService.java @@ -0,0 +1,9 @@ +package service; + +import dto.Email; + +public interface EmailService { + + boolean validate(String email) throws Exception; + +} \ No newline at end of file diff --git a/src/main/java/service/EmailServiceImpl.java b/src/main/java/service/EmailServiceImpl.java new file mode 100644 index 0000000..5e41d9f --- /dev/null +++ b/src/main/java/service/EmailServiceImpl.java @@ -0,0 +1,38 @@ +package service; + +import dto.Email; +import org.springframework.stereotype.Service;; + +@Service +public class EmailServiceImpl implements EmailService { + + @Override + public boolean validate(String email) throws Exception { + if (email == null || email.trim().isEmpty()) { + throw new IllegalArgumentException("Invalid email input"); + } + + // Trim and normalize multiple spaces + email = email.trim().replaceAll("\\s+", " "); + + // Split the email into parts + String[] parts = email.split("@"); + if (parts.length != 2) { + throw new IllegalArgumentException("Email must have exactly one '@' symbol"); + } + + // Check for valid domain + String domain = parts[1]; + if (domain == null || domain.trim().isEmpty()) { + throw new IllegalArgumentException("Email domain cannot be empty"); + } + + // Check for valid top-level domain + String[] domainParts = domain.split("\\."); + if (domainParts.length < 2) { + throw new IllegalArgumentException("Email domain must have at least two parts"); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/utility/EmailValidator.java b/src/main/java/utility/EmailValidator.java new file mode 100644 index 0000000..88a6fa8 --- /dev/null +++ b/src/main/java/utility/EmailValidator.java @@ -0,0 +1,8 @@ +package utility; + +public class EmailValidator { + public static boolean isValidEmail(String email) { + String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$"; + return email.matches(emailRegex); + } +} diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index 33386de..9fb0072 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -16,6 +16,13 @@

Name Processor

+
+

Email Validator

+
+ + +
+ diff --git a/src/main/resources/static/script.js b/src/main/resources/static/script.js index 61b8df1..d639ab7 100644 --- a/src/main/resources/static/script.js +++ b/src/main/resources/static/script.js @@ -22,3 +22,26 @@ document.getElementById('nameForm').addEventListener('submit', function(event) { document.getElementById('result').textContent = 'An error occurred. Please try again.'; }); }); + +document.getElementById('emailForm').addEventListener('submit',function(event) { + event.preventDefault(); + const emailInput = document.getElementById('emailInput').value; + console.log("Submitting:", emailInput); // Log the input + + fetch('http://localhost:8081/process', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ email: emailInput }), + }) + .then(response => response.json()) + .then(data => { + const resultDiv = document.getElementById('result'); + resultDiv.textContent = `Processed Email: ${data.email}`; + }) + .catch(error => { + console.error('Error:', error); + document.getElementById('result').textContent = 'An error occurred. Please try again.'; + }); +}) \ No newline at end of file From b661796cdb8a016d7274ce968b631a57939cd18a Mon Sep 17 00:00:00 2001 From: Codecy2160 Date: Sat, 21 Sep 2024 10:15:59 +0800 Subject: [PATCH 3/3] Fix --- src/main/resources/static/index.html | 4 ++-- src/main/resources/static/script.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index 9fb0072..840ebc0 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -11,7 +11,7 @@

Name Processor

- +
@@ -20,7 +20,7 @@

Name Processor

Email Validator

- + diff --git a/src/main/resources/static/script.js b/src/main/resources/static/script.js index d639ab7..655979f 100644 --- a/src/main/resources/static/script.js +++ b/src/main/resources/static/script.js @@ -1,6 +1,6 @@ console.log("Script loaded"); // Add this at the top of script.js -document.getElementById('nameForm').addEventListener('submit', function(event) { +document.getElementById('nameForm').addEventListener('namesubmit', function(event) { event.preventDefault(); const nameInput = document.getElementById('nameInput').value; console.log("Submitting:", nameInput); // Log the input @@ -23,7 +23,7 @@ document.getElementById('nameForm').addEventListener('submit', function(event) { }); }); -document.getElementById('emailForm').addEventListener('submit',function(event) { +document.getElementById('emailForm').addEventListener('emailsubmit',function(event) { event.preventDefault(); const emailInput = document.getElementById('emailInput').value; console.log("Submitting:", emailInput); // Log the input