From 04238c93daff37b4efa1ebe1cd1fa106cd75a8f8 Mon Sep 17 00:00:00 2001 From: Alakh Raghuvanshi Date: Wed, 17 Jul 2019 21:17:08 -0400 Subject: [PATCH] adding controllers and models --- .travis.yml | 3 +- pom.xml | 7 +++ .../api/monitor/API/Monitor/UrlRunnable.java | 53 ++++++++++++++++ .../Monitor/controllers/ApiController.java | 39 ++++++++++++ .../API/Monitor/models/RequestUrl.java | 59 +++++++++++++++++ .../API/Monitor/models/ResponseUrl.java | 63 +++++++++++++++++++ .../api/monitor/API/Monitor/models/Url.java | 46 ++++++++++++++ .../services/UrlMonitoringService.java | 39 ++++++++++++ 8 files changed, 307 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/api/monitor/API/Monitor/UrlRunnable.java create mode 100644 src/main/java/com/api/monitor/API/Monitor/controllers/ApiController.java create mode 100644 src/main/java/com/api/monitor/API/Monitor/models/RequestUrl.java create mode 100644 src/main/java/com/api/monitor/API/Monitor/models/ResponseUrl.java create mode 100644 src/main/java/com/api/monitor/API/Monitor/models/Url.java create mode 100644 src/main/java/com/api/monitor/API/Monitor/services/UrlMonitoringService.java diff --git a/.travis.yml b/.travis.yml index de8759e..2c300a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,5 +5,4 @@ before_install: - mvn clean install: - mvn -Djasypt.encryptor.password=password spring-boot:run -script: - - ./mvnw test -B -Djasypt.encryptor.password=password \ No newline at end of file +scrpt: \ No newline at end of file diff --git a/pom.xml b/pom.xml index f2b46f9..f8915f6 100644 --- a/pom.xml +++ b/pom.xml @@ -31,11 +31,18 @@ spring-boot-starter-data-jpa + + org.springframework.boot + spring-boot-starter-web + + + org.postgresql postgresql runtime + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/com/api/monitor/API/Monitor/UrlRunnable.java b/src/main/java/com/api/monitor/API/Monitor/UrlRunnable.java new file mode 100644 index 0000000..084214f --- /dev/null +++ b/src/main/java/com/api/monitor/API/Monitor/UrlRunnable.java @@ -0,0 +1,53 @@ +package com.api.monitor.API.Monitor; + +import com.api.monitor.API.Monitor.models.Url; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.*; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class UrlRunnable implements Runnable { + + private Url url; + private Logger logger = LoggerFactory.getLogger(UrlRunnable.class); + + public UrlRunnable(Url url) { + this.url = url; + } + + private void setHeaders(HttpURLConnection con) throws IOException { + con.setRequestProperty("Content-Type", "application/json"); + con.setRequestProperty("Accept", "*/*"); + con.setRequestProperty("Cache-Control", "no-cache"); + con.setRequestProperty("Connection", "keep-alive"); + con.setDoOutput(true); + DataOutputStream out = new DataOutputStream(con.getOutputStream()); + out.flush(); + out.close(); + } + + @Override + public void run() { + try { + URL url = new URL(this.url.getUrlAddress()); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod(this.url.getRequestMethod()); + setHeaders(con); + this.url.setStatus(con.getResponseCode()); + } catch (ConnectException ex) { + this.url.setStatus(503); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } catch (ProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + this.url.setTimestamp(new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date())); + } + } +} diff --git a/src/main/java/com/api/monitor/API/Monitor/controllers/ApiController.java b/src/main/java/com/api/monitor/API/Monitor/controllers/ApiController.java new file mode 100644 index 0000000..3cf3d07 --- /dev/null +++ b/src/main/java/com/api/monitor/API/Monitor/controllers/ApiController.java @@ -0,0 +1,39 @@ +package com.api.monitor.API.Monitor.controllers; + +import com.api.monitor.API.Monitor.models.RequestUrl; +import com.api.monitor.API.Monitor.models.ResponseUrl; +import com.api.monitor.API.Monitor.services.UrlMonitoringService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletException; +import java.text.SimpleDateFormat; +import java.util.Date; + +@RestController +public class ApiController { + private Logger logger = LoggerFactory.getLogger(ApiController.class); + private UrlMonitoringService urlMonitoringService; + + @Autowired + public ApiController(UrlMonitoringService urlMonitoringService) { + this.urlMonitoringService = urlMonitoringService; + } + + @RequestMapping(value = "/addUrl", method = RequestMethod.GET) + public ResponseUrl addUrlToWatch(@RequestBody RequestUrl requestUrl) throws ServletException { + + if(requestUrl.getUrl() == null || requestUrl.getRequestMethod() == null || requestUrl.getName() == null || requestUrl.getTag() == null) { + throw new ServletException("Need all the parameters"); + } + logger.info("New Api added {}, name {}",requestUrl.getUrl(), requestUrl.getName()); + + return new ResponseUrl("Url "+requestUrl.getUrl()+" is being monitored",new ResponseUrl.Details(new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date()),"200")); + } + +} diff --git a/src/main/java/com/api/monitor/API/Monitor/models/RequestUrl.java b/src/main/java/com/api/monitor/API/Monitor/models/RequestUrl.java new file mode 100644 index 0000000..73053a3 --- /dev/null +++ b/src/main/java/com/api/monitor/API/Monitor/models/RequestUrl.java @@ -0,0 +1,59 @@ +package com.api.monitor.API.Monitor.models; + +public class RequestUrl { + private String url; + private String description; + private String requestMethod; + private Integer portNumber; + private String name; + private String tag; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getRequestMethod() { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) { + this.requestMethod = requestMethod; + } + + public Integer getPortNumber() { + return portNumber; + } + + public void setPortNumber(Integer portNumber) { + this.portNumber = portNumber; + } + +} diff --git a/src/main/java/com/api/monitor/API/Monitor/models/ResponseUrl.java b/src/main/java/com/api/monitor/API/Monitor/models/ResponseUrl.java new file mode 100644 index 0000000..0d644fd --- /dev/null +++ b/src/main/java/com/api/monitor/API/Monitor/models/ResponseUrl.java @@ -0,0 +1,63 @@ +package com.api.monitor.API.Monitor.models; + +public class ResponseUrl { + private String message; + private Details details; + + public ResponseUrl(String message, Details details) { + this.message = message; + this.details = details; + } + + public ResponseUrl() { + } + + public Details getDetails() { + return details; + } + + public void setDetails(Details details) { + this.details = details; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return String.format("Test [message=%s]", message); + } + + public static class Details { + private String date; + private String statusCode; + + public String getStatusCode() { + return statusCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + + public Details(String date, String statusCode){ + this.date = date; + this.statusCode = statusCode; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + } + + +} \ No newline at end of file diff --git a/src/main/java/com/api/monitor/API/Monitor/models/Url.java b/src/main/java/com/api/monitor/API/Monitor/models/Url.java new file mode 100644 index 0000000..5d6c8f0 --- /dev/null +++ b/src/main/java/com/api/monitor/API/Monitor/models/Url.java @@ -0,0 +1,46 @@ +package com.api.monitor.API.Monitor.models; + +public class Url { + + private String urlAddress; + private Integer status; + private String requestMethod; + private String timestamp; + + public Url(String urlAddress, String requestMethod) { + this.urlAddress = urlAddress; + this.requestMethod = requestMethod; + } + + public String getUrlAddress() { + return urlAddress; + } + + public void setUrlAddress(String urlAddress) { + this.urlAddress = urlAddress; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getRequestMethod() { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) { + this.requestMethod = requestMethod; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } +} diff --git a/src/main/java/com/api/monitor/API/Monitor/services/UrlMonitoringService.java b/src/main/java/com/api/monitor/API/Monitor/services/UrlMonitoringService.java new file mode 100644 index 0000000..0fa1520 --- /dev/null +++ b/src/main/java/com/api/monitor/API/Monitor/services/UrlMonitoringService.java @@ -0,0 +1,39 @@ +package com.api.monitor.API.Monitor.services; + +import com.api.monitor.API.Monitor.UrlRunnable; +import com.api.monitor.API.Monitor.models.Url; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Service +public class UrlMonitoringService { + + private List currentMonitoringUrl = new ArrayList<>(); + private List readyToMonitorUrl = new ArrayList<>(); + private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10); + private Logger logger = LoggerFactory.getLogger(UrlMonitoringService.class); + + //runs threads for every 2 seconds + public void runReadyToMonitorUrlQueue() { + + for (int i = 0; i < readyToMonitorUrl.size(); i++) { + scheduledExecutorService.scheduleAtFixedRate + (new UrlRunnable(readyToMonitorUrl.get(i)), 0, 2, TimeUnit.SECONDS); + logger.info("run {}",readyToMonitorUrl.get(i).getStatus()); + } + currentMonitoringUrl.addAll(readyToMonitorUrl); + readyToMonitorUrl.clear(); + } + + public void addUrlToMonitor(Url url) { + readyToMonitorUrl.add(url); + } + +}