Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

67 changes: 66 additions & 1 deletion src/main/java/com/example/midterm/ConcreteNameService.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
25 changes: 25 additions & 0 deletions src/main/java/com/example/midterm/EmailController.java
Original file line number Diff line number Diff line change
@@ -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<String, String> request) throws Exception {
String emailInput = request.get("email");
return emailService.validate(emailInput);
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/example/midterm/NameController.java
Original file line number Diff line number Diff line change
@@ -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<String, String> request) throws Exception {
String nameInput = request.get("name");
return nameService.process(nameInput);
}
}
31 changes: 31 additions & 0 deletions src/main/java/dto/Email.java
Original file line number Diff line number Diff line change
@@ -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 + ")";
}
}
34 changes: 28 additions & 6 deletions src/main/java/dto/Name.java
Original file line number Diff line number Diff line change
@@ -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 + ")";
}
}
9 changes: 9 additions & 0 deletions src/main/java/service/EmailService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package service;

import dto.Email;

public interface EmailService {

boolean validate(String email) throws Exception;

}
38 changes: 38 additions & 0 deletions src/main/java/service/EmailServiceImpl.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 2 additions & 0 deletions src/main/java/service/NameService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import dto.Name;




public interface NameService {

Name process(String name) throws Exception;
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/service/NameServiceImpl.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
8 changes: 8 additions & 0 deletions src/main/java/utility/EmailValidator.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
2 changes: 2 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
spring.application.name=midterm
server.port=8081

28 changes: 28 additions & 0 deletions src/main/resources/static/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Name Processor</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="container">
<h1>Name Processor</h1>
<form id="nameForm">
<input type="text" id="nameInput" placeholder="Enter a name" required>
<button type="namesubmit">Process Name</button>
</form>
<div id="result" class="result"></div>
</div>

<div>
<h1>Email Validator</h1>
<form id="emailForm">
<input type="text" id="emailInput" placeholder="Enter an email" required>
<button type="emailsubmit">Validate Email</button>
</div>

<script src="script.js"></script>
</body>
</html>
Loading