From 3838bab244f6809bd6a3740104e02bfa84db45e5 Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 23 Dec 2023 22:06:16 -0500 Subject: [PATCH] BAEL-7115 implementation (#15101) * implementing BAEL-6833 * implementation for BAEL-7115 * feedback fixes * Moving code folder as per feedback * renaming logic class folder name * adding more methods --------- Co-authored-by: technoddy --- web-modules/javax-servlets-2/pom.xml | 13 +++++++ .../com/baeldung/servlets/AccountServlet.java | 26 ++++++++++++++ .../servlets/clientinfo/AccountLogic.java | 32 +++++++++++++++++ .../clientinfo/ClientInformationUnitTest.java | 35 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java create mode 100644 web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java create mode 100644 web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java diff --git a/web-modules/javax-servlets-2/pom.xml b/web-modules/javax-servlets-2/pom.xml index 9ba12352fd..a6bfc6b473 100644 --- a/web-modules/javax-servlets-2/pom.xml +++ b/web-modules/javax-servlets-2/pom.xml @@ -68,6 +68,17 @@ + + org.mockito + mockito-core + ${mockito.version} + test + + + com.github.ua-parser + uap-java + ${uap.version} + @@ -101,6 +112,8 @@ 2.22.2 10.0.4 1.10.0 + 5.6.0 + 1.5.4 \ No newline at end of file diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java new file mode 100644 index 0000000000..3533bf500b --- /dev/null +++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java @@ -0,0 +1,26 @@ +package com.baeldung.servlets; + +import java.io.IOException; +import java.util.Map; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.servlets.clientinfo.AccountLogic; + +@WebServlet(name = "AccountServlet", urlPatterns = "/account") +public class AccountServlet extends HttpServlet { + public static final Logger log = LoggerFactory.getLogger(AccountServlet.class); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + AccountLogic accountLogic = new AccountLogic(); + Map clientInfo = accountLogic.getClientInfo(request); + log.info("Request client info: {}, " + clientInfo); + + response.setStatus(HttpServletResponse.SC_OK); + } +} diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java new file mode 100644 index 0000000000..00f3a5ca39 --- /dev/null +++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java @@ -0,0 +1,32 @@ +package com.baeldung.servlets.clientinfo; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import ua_parser.Client; +import ua_parser.Parser; + +public class AccountLogic { + public Map getClientInfo(HttpServletRequest request) { + String remoteAddr = request.getRemoteAddr(); + String remoteHost = request.getRemoteHost(); + String remoteUser = request.getRemoteUser(); + String contentType = request.getHeader("content-type"); + String userAgent = request.getHeader("user-agent"); + + Parser uaParser = new Parser(); + Client client = uaParser.parse(userAgent); + + Map clientInfo = new HashMap<>(); + clientInfo.put("os_family", client.os.family); + clientInfo.put("device_family", client.device.family); + clientInfo.put("userAgent_family", client.userAgent.family); + clientInfo.put("remote_address", remoteAddr); + clientInfo.put("remote_host", remoteHost); + clientInfo.put("remote_user", remoteUser); + clientInfo.put("content_type", contentType); + return clientInfo; + } +} diff --git a/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java new file mode 100644 index 0000000000..4ff5256f37 --- /dev/null +++ b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.servlets.clientinfo; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.when; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +public class ClientInformationUnitTest { + + @Test + void givenMockHttpServletRequestWithHeaders_whenGetClientInfo_thenReturnsUserAGentInfo() { + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + + when(request.getHeader("user-agent")).thenReturn("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36, acceptLanguage:en-US,en;q=0.9"); + when(request.getHeader("content-type")).thenReturn("application/json"); + when(request.getRemoteAddr()).thenReturn("198.167.0.1"); + when(request.getRemoteHost()).thenReturn("baeldung.com"); + when(request.getRemoteUser()).thenReturn("baeldung"); + + AccountLogic accountLogic = new AccountLogic(); + Map clientInfo = accountLogic.getClientInfo(request); + assertThat(clientInfo.get("os_family")).isEqualTo("Mac OS X"); + assertThat(clientInfo.get("device_family")).isEqualTo("Mac"); + assertThat(clientInfo.get("userAgent_family")).isEqualTo("Chrome"); + assertThat(clientInfo.get("content_type")).isEqualTo("application/json"); + assertThat(clientInfo.get("remote_user")).isEqualTo("baeldung"); + assertThat(clientInfo.get("remote_address")).isEqualTo("198.167.0.1"); + assertThat(clientInfo.get("remote_host")).isEqualTo("baeldung.com"); + } +} \ No newline at end of file