ChuckNorris
Test app that invokes a ChuckNorris random joke API
Structure
pom.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3 <modelVersion>4.0.0</modelVersion>
4 <groupId>bitarus.allowed.org</groupId>
5 <artifactId>chucknorris</artifactId>
6 <version>0.1.0</version>
7 <parent>
8 <groupId>org.springframework.boot</groupId>
9 <artifactId>spring-boot-starter-parent</artifactId>
10 <version>2.1.6.RELEASE</version>
11 </parent>
12 <dependencies>
13 <dependency>
14 <groupId>org.springframework.boot</groupId>
15 <artifactId>spring-boot-starter-thymeleaf</artifactId>
16 </dependency>
17 <dependency>
18 <groupId>org.springframework.boot</groupId>
19 <artifactId>spring-boot-starter-web</artifactId>
20 </dependency>
21 <dependency>
22 <groupId>com.google.code.gson</groupId>
23 <artifactId>gson</artifactId>
24 <version>2.8.6</version>
25 <scope>compile</scope>
26 </dependency>
27 </dependencies>
28 <properties>
29 <start-class>chucknorris.bitarus.allowed.org.Application</start-class>
30 </properties>
31 <build>
32 <plugins>
33 <plugin>
34 <groupId>org.springframework.boot</groupId>
35 <artifactId>spring-boot-maven-plugin</artifactId>
36 </plugin>
37 </plugins>
38 </build>
39 <repositories>
40 <repository>
41 <id>spring-milestone</id>
42 <url>http://repo.spring.io/libs-release</url>
43 </repository>
44 </repositories>
45 <pluginRepositories>
46 <pluginRepository>
47 <id>spring-milestone</id>
48 <url>http://repo.spring.io/libs-release</url>
49 </pluginRepository>
50 </pluginRepositories>
51 </project>
Application.java
1 package chucknorris.bitarus.allowed.org;
2
3 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
4 import org.springframework.boot.SpringApplication;
5 import org.springframework.context.annotation.ComponentScan;
6 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory;
8
9 @ComponentScan //scans for @Component beans
10 @EnableAutoConfiguration
11 public class Application {
12 private static Logger logger;
13
14 public static void main(String[] args) {
15 logger = LoggerFactory.getLogger(Application.class);
16 logger.info("Starting application");
17 SpringApplication.run(Application.class, args);
18 }
19 }
ChuckNorrisController.java
1 package chucknorris.bitarus.allowed.org;
2
3 import org.springframework.stereotype.Controller;
4 import org.springframework.web.bind.annotation.RequestMapping;
5 import org.springframework.ui.Model;
6 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory;
8 import org.springframework.web.bind.annotation.ResponseBody;
9
10 import java.io.BufferedReader;
11 import java.io.InputStreamReader;
12 import java.io.OutputStream;
13 import java.net.HttpURLConnection;
14 import java.net.URL;
15 import org.springframework.http.HttpMethod;
16 import com.google.gson.Gson;
17 import java.util.stream.Stream;
18 import java.util.stream.Collectors;
19 import java.util.List;
20 import java.util.ArrayList;
21
22 @Controller
23 public class ChuckNorrisController{
24 private final Logger logger = LoggerFactory.getLogger(ChuckNorrisController.class);
25
26 public ChuckNorrisController(){
27 logger.info("ChuckNorrisController created");
28 }
29
30 @RequestMapping("/chucknorris")
31 @ResponseBody
32 // http://localhost:8080/chucknorris
33 public JokeResponse chucknorris() {
34 String ret = "";
35 Gson gson = new Gson();
36
37 try {
38 URL url = new URL("https://api.chucknorris.io/jokes/random");
39 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
40 connection.connect();
41 logger.info( Integer.toString(connection.getResponseCode() ));
42
43 try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"))) {
44 StringBuilder response = new StringBuilder();
45 String responseLine = null;
46 while ((responseLine = br.readLine()) != null) {
47 response.append(responseLine.trim());
48 }
49
50 Joke joke = gson.fromJson(response.toString(), Joke.class);
51
52
53 List<Joke> jokesList = new ArrayList<Joke>();
54 jokesList.add(joke);
55 List<Joke> jokesList2 = jokesList.stream().map( item ->{item.setValue(item.getValue().toUpperCase()); return item;} ).collect(Collectors.toList());
56 joke = jokesList2.get(0);
57 ret = joke.getValue();
58 }
59
60 }
61 catch(Exception ex){
62 logger.error("error",ex);
63 }
64
65 JokeResponse jr = new JokeResponse();
66 jr.setResponse(ret);
67 return jr;
68 }
69 }
Joke.java
1 package chucknorris.bitarus.allowed.org;
2 import com.google.gson.annotations.SerializedName;
3
4 public class Joke{
5
6 @SerializedName("categories")
7 private String[] categories;
8 @SerializedName("created_at")
9 private String createdAt;
10 @SerializedName("icon_url")
11 private String iconUrl;
12 @SerializedName("id")
13 private String id;
14 @SerializedName("updated_at")
15 private String updatedAt;
16 @SerializedName("url")
17 private String url;
18 @SerializedName("value")
19 private String value;
20
21 public String[] getCategories(){
22 return this.categories;
23 }
24
25 public String getCreatedAt(){
26 return this.createdAt;
27 }
28
29 public String getIconUrl(){
30 return this.iconUrl;
31 }
32
33 public String getId(){
34 return this.id;
35 }
36
37 public String getUpdatedAt(){
38 return this.updatedAt;
39 }
40
41 public String getUrl(){
42 return this.url;
43 }
44
45 public String getValue(){
46 return this.value;
47 }
48
49 public void setCategories(String[] categories){
50 this.categories = categories;
51 }
52
53 public void setCreatedAt(String createdAt ){
54 this.createdAt = createdAt;
55 }
56
57 public void setIconUrl(String iconUrl){
58 this.iconUrl=iconUrl;
59 }
60
61 public void setId(String id){
62 this.id=id;
63 }
64
65 public void setUpdatedAt(String updatedAt){
66 this.updatedAt=updatedAt;
67 }
68
69 public void setUrl(String url){
70 this.url=url;
71 }
72
73 public void setValue(String value){
74 this.value=value;
75 }
76 }
JokeResponse.java
1 package chucknorris.bitarus.allowed.org;
2 import com.google.gson.annotations.SerializedName;
3
4 public class JokeResponse{
5
6 @SerializedName("response")
7 private String response;
8
9 public String getResponse(){
10 return this.response;
11 }
12
13 public void setResponse(String response){
14 this.response = response;
15 }
16 }