From 9cb6ff1227750aeb25db44183ce945f6bcf9835e Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Thu, 3 Feb 2022 07:47:26 +0000 Subject: [PATCH 01/27] BAEL-5229: Code for Fauna article --- persistence-modules/fauna/.gitignore | 1 + persistence-modules/fauna/pom.xml | 56 ++++++++ .../faunablog/FaunaBlogApplication.java | 13 ++ .../faunablog/FaunaConfiguration.java | 25 ++++ .../faunablog/WebSecurityConfiguration.java | 35 +++++ .../com/baeldung/faunablog/posts/Author.java | 3 + .../com/baeldung/faunablog/posts/Post.java | 5 + .../faunablog/posts/PostsController.java | 50 +++++++ .../faunablog/posts/PostsService.java | 124 ++++++++++++++++++ .../baeldung/faunablog/posts/UpdatedPost.java | 3 + .../users/FaunaUserDetailsService.java | 44 +++++++ .../src/main/resources/application.properties | 0 12 files changed, 359 insertions(+) create mode 100644 persistence-modules/fauna/.gitignore create mode 100644 persistence-modules/fauna/pom.xml create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaConfiguration.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/WebSecurityConfiguration.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Author.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Post.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsController.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsService.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/UpdatedPost.java create mode 100644 persistence-modules/fauna/src/main/java/com/baeldung/faunablog/users/FaunaUserDetailsService.java create mode 100644 persistence-modules/fauna/src/main/resources/application.properties diff --git a/persistence-modules/fauna/.gitignore b/persistence-modules/fauna/.gitignore new file mode 100644 index 0000000000..c37fa0c4b3 --- /dev/null +++ b/persistence-modules/fauna/.gitignore @@ -0,0 +1 @@ +/application.properties diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml new file mode 100644 index 0000000000..72c0f0a751 --- /dev/null +++ b/persistence-modules/fauna/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.2 + + + com.baeldung + fauna-blog + 0.0.1-SNAPSHOT + fauna-blog + Blogging Service built with FaunaDB + + 17 + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + com.faunadb + faunadb-java + 4.2.0 + compile + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java new file mode 100644 index 0000000000..f0ca6881b7 --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.faunablog; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class FaunaBlogApplication { + + public static void main(String[] args) { + SpringApplication.run(FaunaBlogApplication.class, args); + } + +} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaConfiguration.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaConfiguration.java new file mode 100644 index 0000000000..9964431475 --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaConfiguration.java @@ -0,0 +1,25 @@ +package com.baeldung.faunablog; + +import com.faunadb.client.FaunaClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.net.MalformedURLException; + +@Configuration +class FaunaConfiguration { + @Value("https://db.${fauna.region}.fauna.com/") + private String faunaUrl; + + @Value("${fauna.secret}") + private String faunaSecret; + + @Bean + FaunaClient getFaunaClient() throws MalformedURLException { + return FaunaClient.builder() + .withEndpoint(faunaUrl) + .withSecret(faunaSecret) + .build(); + } +} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/WebSecurityConfiguration.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/WebSecurityConfiguration.java new file mode 100644 index 0000000000..da99b7578e --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/WebSecurityConfiguration.java @@ -0,0 +1,35 @@ +package com.baeldung.faunablog; + +import com.baeldung.faunablog.users.FaunaUserDetailsService; +import com.faunadb.client.FaunaClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private FaunaClient faunaClient; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable(); + http.authorizeRequests() + .antMatchers("/**").permitAll() + .and().httpBasic(); + } + + @Bean + @Override + public UserDetailsService userDetailsService() { + return new FaunaUserDetailsService(faunaClient); + } +} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Author.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Author.java new file mode 100644 index 0000000000..ec4854621d --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Author.java @@ -0,0 +1,3 @@ +package com.baeldung.faunablog.posts; + +public record Author(String username, String name) {} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Post.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Post.java new file mode 100644 index 0000000000..62b6558a37 --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/Post.java @@ -0,0 +1,5 @@ +package com.baeldung.faunablog.posts; + +import java.time.Instant; + +public record Post(String id, String title, String content, Author author, Instant created, Long version) {} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsController.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsController.java new file mode 100644 index 0000000000..e8e6316ea8 --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsController.java @@ -0,0 +1,50 @@ +package com.baeldung.faunablog.posts; + +import com.faunadb.client.errors.NotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; +import java.util.concurrent.ExecutionException; + +@RestController +@RequestMapping("/posts") +public class PostsController { + @Autowired + private PostsService postsService; + + @GetMapping + public List listPosts(@RequestParam(value = "author", required = false) String author) throws ExecutionException, InterruptedException { + return author == null ? postsService.getAllPosts() : postsService.getAuthorPosts("graham"); + } + + @GetMapping("/{id}") + public Post getPost(@PathVariable("id") String id, @RequestParam(value = "before", required = false) Long before) + throws ExecutionException, InterruptedException { + return postsService.getPost(id, before); + } + + @PostMapping + @ResponseStatus(HttpStatus.NO_CONTENT) + @PreAuthorize("isAuthenticated()") + public void createPost(@RequestBody UpdatedPost post) throws ExecutionException, InterruptedException { + String name = SecurityContextHolder.getContext().getAuthentication().getName(); + postsService.createPost(name, post.title(), post.content()); + } + + @PutMapping("/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + @PreAuthorize("isAuthenticated()") + public void updatePost(@PathVariable("id") String id, @RequestBody UpdatedPost post) + throws ExecutionException, InterruptedException { + postsService.updatePost(id, post.title(), post.content()); + } + + @ExceptionHandler(NotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public void postNotFound() {} +} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsService.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsService.java new file mode 100644 index 0000000000..5143a24b28 --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/PostsService.java @@ -0,0 +1,124 @@ +package com.baeldung.faunablog.posts; + +import com.faunadb.client.FaunaClient; +import com.faunadb.client.types.Value; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; + +import static com.faunadb.client.query.Language.*; + +@Component +public class PostsService { + @Autowired + private FaunaClient faunaClient; + + Post getPost(String id, Long before) throws ExecutionException, InterruptedException { + var query = Get(Ref(Collection("posts"), id)); + if (before != null) { + query = At(Value(before - 1), query); + } + + var postResult= faunaClient.query( + Let( + "post", query + ).in( + Obj( + "post", Var("post"), + "author", Get(Select(Arr(Value("data"), Value("authorRef")), Var("post"))) + ) + )).get(); + + return parsePost(postResult); + } + + List getAllPosts() throws ExecutionException, InterruptedException { + var postsResult = faunaClient.query(Map( + Paginate( + Join( + Documents(Collection("posts")), + Index("posts_sort_by_created_desc") + ) + ), + Lambda( + Arr(Value("extra"), Value("ref")), + Obj( + "post", Get(Var("ref")), + "author", Get(Select(Arr(Value("data"), Value("authorRef")), Get(Var("ref")))) + ) + ) + )).get(); + + var posts = postsResult.at("data").asCollectionOf(Value.class).get(); + return posts.stream().map(this::parsePost).collect(Collectors.toList()); + } + + List getAuthorPosts(String author) throws ExecutionException, InterruptedException { + var postsResult = faunaClient.query(Map( + Paginate( + Join( + Match(Index("posts_by_author"), Select(Value("ref"), Get(Match(Index("users_by_username"), Value(author))))), + Index("posts_sort_by_created_desc") + ) + ), + Lambda( + Arr(Value("extra"), Value("ref")), + Obj( + "post", Get(Var("ref")), + "author", Get(Select(Arr(Value("data"), Value("authorRef")), Get(Var("ref")))) + ) + ) + )).get(); + + var posts = postsResult.at("data").asCollectionOf(Value.class).get(); + return posts.stream().map(this::parsePost).collect(Collectors.toList()); + } + + public void createPost(String author, String title, String contents) throws ExecutionException, InterruptedException { + faunaClient.query( + Create(Collection("posts"), + Obj( + "data", Obj( + "title", Value(title), + "contents", Value(contents), + "created", Now(), + "authorRef", Select(Value("ref"), Get(Match(Index("users_by_username"), Value(author))))) + ) + ) + ).get(); + } + + public void updatePost(String id, String title, String contents) throws ExecutionException, InterruptedException { + faunaClient.query( + Update(Ref(Collection("posts"), id), + Obj( + "data", Obj( + "title", Value(title), + "contents", Value(contents)) + ) + ) + ).get(); + } + + private Post parsePost(Value entry) { + var author = entry.at("author"); + var post = entry.at("post"); + + return new Post( + post.at("ref").to(Value.RefV.class).get().getId(), + post.at("data", "title").to(String.class).get(), + post.at("data", "contents").to(String.class).get(), + new Author( + author.at("data", "username").to(String.class).get(), + author.at("data", "name").to(String.class).get() + ), + post.at("data", "created").to(Instant.class).get(), + post.at("ts").to(Long.class).get() + ); + } +} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/UpdatedPost.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/UpdatedPost.java new file mode 100644 index 0000000000..9850cd5927 --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/posts/UpdatedPost.java @@ -0,0 +1,3 @@ +package com.baeldung.faunablog.posts; + +public record UpdatedPost(String title, String content) {} diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/users/FaunaUserDetailsService.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/users/FaunaUserDetailsService.java new file mode 100644 index 0000000000..2e88aaa477 --- /dev/null +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/users/FaunaUserDetailsService.java @@ -0,0 +1,44 @@ +package com.baeldung.faunablog.users; + +import com.faunadb.client.FaunaClient; +import com.faunadb.client.types.Value; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.concurrent.ExecutionException; + +import static com.faunadb.client.query.Language.*; + +public class FaunaUserDetailsService implements UserDetailsService { + private FaunaClient faunaClient; + + public FaunaUserDetailsService(FaunaClient faunaClient) { + this.faunaClient = faunaClient; + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + try { + Value user = faunaClient.query(Map( + Paginate(Match(Index("users_by_username"), Value(username))), + Lambda(Value("user"), Get(Var("user"))))) + .get(); + + Value userData = user.at("data").at(0).orNull(); + if (userData == null) { + throw new UsernameNotFoundException("User not found"); + } + + return User.withDefaultPasswordEncoder() + .username(userData.at("data", "username").to(String.class).orNull()) + .password(userData.at("data", "password").to(String.class).orNull()) + .roles("USER") + .build(); + } catch (ExecutionException | InterruptedException e) { + throw new RuntimeException(e); + } + } +} + diff --git a/persistence-modules/fauna/src/main/resources/application.properties b/persistence-modules/fauna/src/main/resources/application.properties new file mode 100644 index 0000000000..e69de29bb2 From 7a7fe1100280cc5c3311fe6dddf2b215d6059c64 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Fri, 4 Feb 2022 07:38:45 +0000 Subject: [PATCH 02/27] Added to the '*-jdk9-and-above' profiles --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index f2a230357c..c2979b9ed1 100644 --- a/pom.xml +++ b/pom.xml @@ -1345,6 +1345,7 @@ quarkus-jandex spring-boot-modules/spring-boot-cassandre testing-modules/testing-assertions + persistence-modules/fauna @@ -1402,6 +1403,7 @@ quarkus-jandex spring-boot-modules/spring-boot-cassandre testing-modules/testing-assertions + persistence-modules/fauna From 3c701c53885d101efb3ecdf4e191ed95c8eabd1a Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Thu, 10 Feb 2022 07:32:33 +0000 Subject: [PATCH 03/27] Replaced tabs with spaces in auto-generated files --- persistence-modules/fauna/pom.xml | 88 +++++++++---------- .../faunablog/FaunaBlogApplication.java | 6 +- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/persistence-modules/fauna/pom.xml b/persistence-modules/fauna/pom.xml index 72c0f0a751..67aabb7501 100644 --- a/persistence-modules/fauna/pom.xml +++ b/persistence-modules/fauna/pom.xml @@ -1,30 +1,30 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.6.2 - - - com.baeldung - fauna-blog - 0.0.1-SNAPSHOT - fauna-blog - Blogging Service built with FaunaDB - - 17 - - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-web - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.2 + + + com.baeldung + fauna-blog + 0.0.1-SNAPSHOT + fauna-blog + Blogging Service built with FaunaDB + + 17 + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + com.faunadb faunadb-java @@ -32,25 +32,25 @@ compile - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.security - spring-security-test - test - - + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java index f0ca6881b7..12739342bf 100644 --- a/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java +++ b/persistence-modules/fauna/src/main/java/com/baeldung/faunablog/FaunaBlogApplication.java @@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class FaunaBlogApplication { - public static void main(String[] args) { - SpringApplication.run(FaunaBlogApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(FaunaBlogApplication.class, args); + } } From a6df0b9ff9accfab245a1b0fd14d23d91c70a57a Mon Sep 17 00:00:00 2001 From: Amitabh Tiwari Date: Sun, 13 Feb 2022 19:04:52 +0530 Subject: [PATCH 04/27] Changes to fetch the Original Message --- .../fileupload/config/ExceptionMessage.java | 55 +++++++++++++++++++ .../fileupload/config/FeignSupportConfig.java | 6 ++ .../config/RetreiveMessageErrorDecoder.java | 35 ++++++++++++ .../fileupload/controller/FileController.java | 5 ++ .../fileupload/service/UploadClient.java | 3 + .../fileupload/service/UploadService.java | 4 ++ 6 files changed, 108 insertions(+) create mode 100644 spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java create mode 100644 spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java new file mode 100644 index 0000000000..45a555b2ea --- /dev/null +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/ExceptionMessage.java @@ -0,0 +1,55 @@ +package com.baeldung.cloud.openfeign.fileupload.config; + +public class ExceptionMessage { + private String timestamp; + private int status; + private String error; + private String message; + private String path; + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + @Override + public String toString() { + return "ExceptionMessage [timestamp=" + timestamp + ", status=" + status + ", error=" + error + ", message=" + message + ", path=" + path + "]"; + } + +} diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java index 943134213a..802077a3d7 100644 --- a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/FeignSupportConfig.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; import feign.codec.Encoder; +import feign.codec.ErrorDecoder; import feign.form.spring.SpringFormEncoder; public class FeignSupportConfig { @@ -19,4 +20,9 @@ public class FeignSupportConfig { } })); } + + @Bean + public ErrorDecoder errorDecoder() { + return new RetreiveMessageErrorDecoder(); + } } diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java new file mode 100644 index 0000000000..09bf8bf54b --- /dev/null +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/config/RetreiveMessageErrorDecoder.java @@ -0,0 +1,35 @@ +package com.baeldung.cloud.openfeign.fileupload.config; + +import java.io.IOException; +import java.io.InputStream; + +import com.baeldung.cloud.openfeign.exception.BadRequestException; +import com.baeldung.cloud.openfeign.exception.NotFoundException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import feign.Response; +import feign.codec.ErrorDecoder; + +public class RetreiveMessageErrorDecoder implements ErrorDecoder { + private final ErrorDecoder errorDecoder = new Default(); + + @Override + public Exception decode(String methodKey, Response response) { + ExceptionMessage message = null; + try (InputStream bodyIs = response.body() + .asInputStream()) { + ObjectMapper mapper = new ObjectMapper(); + message = mapper.readValue(bodyIs, ExceptionMessage.class); + } catch (IOException e) { + return new Exception(e.getMessage()); + } + switch (response.status()) { + case 400: + return new BadRequestException(message.getMessage() != null ? message.getMessage() : "Bad Request"); + case 404: + return new NotFoundException(message.getMessage() != null ? message.getMessage() : "Not found"); + default: + return errorDecoder.decode(methodKey, response); + } + } +} diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java index ebdf7ff6c8..1ddbfcea81 100644 --- a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/controller/FileController.java @@ -25,4 +25,9 @@ public class FileController { return service.uploadFileWithManualClient(file); } + @PostMapping(value = "/upload-error") + public String handleFileUploadError(@RequestPart(value = "file") MultipartFile file) { + return service.uploadFile(file); + } + } \ No newline at end of file diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java index 63d17130e9..8f3ef7e421 100644 --- a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadClient.java @@ -12,4 +12,7 @@ import com.baeldung.cloud.openfeign.fileupload.config.FeignSupportConfig; public interface UploadClient { @PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) String fileUpload(@RequestPart(value = "file") MultipartFile file); + + @PostMapping(value = "/upload-file-error", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + String fileUploadError(@RequestPart(value = "file") MultipartFile file); } diff --git a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java index 7dd7f5a89c..742a37668b 100644 --- a/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java +++ b/spring-cloud/spring-cloud-openfeign/src/main/java/com/baeldung/cloud/openfeign/fileupload/service/UploadService.java @@ -26,4 +26,8 @@ public class UploadService { return client.fileUpload(file); } + public String uploadFileError(MultipartFile file) { + return client.fileUpload(file); + } + } \ No newline at end of file From 91bd7fa37fcab4b499fa38fe527deae21791a4b7 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 23 Feb 2022 17:43:45 +0200 Subject: [PATCH 05/27] remove duplicate code from old module BAEL-5336 --- spring-5-autowiring-beans/README.md | 3 -- spring-5-autowiring-beans/pom.xml | 24 ---------------- .../java/com/baeldung/autowiring/App.java | 14 ---------- .../controller/CorrectController.java | 18 ------------ .../controller/FlawedController.java | 15 ---------- .../autowiring/service/MyComponent.java | 10 ------- .../autowiring/service/MyService.java | 19 ------------- .../service/MyServiceConfiguration.java | 14 ---------- .../CorrectControllerIntegrationTest.java | 23 --------------- .../FlawedControllerIntegrationTest.java | 28 ------------------- 10 files changed, 168 deletions(-) delete mode 100644 spring-5-autowiring-beans/README.md delete mode 100644 spring-5-autowiring-beans/pom.xml delete mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java delete mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java delete mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java delete mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java delete mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java delete mode 100644 spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java delete mode 100644 spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java delete mode 100644 spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java diff --git a/spring-5-autowiring-beans/README.md b/spring-5-autowiring-beans/README.md deleted file mode 100644 index dc8751325e..0000000000 --- a/spring-5-autowiring-beans/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: - -- [Spring @Autowired Field Null – Common Causes and Solutions](https://www.baeldung.com/spring-autowired-field-null) diff --git a/spring-5-autowiring-beans/pom.xml b/spring-5-autowiring-beans/pom.xml deleted file mode 100644 index 32b56cc9ad..0000000000 --- a/spring-5-autowiring-beans/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - spring-5-autowiring-beans - 0.0.1-SNAPSHOT - spring-5-autowiring-beans - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - org.springframework.boot - spring-boot-starter-web - - - - diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java deleted file mode 100644 index d2d0db7a60..0000000000 --- a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/App.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.autowiring; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -@SpringBootApplication -public class App { - - public static void main(String[] args) { - SpringApplication.run(App.class, args); - } - -} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java deleted file mode 100644 index e0c0d7eeac..0000000000 --- a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/CorrectController.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.autowiring.controller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; - -import com.baeldung.autowiring.service.MyService; - -@Controller -public class CorrectController { - - @Autowired - MyService myService; - - public String control() { - return myService.serve(); - } - -} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java deleted file mode 100644 index 673e686f79..0000000000 --- a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/controller/FlawedController.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.autowiring.controller; - -import org.springframework.stereotype.Controller; - -import com.baeldung.autowiring.service.MyService; - -@Controller -public class FlawedController { - - public String control() { - MyService userService = new MyService(); - return userService.serve(); - } - -} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java deleted file mode 100644 index c04ca3f4ba..0000000000 --- a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyComponent.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.autowiring.service; - -import org.springframework.stereotype.Component; - -@Component -public class MyComponent { - - public void doWork() {} - -} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java deleted file mode 100644 index 3443dc05de..0000000000 --- a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.autowiring.service; - -import org.springframework.beans.factory.annotation.Autowired; - -/** - * The bean corresponding to this class is defined in MyServiceConfiguration - * Alternatively, you could choose to decorate this class with @Component or @Service - */ -public class MyService { - - @Autowired - MyComponent myComponent; - - public String serve() { - myComponent.doWork(); - return "success"; - } - -} diff --git a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java b/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java deleted file mode 100644 index e30e4f770e..0000000000 --- a/spring-5-autowiring-beans/src/main/java/com/baeldung/autowiring/service/MyServiceConfiguration.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.autowiring.service; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MyServiceConfiguration { - - @Bean - MyService myService() { - return new MyService(); - } - -} diff --git a/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java b/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java deleted file mode 100644 index 3807641edd..0000000000 --- a/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/CorrectControllerIntegrationTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.autowiring.controller; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class CorrectControllerIntegrationTest { - - @Autowired - CorrectController controller; - - @Test - void whenControl_ThenRunSuccessfully() { - assertDoesNotThrow(() -> controller.control()); - } - -} diff --git a/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java b/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java deleted file mode 100644 index 79d446604f..0000000000 --- a/spring-5-autowiring-beans/src/test/java/com/baeldung/autowiring/controller/FlawedControllerIntegrationTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.autowiring.controller; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class FlawedControllerIntegrationTest { - - private static final Logger LOGGER = LoggerFactory.getLogger(FlawedControllerIntegrationTest.class); - - @Autowired - FlawedController myController; - - @Test - void whenControl_ThenThrowNullPointerException() { - NullPointerException npe = assertThrows(NullPointerException.class, () -> myController.control()); - LOGGER.error("Got a NullPointerException", npe); - } - -} From ef88a1803f7bd1b163b02dc54e6f93ecdc8c6150 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Fri, 4 Mar 2022 21:17:23 +0000 Subject: [PATCH 06/27] [JAVA-10432] Rename and enable testng-command-line module --- testing-modules/pom.xml | 1 + .../{testng_command_line => testng-command-line}/README.md | 0 .../{testng_command_line => testng-command-line}/pom.xml | 6 +++--- .../java/com/baeldung/testng}/DateSerializerService.java | 2 +- .../com/baeldung/testng}/DateSerializerServiceUnitTest.java | 3 ++- .../{testng_command_line => testng-command-line}/testng.xml | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) rename testing-modules/{testng_command_line => testng-command-line}/README.md (100%) rename testing-modules/{testng_command_line => testng-command-line}/pom.xml (97%) rename testing-modules/{testng_command_line/src/main/java/com/baeldung/testing_modules/testng_command_line => testng-command-line/src/main/java/com/baeldung/testng}/DateSerializerService.java (82%) rename testing-modules/{testng_command_line/src/test/java/com/baeldung/testing_modules/testng_command_line => testng-command-line/src/test/java/com/baeldung/testng}/DateSerializerServiceUnitTest.java (87%) rename testing-modules/{testng_command_line => testng-command-line}/testng.xml (67%) diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 58ea74484e..3d5db76827 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -45,6 +45,7 @@ testing-libraries-2 testing-libraries testng + testng-command-line xmlunit-2 zerocode diff --git a/testing-modules/testng_command_line/README.md b/testing-modules/testng-command-line/README.md similarity index 100% rename from testing-modules/testng_command_line/README.md rename to testing-modules/testng-command-line/README.md diff --git a/testing-modules/testng_command_line/pom.xml b/testing-modules/testng-command-line/pom.xml similarity index 97% rename from testing-modules/testng_command_line/pom.xml rename to testing-modules/testng-command-line/pom.xml index 4c3af7621c..efc49b187d 100644 --- a/testing-modules/testng_command_line/pom.xml +++ b/testing-modules/testng-command-line/pom.xml @@ -3,10 +3,10 @@ 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"> 4.0.0 - - com.baeldung.testing_modules - testng_command_line + testng-command-line 1.0.0-SNAPSHOT + testng-command-line + com.baeldung testing-modules diff --git a/testing-modules/testng_command_line/src/main/java/com/baeldung/testing_modules/testng_command_line/DateSerializerService.java b/testing-modules/testng-command-line/src/main/java/com/baeldung/testng/DateSerializerService.java similarity index 82% rename from testing-modules/testng_command_line/src/main/java/com/baeldung/testing_modules/testng_command_line/DateSerializerService.java rename to testing-modules/testng-command-line/src/main/java/com/baeldung/testng/DateSerializerService.java index 2c4c1f3a4b..a9a7cc4ee6 100644 --- a/testing-modules/testng_command_line/src/main/java/com/baeldung/testing_modules/testng_command_line/DateSerializerService.java +++ b/testing-modules/testng-command-line/src/main/java/com/baeldung/testng/DateSerializerService.java @@ -1,4 +1,4 @@ -package com.baeldung.testing_modules.testng_command_line; +package com.baeldung.testng; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/testing-modules/testng_command_line/src/test/java/com/baeldung/testing_modules/testng_command_line/DateSerializerServiceUnitTest.java b/testing-modules/testng-command-line/src/test/java/com/baeldung/testng/DateSerializerServiceUnitTest.java similarity index 87% rename from testing-modules/testng_command_line/src/test/java/com/baeldung/testing_modules/testng_command_line/DateSerializerServiceUnitTest.java rename to testing-modules/testng-command-line/src/test/java/com/baeldung/testng/DateSerializerServiceUnitTest.java index 4deb0297f0..2b9a9a0925 100644 --- a/testing-modules/testng_command_line/src/test/java/com/baeldung/testing_modules/testng_command_line/DateSerializerServiceUnitTest.java +++ b/testing-modules/testng-command-line/src/test/java/com/baeldung/testng/DateSerializerServiceUnitTest.java @@ -1,7 +1,8 @@ -package com.baeldung.testing_modules.testng_command_line; +package com.baeldung.testng; import java.util.Date; +import com.baeldung.testng.DateSerializerService; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; diff --git a/testing-modules/testng_command_line/testng.xml b/testing-modules/testng-command-line/testng.xml similarity index 67% rename from testing-modules/testng_command_line/testng.xml rename to testing-modules/testng-command-line/testng.xml index eca48a6d39..4e029f9dc6 100644 --- a/testing-modules/testng_command_line/testng.xml +++ b/testing-modules/testng-command-line/testng.xml @@ -4,7 +4,7 @@ + name="com.baeldung.testng.DateSerializerServiceUnitTest" /> From 9da940a252d11c7489101232c76c2f710fa2bbed Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Sun, 6 Mar 2022 00:41:44 +0000 Subject: [PATCH 07/27] [JAVA-10398] Rename intermittent failing test to ManualTest --- ...st.java => IllegalMonitorStateExceptionManualTest.java} | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) rename core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/{IllegalMonitorStateExceptionUnitTest.java => IllegalMonitorStateExceptionManualTest.java} (91%) diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionManualTest.java similarity index 91% rename from core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionUnitTest.java rename to core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionManualTest.java index 857ab02c13..31807255e8 100644 --- a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionUnitTest.java +++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionManualTest.java @@ -7,7 +7,12 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; -public class IllegalMonitorStateExceptionUnitTest { +/** + * Needs to be run manually in order to demonstrate the IllegalMonitorStateException scenarios. + * + * There are some intermittent test failures in Jenkins that require further investigation. + */ +public class IllegalMonitorStateExceptionManualTest { @Test void whenSyncSenderAndSyncReceiverAreUsed_thenIllegalMonitorExceptionShouldNotBeThrown() throws InterruptedException { From dafb4d1f580dfb30b3c85f7b7c9bb7c62449e260 Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Sun, 6 Mar 2022 09:59:16 +0530 Subject: [PATCH 08/27] BAEL-5401: Update Fields of Documents in MongoDB Using the Java Driver (#11889) --- .../baeldung/mongo/update/UpdateFields.java | 128 ++++++++++++++++ .../baeldung/update/UpdateFieldLiveTest.java | 143 ++++++++++++++++++ 2 files changed, 271 insertions(+) create mode 100644 persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java create mode 100644 persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java new file mode 100644 index 0000000000..a1b051e74c --- /dev/null +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateFields.java @@ -0,0 +1,128 @@ +package com.baeldung.mongo.update; + +import org.bson.Document; + +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.FindOneAndReplaceOptions; +import com.mongodb.client.model.FindOneAndUpdateOptions; +import com.mongodb.client.model.ReturnDocument; +import com.mongodb.client.model.Updates; +import com.mongodb.client.result.UpdateResult; + +public class UpdateFields { + + private static MongoClient mongoClient; + private static MongoDatabase database; + private static MongoCollection collection; + + public static void updateOne() { + + UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"), Updates.set("address", "Hostel 2")); + + System.out.println("updateResult:- " + updateResult); + } + + public static void updateMany() { + + UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true)); + + System.out.println("updateResult:- " + updateResult); + + } + + public static void replaceOne() { + + Document replaceDocument = new Document(); + replaceDocument.append("student_id", 8764) + .append("student_name", "Paul Starc") + .append("address", "Hostel 3") + .append("age", 18) + .append("roll_no", 199406); + + UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument); + + System.out.println("updateResult:- " + updateResult); + + } + + public static void findOneAndReplace() { + + Document replaceDocument = new Document(); + replaceDocument.append("student_id", 8764) + .append("student_name", "Paul Starc") + .append("address", "Hostel 4") + .append("age", 18) + .append("roll_no", 199406); + Document sort = new Document("roll_no", 1); + Document projection = new Document("_id", 0).append("student_id", 1) + .append("address", 1); + Document resultDocument = collection.findOneAndReplace(Filters.eq("student_id", 8764), replaceDocument, new FindOneAndReplaceOptions().upsert(true) + .sort(sort) + .projection(projection) + .returnDocument(ReturnDocument.AFTER)); + + System.out.println("resultDocument:- " + resultDocument); + + } + + public static void findOneAndUpdate() { + + Document sort = new Document("roll_no", 1); + Document projection = new Document("_id", 0).append("student_id", 1) + .append("address", 1); + Document resultDocument = collection.findOneAndUpdate(Filters.eq("student_id", 8764), Updates.inc("roll_no", 5), new FindOneAndUpdateOptions().upsert(true) + .sort(sort) + .projection(projection) + .returnDocument(ReturnDocument.AFTER)); + + System.out.println("resultDocument:- " + resultDocument); + } + + public static void setup() { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + database = mongoClient.getDatabase("baeldung"); + collection = database.getCollection("student"); + + } + } + + public static void main(String[] args) { + + // + // Connect to cluster (default is localhost:27017) + // + setup(); + + // + // Update a document using updateOne method + // + updateOne(); + + // + // Update documents using updateMany method + // + updateMany(); + + // + // replace a document using replaceOne method + // + replaceOne(); + + // + // replace a document using findOneAndReplace method + // + findOneAndReplace(); + + // + // Update a document using findOneAndUpdate method + // + findOneAndUpdate(); + + } + +} + diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java new file mode 100644 index 0000000000..47114e1f1a --- /dev/null +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateFieldLiveTest.java @@ -0,0 +1,143 @@ +package com.baeldung.update; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import org.bson.Document; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.FindOneAndReplaceOptions; +import com.mongodb.client.model.FindOneAndUpdateOptions; +import com.mongodb.client.model.ReturnDocument; +import com.mongodb.client.model.Updates; +import com.mongodb.client.result.UpdateResult; + +public class UpdateFieldLiveTest { + + private static MongoClient mongoClient; + private static MongoDatabase db; + private static MongoCollection collection; + + @BeforeClass + public static void setup() { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + db = mongoClient.getDatabase("baeldung"); + collection = db.getCollection("student"); + + collection.insertOne(Document.parse("{ \"student_id\": 8764,\"student_name\": \"Paul Starc\",\"address\": \"Hostel 1\",\"age\": 16,\"roll_no\":199406}")); + } + } + + @Test + public void updateOne() { + + UpdateResult updateResult = collection.updateOne(Filters.eq("student_name", "Paul Starc"), Updates.set("address", "Hostel 2")); + + Document studentDetail = collection.find(Filters.eq("student_name", "Paul Starc")) + .first(); + assertNotNull(studentDetail); + assertFalse(studentDetail.isEmpty()); + + String address = studentDetail.getString("address"); + String expectedAdderess = "Hostel 2"; + + assertEquals(expectedAdderess, address); + } + + @Test + public void updateMany() { + + UpdateResult updateResult = collection.updateMany(Filters.lt("age", 20), Updates.set("Review", true)); + + Document studentDetail = collection.find(Filters.eq("student_name", "Paul Starc")) + .first(); + assertNotNull(studentDetail); + assertFalse(studentDetail.isEmpty()); + + Boolean review = studentDetail.getBoolean("Review"); + Boolean expectedAdderess = true; + + assertEquals(expectedAdderess, review); + + } + + @Test + public void replaceOne() { + + Document replaceDocument = new Document(); + replaceDocument.append("student_id", 8764) + .append("student_name", "Paul Starc") + .append("address", "Hostel 3") + .append("age", 18) + .append("roll_no", 199406); + + UpdateResult updateResult = collection.replaceOne(Filters.eq("student_id", 8764), replaceDocument); + + Document studentDetail = collection.find(Filters.eq("student_name", "Paul Starc")) + .first(); + assertNotNull(studentDetail); + assertFalse(studentDetail.isEmpty()); + + Integer age = studentDetail.getInteger("age"); + Integer expectedAge = 18; + + assertEquals(expectedAge, age); + + } + + @Test + public void findOneAndReplace() { + + Document replaceDocument = new Document(); + replaceDocument.append("student_id", 8764) + .append("student_name", "Paul Starc") + .append("address", "Hostel 4") + .append("age", 18) + .append("roll_no", 199406); + Document sort = new Document("roll_no", 1); + Document projection = new Document("_id", 0).append("student_id", 1) + .append("address", 1); + Document resultDocument = collection.findOneAndReplace(Filters.eq("student_id", 8764), replaceDocument, new FindOneAndReplaceOptions().upsert(true) + .sort(sort) + .projection(projection) + .returnDocument(ReturnDocument.AFTER)); + + Document studentDetail = collection.find(Filters.eq("student_name", "Paul Starc")) + .first(); + assertNotNull(studentDetail); + assertFalse(studentDetail.isEmpty()); + + Integer age = studentDetail.getInteger("age"); + Integer expectedAge = 18; + + assertEquals(expectedAge, age); + + } + + @Test + public void findOneAndUpdate() { + + Document sort = new Document("roll_no", 1); + Document projection = new Document("_id", 0).append("student_id", 1) + .append("address", 1); + Document resultDocument = collection.findOneAndUpdate(Filters.eq("student_id", 8764), Updates.inc("roll_no", 5), new FindOneAndUpdateOptions().upsert(true) + .sort(sort) + .projection(projection) + .returnDocument(ReturnDocument.AFTER)); + + Document studentDetail = collection.find(Filters.eq("student_name", "Paul Starc")) + .first(); + assertNotNull(studentDetail); + assertFalse(studentDetail.isEmpty()); + + } + +} + From f0d831095be920798663ede3d8a1a10dbc23280f Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Sun, 6 Mar 2022 11:56:55 +0500 Subject: [PATCH 09/27] Updated README.md Fixed link for Introduction to Awaitility, from https://www.baeldung.com/awaitlity-testing to https://www.baeldung.com/awaitility-testing --- libraries-testing/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries-testing/README.md b/libraries-testing/README.md index 5498c73094..880c3dd2e6 100644 --- a/libraries-testing/README.md +++ b/libraries-testing/README.md @@ -8,7 +8,7 @@ This module contains articles about test libraries. - [Introduction to JSONassert](https://www.baeldung.com/jsonassert) - [Serenity BDD and Screenplay](https://www.baeldung.com/serenity-screenplay) - [Serenity BDD with Spring and JBehave](https://www.baeldung.com/serenity-spring-jbehave) -- [Introduction to Awaitility](https://www.baeldung.com/awaitlity-testing) +- [Introduction to Awaitility](https://www.baeldung.com/awaitility-testing) - [Introduction to Hoverfly in Java](https://www.baeldung.com/hoverfly) - [Testing with Hamcrest](https://www.baeldung.com/java-junit-hamcrest-guide) - [Introduction To DBUnit](https://www.baeldung.com/java-dbunit) From 20b50e8bea8f6966ec507e6c0444204464c4fcce Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Sun, 6 Mar 2022 12:54:13 +0500 Subject: [PATCH 10/27] Updated README.md For Enabling Logging for Apache HttpClient, Correct URL from https://www.baeldung.com/java-httpclient-enable-logging to https://www.baeldung.com/apache-httpclient-enable-logging --- httpclient-2/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/httpclient-2/README.md b/httpclient-2/README.md index 7c2d5862bd..4f9805063c 100644 --- a/httpclient-2/README.md +++ b/httpclient-2/README.md @@ -11,5 +11,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [How to Set TLS Version in Apache HttpClient](https://www.baeldung.com/apache-httpclient-tls) - [Reading an HTTP Response Body as a String in Java](https://www.baeldung.com/java-http-response-body-as-string) - [How To Get Cookies From the Apache HttpClient Response](https://www.baeldung.com/java-apache-httpclient-cookies) -- [Enabling Logging for Apache HttpClient](https://www.baeldung.com/java-httpclient-enable-logging) +- [Enabling Logging for Apache HttpClient](https://www.baeldung.com/apache-httpclient-enable-logging) - More articles: [[<-- prev]](../httpclient) From 612bb329e572003a08d1cc028e3fc0ff8a87730d Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Sun, 6 Mar 2022 13:04:52 +0500 Subject: [PATCH 11/27] Updated README.md For Adding Parameters to HttpClient Requests, corrected link from https://www.baeldung.com/java-httpclient-parameters to https://www.baeldung.com/apache-httpclient-parameters --- httpclient-simple/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/httpclient-simple/README.md b/httpclient-simple/README.md index 93fb22ac1e..8875af1ea0 100644 --- a/httpclient-simple/README.md +++ b/httpclient-simple/README.md @@ -11,7 +11,7 @@ This module contains articles about HTTPClient that are part of the HTTPClient E - [Custom HTTP Header with the HttpClient](https://www.baeldung.com/httpclient-custom-http-header) - [HttpClient Basic Authentication](https://www.baeldung.com/httpclient-4-basic-authentication) - [Posting with HttpClient](https://www.baeldung.com/httpclient-post-http-request) -- [Adding Parameters to HttpClient Requests](https://www.baeldung.com/java-httpclient-parameters) +- [Adding Parameters to HttpClient Requests](https://www.baeldung.com/apache-httpclient-parameters) ### Running the Tests From 3fbad0691d0276daa18c613c30e970c64b0b98ab Mon Sep 17 00:00:00 2001 From: alemoles Date: Mon, 7 Mar 2022 01:34:14 -0500 Subject: [PATCH 12/27] BAEL-5418 - Convert long to int type in Java (#8) (#11895) --- java-numbers-4/pom.xml | 5 +++ .../convertLongToInt/ConvertLongToInt.java | 44 +++++++++++++++++++ .../ConvertLongToIntUnitTest.java | 23 ++++++++++ 3 files changed, 72 insertions(+) create mode 100644 java-numbers-4/src/main/java/com/baeldung/convertLongToInt/ConvertLongToInt.java create mode 100644 java-numbers-4/src/test/java/com/baeldung/convertLongToInt/ConvertLongToIntUnitTest.java diff --git a/java-numbers-4/pom.xml b/java-numbers-4/pom.xml index 9b2e799840..40fe17cc0d 100644 --- a/java-numbers-4/pom.xml +++ b/java-numbers-4/pom.xml @@ -25,6 +25,11 @@ ${commons-lang3.version} test + + com.google.guava + guava + ${guava.version} + diff --git a/java-numbers-4/src/main/java/com/baeldung/convertLongToInt/ConvertLongToInt.java b/java-numbers-4/src/main/java/com/baeldung/convertLongToInt/ConvertLongToInt.java new file mode 100644 index 0000000000..0638505c2d --- /dev/null +++ b/java-numbers-4/src/main/java/com/baeldung/convertLongToInt/ConvertLongToInt.java @@ -0,0 +1,44 @@ +package com.baeldung.convertLongToInt; + +import java.math.BigDecimal; +import java.util.Optional; +import java.util.function.Function; + +import com.google.common.primitives.Ints; + +public class ConvertLongToInt { + + static Function convert = val -> Optional.ofNullable(val) + .map(Long::intValue) + .orElse(null); + + public static int longToIntCast(long number) { + return (int) number; + } + + public static int longToIntJavaWithMath(long number) { + return Math.toIntExact(number); + } + + public static int longToIntJavaWithLambda(long number) { + return convert.apply(number); + } + + public static int longToIntBoxingValues(long number) { + return Long.valueOf(number) + .intValue(); + } + + public static int longToIntGuava(long number) { + return Ints.checkedCast(number); + } + + public static int longToIntGuavaSaturated(long number) { + return Ints.saturatedCast(number); + } + + public static int longToIntWithBigDecimal(long number) { + return new BigDecimal(number).intValueExact(); + } + +} diff --git a/java-numbers-4/src/test/java/com/baeldung/convertLongToInt/ConvertLongToIntUnitTest.java b/java-numbers-4/src/test/java/com/baeldung/convertLongToInt/ConvertLongToIntUnitTest.java new file mode 100644 index 0000000000..38fa37b664 --- /dev/null +++ b/java-numbers-4/src/test/java/com/baeldung/convertLongToInt/ConvertLongToIntUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.convertLongToInt; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +class ConvertLongToIntUnitTest { + + @Test + void longToInt() { + long number = 186762L; + int expected = 186762; + + assertEquals(expected, ConvertLongToInt.longToIntCast(number)); + assertEquals(expected, ConvertLongToInt.longToIntJavaWithMath(number)); + assertEquals(expected, ConvertLongToInt.longToIntJavaWithLambda(number)); + assertEquals(expected, ConvertLongToInt.longToIntBoxingValues(number)); + assertEquals(expected, ConvertLongToInt.longToIntGuava(number)); + assertEquals(expected, ConvertLongToInt.longToIntGuavaSaturated(number)); + assertEquals(expected, ConvertLongToInt.longToIntWithBigDecimal(number)); + } + +} \ No newline at end of file From 08e84780bfcd9170d5fb207a5de0c6d6328cc16a Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 17:50:33 +0500 Subject: [PATCH 13/27] Updated README.md added link back to the article: https://www.baeldung.com/java-read-file-into-map --- core-java-modules/core-java-io-4/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-io-4/README.md b/core-java-modules/core-java-io-4/README.md index be58338fd8..39b820b3ba 100644 --- a/core-java-modules/core-java-io-4/README.md +++ b/core-java-modules/core-java-io-4/README.md @@ -7,4 +7,5 @@ This module contains articles about core Java input and output (IO) - [Java File Separator vs File Path Separator](https://www.baeldung.com/java-file-vs-file-path-separator) - [Simulate touch Command in Java](https://www.baeldung.com/java-simulate-touch-command) - [SequenceInputStream Class in Java](https://www.baeldung.com/java-sequenceinputstream) +- [Read a File Into a Map in Java](https://www.baeldung.com/java-read-file-into-map) - [[<-- Prev]](/core-java-modules/core-java-io-3) From 6fe59e7aeab0385c05d423b948d46e0ee06412ea Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 17:54:47 +0500 Subject: [PATCH 14/27] Updated README.md added link back to the article: https://www.baeldung.com/java-rock-paper-scissors --- core-java-modules/core-java-8-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md index 12a060ccfe..c0bc63f21f 100644 --- a/core-java-modules/core-java-8-2/README.md +++ b/core-java-modules/core-java-8-2/README.md @@ -9,4 +9,5 @@ This module contains articles about Java 8 core features - [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface) - [Interface With Default Methods vs Abstract Class](https://www.baeldung.com/java-interface-default-method-vs-abstract-class) - [Convert Between Byte Array and UUID in Java](https://www.baeldung.com/java-byte-array-to-uuid) +- [Create a Simple “Rock-Paper-Scissors” Game in Java](https://www.baeldung.com/java-rock-paper-scissors) - [[<-- Prev]](/core-java-modules/core-java-8) From 3f71dcc5c757e3a40dd07c56caddb5df3ca22d8f Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 17:57:11 +0500 Subject: [PATCH 15/27] Updated README.md added link back to the article: https://www.baeldung.com/java-call-graphql-service --- graphql/graphql-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/graphql/graphql-java/README.md b/graphql/graphql-java/README.md index e3fd818400..f37506a9fd 100644 --- a/graphql/graphql-java/README.md +++ b/graphql/graphql-java/README.md @@ -5,3 +5,4 @@ This module contains articles about GraphQL with Java ## Relevant articles: - [Introduction to GraphQL](https://www.baeldung.com/graphql) +- [Make a Call to a GraphQL Service from a Java Application](https://www.baeldung.com/java-call-graphql-service) From b86e50ede4ebaac6d1f1f3bfe6ad5b2e73f3a1c8 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 18:00:52 +0500 Subject: [PATCH 16/27] Updated README.md added link back to the article: https://www.baeldung.com/java-excel-find-last-row --- apache-poi-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-poi-2/README.md b/apache-poi-2/README.md index 2fd0135b11..f55ec7eb6a 100644 --- a/apache-poi-2/README.md +++ b/apache-poi-2/README.md @@ -9,4 +9,5 @@ This module contains articles about Apache POI. - [Numeric Format Using POI](https://www.baeldung.com/apache-poi-numeric-format) - [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi) - [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow) +- [Finding the Last Row in an Excel Spreadsheet From Java](https://www.baeldung.com/java-excel-find-last-row) - More articles: [[<-- prev]](../apache-poi) From dc6357d98eab194031d35ea7664b4bdfcafe1150 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 19:22:54 +0500 Subject: [PATCH 17/27] Updated README.md added link back to the article: https://www.baeldung.com/mongodb-update-multiple-fields --- persistence-modules/java-mongodb/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/java-mongodb/README.md b/persistence-modules/java-mongodb/README.md index fe30c2999e..2b7fcd3de0 100644 --- a/persistence-modules/java-mongodb/README.md +++ b/persistence-modules/java-mongodb/README.md @@ -13,3 +13,4 @@ This module contains articles about MongoDB in Java. - [BSON to JSON Document Conversion in Java](https://www.baeldung.com/java-convert-bson-to-json) - [How to Check Field Existence in MongoDB?](https://www.baeldung.com/mongodb-check-field-exists) - [Get Last Inserted Document ID in MongoDB With Java Driver](https://www.baeldung.com/java-mongodb-last-inserted-id) +- [Update Multiple Fields in a MongoDB Document](https://www.baeldung.com/mongodb-update-multiple-fields) From db95e7bb6ad8ce3528ec2a1e7cef836b70949b53 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 19:27:14 +0500 Subject: [PATCH 18/27] Updated README.md added link back to the article: https://www.baeldung.com/lombok-tostring --- lombok-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/lombok-2/README.md b/lombok-2/README.md index 25d097a7ea..650dc5ddab 100644 --- a/lombok-2/README.md +++ b/lombok-2/README.md @@ -7,4 +7,5 @@ This module contains articles about Project Lombok. - [Using Lombok’s @Accessors Annotation](https://www.baeldung.com/lombok-accessors) - [Declaring Val and Var Variables in Lombok](https://www.baeldung.com/java-lombok-val-var) - [Lombok Using @With Annotations](https://www.baeldung.com/lombok-with-annotations) +- [Lombok's @ToString Annotation](https://www.baeldung.com/lombok-tostring) - More articles: [[<-- prev]](../lombok) From 3d92ca2c4169f0d206d20e8f002f5fc325bf47b3 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 19:31:42 +0500 Subject: [PATCH 19/27] Updated README.md added a link back to the article: https://www.baeldung.com/java-bytebuffer --- core-java-modules/core-java-nio-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-nio-2/README.md b/core-java-modules/core-java-nio-2/README.md index 9152a494d8..c405cb7c77 100644 --- a/core-java-modules/core-java-nio-2/README.md +++ b/core-java-modules/core-java-nio-2/README.md @@ -12,4 +12,5 @@ This module contains articles about core Java non-blocking input and output (IO) - [Java NIO DatagramChannel](https://www.baeldung.com/java-nio-datagramchannel) - [Java – Path vs File](https://www.baeldung.com/java-path-vs-file) - [What Is the Difference Between NIO and NIO.2?](https://www.baeldung.com/java-nio-vs-nio-2) +- [Guide to ByteBuffer](https://www.baeldung.com/java-bytebuffer) - [[<-- Prev]](/core-java-modules/core-java-nio) From 32c7041a18d3a649750c9f851710bd7dfb10b099 Mon Sep 17 00:00:00 2001 From: Asjad J <97493880+Asjad-J@users.noreply.github.com> Date: Mon, 7 Mar 2022 19:35:42 +0500 Subject: [PATCH 20/27] Updated README.md added a link back to the article: https://www.baeldung.com/spring-oauth2resttemplate --- spring-security-modules/spring-5-security-oauth/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-security-modules/spring-5-security-oauth/README.md b/spring-security-modules/spring-5-security-oauth/README.md index 35e64da639..e5b149fee6 100644 --- a/spring-security-modules/spring-5-security-oauth/README.md +++ b/spring-security-modules/spring-5-security-oauth/README.md @@ -8,3 +8,4 @@ This module contains articles about Spring 5 OAuth Security - [Extracting Principal and Authorities using Spring Security OAuth](https://www.baeldung.com/spring-security-oauth-principal-authorities-extractor) - [Customizing Authorization and Token Requests with Spring Security 5.1 Client](https://www.baeldung.com/spring-security-custom-oauth-requests) - [Social Login with Spring Security in a Jersey Application](https://www.baeldung.com/spring-security-social-login-jersey) +- [Introduction to OAuth2RestTemplate](https://www.baeldung.com/spring-oauth2resttemplate) From 0f82785c28f01746abd64065d717e261ed260227 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 7 Mar 2022 15:40:21 +0100 Subject: [PATCH 21/27] JAVA-10334: Disable failing test --- .../spring/statemachine/StateMachineIntegrationTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java index aab07225a3..5909340a82 100644 --- a/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java +++ b/spring-state-machine/src/test/java/com/baeldung/spring/statemachine/StateMachineIntegrationTest.java @@ -3,6 +3,7 @@ package com.baeldung.spring.statemachine; import com.baeldung.spring.statemachine.config.SimpleStateMachineConfiguration; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -36,6 +37,7 @@ public class StateMachineIntegrationTest { assertEquals("S2", stateMachine.getState().getId()); } + @Ignore("Fixing in JAVA-9808") @Test public void whenSimpleStringMachineActionState_thenActionExecuted() { From 53afccfe3a5cfb746e70559d8337b215eb15944b Mon Sep 17 00:00:00 2001 From: Olsi Seferi <72546616+olsiseferi@users.noreply.github.com> Date: Mon, 7 Mar 2022 17:58:13 +0100 Subject: [PATCH 22/27] ADDED FORWARD PROXY CONFIGURATION AND CLIENT (#11708) --- nginx-forward-proxy/forward | 7 + nginx-forward-proxy/package-lock.json | 339 ++++++++++++++++++++++++++ nginx-forward-proxy/package.json | 14 ++ nginx-forward-proxy/proxytest.js | 11 + 4 files changed, 371 insertions(+) create mode 100644 nginx-forward-proxy/forward create mode 100644 nginx-forward-proxy/package-lock.json create mode 100644 nginx-forward-proxy/package.json create mode 100644 nginx-forward-proxy/proxytest.js diff --git a/nginx-forward-proxy/forward b/nginx-forward-proxy/forward new file mode 100644 index 0000000000..4e8ca8b29f --- /dev/null +++ b/nginx-forward-proxy/forward @@ -0,0 +1,7 @@ +server { + listen 8888; + location / { + resolver 8.8.8.8; + proxy_pass http://$http_host$uri$is_args$args; + } +} \ No newline at end of file diff --git a/nginx-forward-proxy/package-lock.json b/nginx-forward-proxy/package-lock.json new file mode 100644 index 0000000000..b70787ec67 --- /dev/null +++ b/nginx-forward-proxy/package-lock.json @@ -0,0 +1,339 @@ +{ + "name": "nginx-forward-proxy", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } + } +} diff --git a/nginx-forward-proxy/package.json b/nginx-forward-proxy/package.json new file mode 100644 index 0000000000..4691542900 --- /dev/null +++ b/nginx-forward-proxy/package.json @@ -0,0 +1,14 @@ +{ + "name": "nginx-forward-proxy", + "version": "1.0.0", + "description": "Simple Client for Connecting to a Forward Proxy", + "main": "proxytest.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Olsi Seferi", + "license": "ISC", + "dependencies": { + "request": "^2.88.2" + } +} diff --git a/nginx-forward-proxy/proxytest.js b/nginx-forward-proxy/proxytest.js new file mode 100644 index 0000000000..dc55ef6620 --- /dev/null +++ b/nginx-forward-proxy/proxytest.js @@ -0,0 +1,11 @@ +var request = require('request'); + +request({ + 'url':'http://www.google.com/', + 'method': "GET", + 'proxy':'http://192.168.100.40:8888' +},function (error, response, body) { + if (!error && response.statusCode == 200) { + console.log(body); + } +}) From 2859935089915c46036c7d27b29c6913a2efe156 Mon Sep 17 00:00:00 2001 From: Haroon Khan Date: Mon, 7 Mar 2022 16:32:43 +0000 Subject: [PATCH 23/27] [JAVA-10463] Split apache-poi module --- apache-poi-2/README.md | 1 + apache-poi-2/pom.xml | 2 +- .../poi/excel/setformula/ExcelFormula.java | 51 ++++--- .../poi/excel/setformula/SetFormulaTest.xlsx | Bin .../setformula/ExcelFormulaUnitTest.java | 11 +- apache-poi/README.md | 1 - .../baeldung/poi/excel/ExcelUtility.java.orig | 128 ------------------ .../poi/excel/ExcelUtilityUnitTest.java.orig | 112 --------------- 8 files changed, 33 insertions(+), 273 deletions(-) rename {apache-poi => apache-poi-2}/src/main/java/com/baeldung/poi/excel/setformula/ExcelFormula.java (88%) rename {apache-poi => apache-poi-2}/src/main/resources/com/baeldung/poi/excel/setformula/SetFormulaTest.xlsx (100%) rename {apache-poi => apache-poi-2}/src/test/java/com/baeldung/poi/excel/setformula/ExcelFormulaUnitTest.java (85%) delete mode 100644 apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java.orig delete mode 100644 apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java.orig diff --git a/apache-poi-2/README.md b/apache-poi-2/README.md index f55ec7eb6a..2c0deec575 100644 --- a/apache-poi-2/README.md +++ b/apache-poi-2/README.md @@ -10,4 +10,5 @@ This module contains articles about Apache POI. - [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi) - [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow) - [Finding the Last Row in an Excel Spreadsheet From Java](https://www.baeldung.com/java-excel-find-last-row) +- [Setting Formulas in Excel with Apache POI](https://www.baeldung.com/java-apache-poi-set-formulas) - More articles: [[<-- prev]](../apache-poi) diff --git a/apache-poi-2/pom.xml b/apache-poi-2/pom.xml index a46365c63c..30270cd7be 100644 --- a/apache-poi-2/pom.xml +++ b/apache-poi-2/pom.xml @@ -22,7 +22,7 @@ - 5.0.0 + 5.2.0 diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/setformula/ExcelFormula.java b/apache-poi-2/src/main/java/com/baeldung/poi/excel/setformula/ExcelFormula.java similarity index 88% rename from apache-poi/src/main/java/com/baeldung/poi/excel/setformula/ExcelFormula.java rename to apache-poi-2/src/main/java/com/baeldung/poi/excel/setformula/ExcelFormula.java index f5179b19c9..ccff1fa709 100644 --- a/apache-poi/src/main/java/com/baeldung/poi/excel/setformula/ExcelFormula.java +++ b/apache-poi-2/src/main/java/com/baeldung/poi/excel/setformula/ExcelFormula.java @@ -1,26 +1,25 @@ -package com.baeldung.poi.excel.setformula; - -import org.apache.poi.xssf.usermodel.XSSFCell; -import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - -public class ExcelFormula { - public double setFormula(String fileLocation, XSSFWorkbook wb, String formula) throws IOException { - XSSFSheet sheet = wb.getSheetAt(0); - int lastCellNum = sheet.getRow(0).getLastCellNum(); - XSSFCell formulaCell = sheet.getRow(0).createCell(lastCellNum); - formulaCell.setCellFormula(formula); - XSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator(); - formulaEvaluator.evaluateFormulaCell(formulaCell); - FileOutputStream fileOut = new FileOutputStream(new File(fileLocation)); - wb.write(fileOut); - wb.close(); - fileOut.close(); - return formulaCell.getNumericCellValue(); - } -} +package com.baeldung.poi.excel.setformula; + +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.FileOutputStream; +import java.io.IOException; + +public class ExcelFormula { + public double setFormula(String fileLocation, XSSFWorkbook wb, String formula) throws IOException { + XSSFSheet sheet = wb.getSheetAt(0); + int lastCellNum = sheet.getRow(0).getLastCellNum(); + XSSFCell formulaCell = sheet.getRow(0).createCell(lastCellNum); + formulaCell.setCellFormula(formula); + XSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator(); + formulaEvaluator.evaluateFormulaCell(formulaCell); + FileOutputStream fileOut = new FileOutputStream(fileLocation); + wb.write(fileOut); + wb.close(); + fileOut.close(); + return formulaCell.getNumericCellValue(); + } +} diff --git a/apache-poi/src/main/resources/com/baeldung/poi/excel/setformula/SetFormulaTest.xlsx b/apache-poi-2/src/main/resources/com/baeldung/poi/excel/setformula/SetFormulaTest.xlsx similarity index 100% rename from apache-poi/src/main/resources/com/baeldung/poi/excel/setformula/SetFormulaTest.xlsx rename to apache-poi-2/src/main/resources/com/baeldung/poi/excel/setformula/SetFormulaTest.xlsx diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/setformula/ExcelFormulaUnitTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/excel/setformula/ExcelFormulaUnitTest.java similarity index 85% rename from apache-poi/src/test/java/com/baeldung/poi/excel/setformula/ExcelFormulaUnitTest.java rename to apache-poi-2/src/test/java/com/baeldung/poi/excel/setformula/ExcelFormulaUnitTest.java index fa5baa37fa..7a0f15b3f7 100644 --- a/apache-poi/src/test/java/com/baeldung/poi/excel/setformula/ExcelFormulaUnitTest.java +++ b/apache-poi-2/src/test/java/com/baeldung/poi/excel/setformula/ExcelFormulaUnitTest.java @@ -3,18 +3,19 @@ package com.baeldung.poi.excel.setformula; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; -import org.junit.Assert; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Paths; +import static org.junit.jupiter.api.Assertions.assertEquals; + class ExcelFormulaUnitTest { - private static String FILE_NAME = "com/baeldung/poi/excel/setformula/SetFormulaTest.xlsx"; + private static final String FILE_NAME = "com/baeldung/poi/excel/setformula/SetFormulaTest.xlsx"; + private String fileLocation; private ExcelFormula excelFormula; @@ -26,7 +27,7 @@ class ExcelFormulaUnitTest { @Test void givenExcelData_whenSetFormula_thenSuccess() throws IOException { - FileInputStream inputStream = new FileInputStream(new File(fileLocation)); + FileInputStream inputStream = new FileInputStream(fileLocation); XSSFWorkbook wb = new XSSFWorkbook(inputStream); XSSFSheet sheet = wb.getSheetAt(0); double resultColumnA = 0; @@ -46,6 +47,6 @@ class ExcelFormulaUnitTest { double resultValue = excelFormula.setFormula(fileLocation, wb, sumFormulaForColumnA + "-" + sumFormulaForColumnB); - Assert.assertEquals(resultColumnA - resultColumnB, resultValue, 0d); + assertEquals(resultColumnA - resultColumnB, resultValue, 0d); } } diff --git a/apache-poi/README.md b/apache-poi/README.md index ed30d9a4f3..9edf69d67c 100644 --- a/apache-poi/README.md +++ b/apache-poi/README.md @@ -8,7 +8,6 @@ This module contains articles about Apache POI. - [Merge Cells in Excel Using Apache POI](https://www.baeldung.com/java-apache-poi-merge-cells) - [Get String Value of Excel Cell with Apache POI](https://www.baeldung.com/java-apache-poi-cell-string-value) - [Read Excel Cell Value Rather Than Formula With Apache POI](https://www.baeldung.com/apache-poi-read-cell-value-formula) -- [Setting Formulas in Excel with Apache POI](https://www.baeldung.com/java-apache-poi-set-formulas) - [Insert a Row in Excel Using Apache POI](https://www.baeldung.com/apache-poi-insert-excel-row) - [Multiline Text in Excel Cell Using Apache POI](https://www.baeldung.com/apache-poi-write-multiline-text) - [Set Background Color of a Cell with Apache POI](https://www.baeldung.com/apache-poi-background-color) diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java.orig b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java.orig deleted file mode 100644 index c058f3abcf..0000000000 --- a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java.orig +++ /dev/null @@ -1,128 +0,0 @@ -package com.baeldung.poi.excel; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; - -import org.apache.poi.ss.usermodel.Cell; -import org.apache.poi.ss.usermodel.CellType; -import org.apache.poi.ss.usermodel.DateUtil; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.ss.usermodel.Workbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; - -public class ExcelUtility { -<<<<<<< HEAD - private static final String ENDLINE = System.getProperty("line.separator"); - - public static String readExcel(String filePath) throws IOException { - File file = new File(filePath); - FileInputStream inputStream = null; - StringBuilder toReturn = new StringBuilder(); - try { - inputStream = new FileInputStream(file); - Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream); - for (Sheet sheet : baeuldungWorkBook) { - toReturn.append("--------------------------------------------------------------------") - .append(ENDLINE); - toReturn.append("Worksheet :") - .append(sheet.getSheetName()) - .append(ENDLINE); - toReturn.append("--------------------------------------------------------------------") - .append(ENDLINE); - int firstRow = sheet.getFirstRowNum(); - int lastRow = sheet.getLastRowNum(); - for (int index = firstRow + 1; index <= lastRow; index++) { - Row row = sheet.getRow(index); - toReturn.append("|| "); - for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) { - Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); - printCellValue(cell, toReturn); - } - toReturn.append(" ||") - .append(ENDLINE); - } - } - inputStream.close(); - - } catch (IOException e) { - throw e; - } - return toReturn.toString(); - } - - public static void printCellValue(Cell cell, StringBuilder toReturn) { - CellType cellType = cell.getCellType() - .equals(CellType.FORMULA) ? cell.getCachedFormulaResultType() : cell.getCellType(); - if (cellType.equals(CellType.STRING)) { - toReturn.append(cell.getStringCellValue()) - .append(" | "); - } - if (cellType.equals(CellType.NUMERIC)) { - if (DateUtil.isCellDateFormatted(cell)) { - toReturn.append(cell.getDateCellValue()) - .append(" | "); - } else { - toReturn.append(cell.getNumericCellValue()) - .append(" | "); - } - } - if (cellType.equals(CellType.BOOLEAN)) { - toReturn.append(cell.getBooleanCellValue()) - .append(" | "); - } - } -======= - private static final String ENDLINE = System.getProperty("line.separator"); - - public static String readExcel(String filePath) throws IOException { - File file = new File(filePath); - FileInputStream inputStream = null; - StringBuilder toReturn = new StringBuilder(); - try { - inputStream = new FileInputStream(file); - Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream); - for (Sheet sheet : baeuldungWorkBook) { - toReturn.append("--------------------------------------------------------------------").append(ENDLINE); - toReturn.append("Worksheet :").append(sheet.getSheetName()).append(ENDLINE); - toReturn.append("--------------------------------------------------------------------").append(ENDLINE); - int firstRow = sheet.getFirstRowNum(); - int lastRow = sheet.getLastRowNum(); - for (int index = firstRow + 1; index <= lastRow; index++) { - Row row = sheet.getRow(index); - toReturn.append("|| "); - for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) { - Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); - printCellValue(cell, toReturn); - } - toReturn.append(" ||").append(ENDLINE); - } - } - inputStream.close(); - - } catch (IOException e) { - throw e; - } - return toReturn.toString(); - } - - public static void printCellValue(Cell cell, StringBuilder toReturn) { - CellType cellType = cell.getCellType().equals(CellType.FORMULA) ? cell.getCachedFormulaResultType() - : cell.getCellType(); - if (cellType.equals(CellType.STRING)) { - toReturn.append(cell.getStringCellValue()).append(" | "); - } - if (cellType.equals(CellType.NUMERIC)) { - if (DateUtil.isCellDateFormatted(cell)) { - toReturn.append(cell.getDateCellValue()).append(" | "); - } else { - toReturn.append(cell.getNumericCellValue()).append(" | "); - } - } - if (cellType.equals(CellType.BOOLEAN)) { - toReturn.append(cell.getBooleanCellValue()).append(" | "); - } - } ->>>>>>> master -} \ No newline at end of file diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java.orig b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java.orig deleted file mode 100644 index cfc3062b5a..0000000000 --- a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java.orig +++ /dev/null @@ -1,112 +0,0 @@ -package com.baeldung.poi.excel; - -import static org.junit.Assert.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Paths; -import java.text.ParseException; -import java.text.SimpleDateFormat; - -import org.junit.Before; -import org.junit.Test; - -public class ExcelUtilityUnitTest { -<<<<<<< HEAD - private static final String FILE_NAME = "baeldung.xlsx"; - private String fileLocation; - private static final String ENDLINE = System.getProperty("line.separator"); - private StringBuilder output; - - @Before - public void setupUnitTest() throws IOException, URISyntaxException, ParseException { - output = new StringBuilder(); - output.append("--------------------------------------------------------------------") - .append(ENDLINE); - output.append("Worksheet :Sheet1") - .append(ENDLINE); - output.append("--------------------------------------------------------------------") - .append(ENDLINE); - output.append("|| Name1 | Surname1 | 3.55696564113E11 | ") - .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021") - .toString()) - .append(" | ‡ | ||") - .append(ENDLINE); - output.append("|| Name2 | Surname2 | 5.646513512E9 | ") - .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/12/2021") - .toString()) - .append(" | false | ||") - .append(ENDLINE); - output.append("|| Name3 | Surname3 | 3.55696564113E11 | ") - .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021") - .toString()) - .append(" | 7.17039641738E11 | ||") - .append(ENDLINE); - output.append("--------------------------------------------------------------------") - .append(ENDLINE); - output.append("Worksheet :Sheet2") - .append(ENDLINE); - output.append("--------------------------------------------------------------------") - .append(ENDLINE); - output.append("|| Name4 | Surname4 | 3.55675623232E11 | 13/04/2021 | ||") - .append(ENDLINE); - - fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME) - .toURI()) - .toString(); - } - - @Test - public void givenStringPath_whenReadExcel_thenReturnStringValue() throws IOException { - assertEquals(output.toString(), ExcelUtility.readExcel(fileLocation)); - - } - - @Test - public void givenStringPath_whenReadExcel_thenThrowException() { - assertThrows(IOException.class, () -> { - ExcelUtility.readExcel("baeldung"); - }); - } -======= - private static final String FILE_NAME = "baeldung.xlsx"; - private String fileLocation; - private static final String ENDLINE = System.getProperty("line.separator"); - private StringBuilder output; - - @Before - public void setupUnitTest() throws IOException, URISyntaxException, ParseException { - output = new StringBuilder(); - output.append("--------------------------------------------------------------------").append(ENDLINE); - output.append("Worksheet :Sheet1").append(ENDLINE); - output.append("--------------------------------------------------------------------").append(ENDLINE); - output.append("|| Name1 | Surname1 | 3.55696564113E11 | ").append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021").toString()).append(" | ‡ | ||") - .append(ENDLINE); - output.append("|| Name2 | Surname2 | 5.646513512E9 | ").append(new SimpleDateFormat("dd/MM/yyyy").parse("4/12/2021").toString()).append(" | false | ||") - .append(ENDLINE); - output.append("|| Name3 | Surname3 | 3.55696564113E11 | ").append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021").toString()).append(" | 7.17039641738E11 | ||") - .append(ENDLINE); - output.append("--------------------------------------------------------------------").append(ENDLINE); - output.append("Worksheet :Sheet2").append(ENDLINE); - output.append("--------------------------------------------------------------------").append(ENDLINE); - output.append("|| Name4 | Surname4 | 3.55675623232E11 | 13/04/2021 | ||").append(ENDLINE); - - fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString(); - } - - @Test - public void givenStringPath_whenReadExcel_thenReturnStringValue() throws IOException { - assertEquals(output.toString(), ExcelUtility.readExcel(fileLocation)); - - } - - @Test - public void givenStringPath_whenReadExcel_thenThrowException() { - assertThrows(IOException.class, () -> { - ExcelUtility.readExcel("baeldung"); - }); - } ->>>>>>> master - -} From c1751dc317e3a363611c5a9306a7521cc9b1ad2a Mon Sep 17 00:00:00 2001 From: Kapil Khandelwal Date: Wed, 9 Mar 2022 02:19:19 +0530 Subject: [PATCH 24/27] BAEL-5360: Check Collection Existence in MongoDB (#11905) * BAEL-5360: Check Collection Existence in MongoDB * BAEL-5360: update test names using the bdd scheme --- .../baeldung/mongo/CollectionExistence.java | 100 ++++++++++++++++++ .../mongo/CollectionExistenceLiveTest.java | 98 +++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java create mode 100644 persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java new file mode 100644 index 0000000000..074913af4e --- /dev/null +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/CollectionExistence.java @@ -0,0 +1,100 @@ +package com.baeldung.mongo; + +import java.util.ArrayList; + +import org.bson.Document; + +import com.mongodb.DB; +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; + +public class CollectionExistence { + + private static MongoClient mongoClient; + + private static String testCollectionName; + private static String databaseName; + + public static void setUp() { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + } + databaseName = "baeldung"; + testCollectionName = "student"; + } + + public static void collectionExistsSolution() { + + DB db = mongoClient.getDB(databaseName); + + System.out.println("collectionName " + testCollectionName + db.collectionExists(testCollectionName)); + + } + + public static void createCollectionSolution() { + + MongoDatabase database = mongoClient.getDatabase(databaseName); + + try { + database.createCollection(testCollectionName); + + } catch (Exception exception) { + System.err.println("Collection already Exists"); + } + + } + + public static void listCollectionNamesSolution() { + + MongoDatabase database = mongoClient.getDatabase(databaseName); + boolean collectionExists = database.listCollectionNames() + .into(new ArrayList()) + .contains(testCollectionName); + + System.out.println("collectionExists:- " + collectionExists); + + } + + public static void countSolution() { + + MongoDatabase database = mongoClient.getDatabase(databaseName); + + MongoCollection collection = database.getCollection(testCollectionName); + + System.out.println(collection.count()); + + } + + public static void main(String args[]) { + + // + // Connect to cluster (default is localhost:27017) + // + setUp(); + + // + // Check the db existence using DB class's method + // + collectionExistsSolution(); + + // + // Check the db existence using the createCollection method of MongoDatabase class + // + createCollectionSolution(); + + // + // Check the db existence using the listCollectionNames method of MongoDatabase class + // + listCollectionNamesSolution(); + + // + // Check the db existence using the count method of MongoDatabase class + // + countSolution(); + + } + +} + + diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java new file mode 100644 index 0000000000..ad839d1219 --- /dev/null +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/mongo/CollectionExistenceLiveTest.java @@ -0,0 +1,98 @@ +package com.baeldung.mongo; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; + +import org.bson.Document; +import org.junit.Before; +import org.junit.Test; + +import com.mongodb.DB; +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; + +public class CollectionExistenceLiveTest { + + private MongoClient mongoClient; + private String testCollectionName; + private String databaseName; + + @Before + public void setup() { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + databaseName = "baeldung"; + testCollectionName = "student"; + + // Create a new collection if it doesn't exists. + try { + MongoDatabase database = mongoClient.getDatabase(databaseName); + database.createCollection(testCollectionName); + + } catch (Exception exception) { + + System.out.println("Collection already Exists"); + } + + } + } + + @Test + public void givenCreateCollection_whenCollectionAlreadyExists_thenCheckingForCollectionExistence() { + + MongoDatabase database = mongoClient.getDatabase(databaseName); + Boolean collectionStatus = false; + Boolean expectedStatus = true; + + try { + database.createCollection(testCollectionName); + + } catch (Exception exception) { + collectionStatus = true; + System.err.println("Collection already Exists"); + } + + assertEquals(expectedStatus, collectionStatus); + + } + + @Test + public void givenCollectionExists_whenCollectionAlreadyExists_thenCheckingForCollectionExistence() { + + DB db = mongoClient.getDB(databaseName); + Boolean collectionStatus = db.collectionExists(testCollectionName); + + Boolean expectedStatus = true; + assertEquals(expectedStatus, collectionStatus); + + } + + @Test + public void givenListCollectionNames_whenCollectionAlreadyExists_thenCheckingForCollectionExistence() { + + MongoDatabase database = mongoClient.getDatabase(databaseName); + boolean collectionExists = database.listCollectionNames() + .into(new ArrayList()) + .contains(testCollectionName); + + Boolean expectedStatus = true; + assertEquals(expectedStatus, collectionExists); + + } + + @Test + public void givenCount_whenCollectionAlreadyExists_thenCheckingForCollectionExistence() { + + MongoDatabase database = mongoClient.getDatabase(databaseName); + + MongoCollection collection = database.getCollection(testCollectionName); + Boolean collectionExists = collection.count() > 0 ? true : false; + + Boolean expectedStatus = false; + assertEquals(expectedStatus, collectionExists); + + } +} + From c1d1134fb362fa4d61939a0834e48e92cf7db19c Mon Sep 17 00:00:00 2001 From: ACHRAF TAITAI <43656331+achraftt@users.noreply.github.com> Date: Tue, 8 Mar 2022 21:52:10 +0100 Subject: [PATCH 25/27] BAEL-4569: Formatting Email Text (#11910) --- .../src/main/java/com/baeldung/mail/EmailService.java | 5 +++++ .../java/com/baeldung/mail/EmailServiceLiveTest.java | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java index 3d1e25e7a4..3e40cf53f7 100644 --- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java @@ -67,12 +67,17 @@ public class EmailService { MimeBodyPart mimeBodyPart = new MimeBodyPart(); mimeBodyPart.setContent(msg, "text/html; charset=utf-8"); + String msgStyled = "This is my bold-red email using JavaMailer"; + MimeBodyPart mimeBodyPartWithStyledText = new MimeBodyPart(); + mimeBodyPartWithStyledText.setContent(msgStyled, "text/html; charset=utf-8"); + MimeBodyPart attachmentBodyPart = new MimeBodyPart(); attachmentBodyPart.attachFile(getFile()); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(mimeBodyPart); + multipart.addBodyPart(mimeBodyPartWithStyledText); multipart.addBodyPart(attachmentBodyPart); message.setContent(multipart); diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java index 7f543bc612..cec4cfcb55 100644 --- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java @@ -36,6 +36,7 @@ public class EmailServiceLiveTest { MimeMessage receivedMessage = receivedMessages[0]; assertEquals("Mail Subject", subjectFromMessage(receivedMessage)); assertEquals("This is my first email using JavaMailer", emailTextFrom(receivedMessage)); + assertEquals("This is my bold-red email using JavaMailer", emailStyledTextFrom(receivedMessage)); assertEquals("sample attachment content", attachmentContentsFrom(receivedMessage)); } @@ -50,9 +51,16 @@ public class EmailServiceLiveTest { .toString(); } + private static String emailStyledTextFrom(MimeMessage receivedMessage) throws IOException, MessagingException { + return ((MimeMultipart) receivedMessage.getContent()) + .getBodyPart(1) + .getContent() + .toString(); + } + private static String attachmentContentsFrom(MimeMessage receivedMessage) throws Exception { return ((MimeMultipart) receivedMessage.getContent()) - .getBodyPart(1) + .getBodyPart(2) .getContent() .toString(); } From 410ccd500b20498c73f384a4569ea92c10dba85d Mon Sep 17 00:00:00 2001 From: kwoyke Date: Wed, 9 Mar 2022 18:08:22 +0100 Subject: [PATCH 26/27] JAVA-10399: Fix assertion to include start date (#11893) --- .../src/test/java/com/baeldung/random/RandomDatesUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java index 6005cf93c2..68b4fd4938 100644 --- a/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java +++ b/core-java-modules/core-java-8-datetime-2/src/test/java/com/baeldung/random/RandomDatesUnitTest.java @@ -22,6 +22,6 @@ class RandomDatesUnitTest { LocalDate end = LocalDate.now(); LocalDate random = RandomDates.between(start, end); - assertThat(random).isAfter(start).isBefore(end); + assertThat(random).isAfterOrEqualTo(start).isBefore(end); } } From f0f014b99cce3f6e144f832f7e9edd66e0556402 Mon Sep 17 00:00:00 2001 From: Bhaskara Date: Thu, 10 Mar 2022 03:31:39 +0530 Subject: [PATCH 27/27] Added code for BAEL-1355 (#11908) * Added code for BAEL-1355 * Formatted the code * Added jakarta-ee to parent pom Co-authored-by: Bhaskara Navuluri --- jakarta-ee/pom.xml | 111 +++++++++++++++++ .../java/com/baeldung/eclipse/krazo/User.java | 84 +++++++++++++ .../eclipse/krazo/UserApplication.java | 11 ++ .../eclipse/krazo/UserController.java | 85 +++++++++++++ jakarta-ee/src/main/webapp/WEB-INF/beans.xml | 6 + .../src/main/webapp/WEB-INF/views/success.jsp | 47 +++++++ .../src/main/webapp/WEB-INF/views/user.jsp | 89 ++++++++++++++ jakarta-ee/src/main/webapp/styles.css | 28 +++++ .../com/baeldung/eclipse/krazo/AppTest.java | 16 +++ .../eclipse/krazo/UserControllerUnitTest.java | 116 ++++++++++++++++++ pom.xml | 86 ++++++------- 11 files changed, 637 insertions(+), 42 deletions(-) create mode 100644 jakarta-ee/pom.xml create mode 100644 jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/User.java create mode 100644 jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserApplication.java create mode 100644 jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserController.java create mode 100644 jakarta-ee/src/main/webapp/WEB-INF/beans.xml create mode 100644 jakarta-ee/src/main/webapp/WEB-INF/views/success.jsp create mode 100644 jakarta-ee/src/main/webapp/WEB-INF/views/user.jsp create mode 100644 jakarta-ee/src/main/webapp/styles.css create mode 100644 jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppTest.java create mode 100644 jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/UserControllerUnitTest.java diff --git a/jakarta-ee/pom.xml b/jakarta-ee/pom.xml new file mode 100644 index 0000000000..074ca1eec8 --- /dev/null +++ b/jakarta-ee/pom.xml @@ -0,0 +1,111 @@ + + 4.0.0 + + com.baeldung + mvc-2.0 + 1.0-SNAPSHOT + war + + mvc-2.0 + + + 9.0.0 + 2.0.0 + 2.0.0 + 5.8.2 + C:/glassfish6 + admin + mvn-domain + 1.10.19 + + ${local.glassfish.home}\\domains\\${local.glassfish.domain}\\config\\domain-passwords + + + + + + jakarta.platform + jakarta.jakartaee-web-api + ${jakartaee-api.version} + provided + + + + jakarta.mvc + jakarta.mvc-api + ${jakarta.mvc-api.version} + + + + org.eclipse.krazo + krazo-jersey + ${krazo.version} + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + + + org.mockito + mockito-all + ${mockito.version} + test + + + + + + mvc-2.0 + + + org.glassfish.maven.plugin + maven-glassfish-plugin + 2.1 + + ${local.glassfish.home} + admin + + password + + + ${local.glassfish.domain} + 8080 + 4848 + + + + + ${project.artifactId} + target/${project.build.finalName}.war + + + + true + false + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-war-plugin + + false + + + + + diff --git a/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/User.java b/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/User.java new file mode 100644 index 0000000000..a2253b6aa6 --- /dev/null +++ b/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/User.java @@ -0,0 +1,84 @@ +package com.baeldung.eclipse.krazo; + +import jakarta.enterprise.context.RequestScoped; +import jakarta.inject.Named; +import jakarta.mvc.RedirectScoped; +import jakarta.mvc.binding.MvcBinding; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; +import jakarta.validation.constraints.Size; +import jakarta.ws.rs.FormParam; + +import java.io.Serializable; + +@Named("user") +@RedirectScoped +public class User implements Serializable { + @MvcBinding + @Null + private String id; + + @MvcBinding + @NotNull + @Size(min = 1, message = "Name cannot be blank") + @FormParam("name") + private String name; + + @MvcBinding + @Min(value = 18, message = "The minimum age of the user should be 18 years") + @FormParam("age") + private int age; + + @MvcBinding + @Email(message = "The email cannot be blank and should be in a valid format") + @Size(min=3, message = "Email cannot be empty") + @FormParam("email") + private String email; + + @MvcBinding + @Null + @FormParam("phone") + private String phone; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +} diff --git a/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserApplication.java b/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserApplication.java new file mode 100644 index 0000000000..5a272806cb --- /dev/null +++ b/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.eclipse.krazo; + +import jakarta.ws.rs.ApplicationPath; +import jakarta.ws.rs.core.Application; + +/** + * Default JAX-RS application listening on /app + */ +@ApplicationPath("/app") +public class UserApplication extends Application { +} diff --git a/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserController.java b/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserController.java new file mode 100644 index 0000000000..92ddf73571 --- /dev/null +++ b/jakarta-ee/src/main/java/com/baeldung/eclipse/krazo/UserController.java @@ -0,0 +1,85 @@ +package com.baeldung.eclipse.krazo; + +import jakarta.inject.Inject; +import jakarta.mvc.Controller; +import jakarta.mvc.Models; +import jakarta.mvc.binding.BindingResult; +import jakarta.mvc.security.CsrfProtected; +import jakarta.validation.Valid; +import jakarta.ws.rs.BeanParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +/** + * The class contains two controllers and a REST API + */ +@Path("users") +public class UserController { + @Inject + private BindingResult bindingResult; + + private static final List users = new ArrayList<>(); + + @Inject + private Models models; + + /** + * This is a controller. It displays a initial form to the user. + * @return The view name + */ + @GET + @Controller + public String showForm() { + return "user.jsp"; + } + + /** + * The method handles the form submits + * Handles HTTP POST and is CSRF protected. The client invoking this controller should provide a CSRF token. + * @param user The user details that has to be stored + * @return Returns a view name + */ + @POST + @Controller + @CsrfProtected + public String saveUser(@Valid @BeanParam User user) { + if (bindingResult.isFailed()) { + models.put("errors", bindingResult.getAllErrors()); + return "user.jsp"; + } + String id = UUID.randomUUID().toString(); + user.setId(id); + users.add(user); + return "redirect:users/success"; + } + + /** + * Handles a redirect view + * @return The view name + */ + @GET + @Controller + @Path("success") + public String saveUserSuccess() { + return "success.jsp"; + } + + /** + * The REST API that returns all the user details in the JSON format + * @return The list of users that are saved. The List is converted into Json Array. + * If no user is present a empty array is returned + */ + @GET + @Produces(MediaType.APPLICATION_JSON) + public List getUsers() { + return users; + } + +} diff --git a/jakarta-ee/src/main/webapp/WEB-INF/beans.xml b/jakarta-ee/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 0000000000..d068fbd3e4 --- /dev/null +++ b/jakarta-ee/src/main/webapp/WEB-INF/beans.xml @@ -0,0 +1,6 @@ + + + diff --git a/jakarta-ee/src/main/webapp/WEB-INF/views/success.jsp b/jakarta-ee/src/main/webapp/WEB-INF/views/success.jsp new file mode 100644 index 0000000000..19d45e46ba --- /dev/null +++ b/jakarta-ee/src/main/webapp/WEB-INF/views/success.jsp @@ -0,0 +1,47 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + MVC 2.0 + + + + + + + + + + +
+
+
+
+ +
+

User created successfully!

+
+
+ +
+ +
+
+ + + + + + \ No newline at end of file diff --git a/jakarta-ee/src/main/webapp/WEB-INF/views/user.jsp b/jakarta-ee/src/main/webapp/WEB-INF/views/user.jsp new file mode 100644 index 0000000000..a36655950d --- /dev/null +++ b/jakarta-ee/src/main/webapp/WEB-INF/views/user.jsp @@ -0,0 +1,89 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + MVC 2.0 + + + + + + + + + + +
+
+
+

+ User Details +

+
+ + + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+
+ + +
+ +
+ +
+
+ + + + + + \ No newline at end of file diff --git a/jakarta-ee/src/main/webapp/styles.css b/jakarta-ee/src/main/webapp/styles.css new file mode 100644 index 0000000000..9cc9e62f12 --- /dev/null +++ b/jakarta-ee/src/main/webapp/styles.css @@ -0,0 +1,28 @@ +body, html { + font-family: Raleway, serif; + font-weight: 300; +} + +.bg-dark { + background-color: #63b175 !important; + font-weight: 600 !important; +} + +body { + padding-top: 80px; +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } +} + +label { + font-weight: bold; +} + +.hr-dark { + border-top: 2px solid #000; + margin-bottom: 20px; +} \ No newline at end of file diff --git a/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppTest.java b/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppTest.java new file mode 100644 index 0000000000..6934d1fca2 --- /dev/null +++ b/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/AppTest.java @@ -0,0 +1,16 @@ +package com.baeldung.eclipse.krazo; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Dummy Test + */ +public class AppTest { + + @Test + public void test() { + assertTrue(true); + } +} diff --git a/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/UserControllerUnitTest.java b/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/UserControllerUnitTest.java new file mode 100644 index 0000000000..5e79924ed7 --- /dev/null +++ b/jakarta-ee/src/test/java/com/baeldung/eclipse/krazo/UserControllerUnitTest.java @@ -0,0 +1,116 @@ +package com.baeldung.eclipse.krazo; + +import com.baeldung.eclipse.krazo.User; +import com.baeldung.eclipse.krazo.UserController; +import jakarta.mvc.Models; +import jakarta.mvc.binding.BindingResult; +import org.eclipse.krazo.core.ModelsImpl; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.when; + +/** + * The class contains unit tests. We do only unit tests. Most of the classes are mocked + */ +@DisplayName("Eclipse Krazo MVC 2.0 Test Suite") +class UserControllerUnitTest { + + @InjectMocks + UserController userController = new UserController(); + + @Mock + Models models; + + @Mock + BindingResult bindingResult; + + @BeforeEach + public void setUpClass() { + MockitoAnnotations.initMocks(this); + } + + @Test + @DisplayName("Test Show Form") + void whenShowForm_thenReturnViewName() { + assertNotNull(userController.showForm()); + assertEquals("user.jsp", userController.showForm()); + } + + @Test + @DisplayName("Test Save User Success") + void whenSaveUser_thenReturnSuccess() { + when(bindingResult.isFailed()).thenReturn(false); + + User user = new User(); + + assertNotNull(userController.saveUser(user)); + assertDoesNotThrow(() -> userController.saveUser(user)); + assertEquals("redirect:users/success", userController.saveUser(user)); + } + + @Test + @DisplayName("Test Save User Binding Errors") + void whenSaveUser_thenReturnError() { + when(bindingResult.isFailed()).thenReturn(true); + Models testModels = new ModelsImpl(); + when(models.put(anyString(), any())).thenReturn(testModels); + User user = getUser(); + assertNotNull(userController.saveUser(user)); + assertDoesNotThrow(() -> userController.saveUser(user)); + assertEquals("user.jsp", userController.saveUser(user)); + } + + @Test + @DisplayName("Test Save User Success View") + void whenSaveUserSuccess_thenRedirectSuccess() { + assertNotNull(userController.saveUserSuccess()); + assertDoesNotThrow(() -> userController.saveUserSuccess()); + assertEquals("success.jsp", userController.saveUserSuccess()); + } + + @Test + @DisplayName("Test Get Users API") + void whenGetUser_thenReturnUsers() { + when(bindingResult.isFailed()).thenReturn(false); + + User user= getUser(); + + assertNotNull(user); + assertEquals(30, user.getAge()); + assertEquals("john doe", user.getName()); + assertEquals("anymail", user.getEmail()); + assertEquals("99887766554433", user.getPhone()); + assertEquals("1", user.getId()); + + userController.saveUser(user); + userController.saveUser(user); + userController.saveUser(user); + + assertNotNull(userController.getUsers()); + assertDoesNotThrow(() -> userController.getUsers()); + assertEquals(3, userController.getUsers().size()); + + } + + private User getUser() { + User user = new User(); + user.setId("1"); + user.setName("john doe"); + user.setAge(30); + user.setEmail("anymail"); + user.setPhone("99887766554433"); + return user; + } + +} diff --git a/pom.xml b/pom.xml index 197e946974..b6767c629b 100644 --- a/pom.xml +++ b/pom.xml @@ -462,6 +462,7 @@ jaxb jee-7 jee-7-security + jakarta-ee jersey jgit jgroups @@ -555,9 +556,9 @@ rxjava-observables rxjava-operators - atomikos - reactive-systems - slack + atomikos + reactive-systems + slack @@ -945,6 +946,7 @@ jaxb jee-7 jee-7-security + jakarta-ee jersey jgit jgroups @@ -1038,9 +1040,9 @@ rxjava-observables rxjava-operators - atomikos - reactive-systems - slack + atomikos + reactive-systems + slack @@ -1311,43 +1313,43 @@
- core-java-modules/core-java-9 - core-java-modules/core-java-9-improvements - core-java-modules/core-java-9-jigsaw + core-java-modules/core-java-9 + core-java-modules/core-java-9-improvements + core-java-modules/core-java-9-jigsaw - core-java-modules/core-java-9-streams - core-java-modules/core-java-10 - core-java-modules/core-java-11 - core-java-modules/core-java-11-2 - - - - - core-java-modules/core-java-collections-set - core-java-modules/core-java-collections-maps-4 - core-java-modules/core-java-date-operations-1 - core-java-modules/core-java-datetime-conversion - core-java-modules/core-java-datetime-string - core-java-modules/core-java-io-conversions-2 - core-java-modules/core-java-jpms - core-java-modules/core-java-os - core-java-modules/core-java-string-algorithms-3 - core-java-modules/core-java-string-operations-3 - core-java-modules/core-java-string-operations-4 - core-java-modules/core-java-time-measurements - core-java-modules/core-java-networking-3 - core-java-modules/multimodulemavenproject - ddd-modules - httpclient-2 - libraries-concurrency - persistence-modules/sirix - persistence-modules/spring-data-cassandra-2 - quarkus-vs-springboot - quarkus-jandex - spring-boot-modules/spring-boot-cassandre - spring-boot-modules/spring-boot-camel - testing-modules/testing-assertions - persistence-modules/fauna + core-java-modules/core-java-9-streams + core-java-modules/core-java-10 + core-java-modules/core-java-11 + core-java-modules/core-java-11-2 + + + + + core-java-modules/core-java-collections-set + core-java-modules/core-java-collections-maps-4 + core-java-modules/core-java-date-operations-1 + core-java-modules/core-java-datetime-conversion + core-java-modules/core-java-datetime-string + core-java-modules/core-java-io-conversions-2 + core-java-modules/core-java-jpms + core-java-modules/core-java-os + core-java-modules/core-java-string-algorithms-3 + core-java-modules/core-java-string-operations-3 + core-java-modules/core-java-string-operations-4 + core-java-modules/core-java-time-measurements + core-java-modules/core-java-networking-3 + core-java-modules/multimodulemavenproject + ddd-modules + httpclient-2 + libraries-concurrency + persistence-modules/sirix + persistence-modules/spring-data-cassandra-2 + quarkus-vs-springboot + quarkus-jandex + spring-boot-modules/spring-boot-cassandre + spring-boot-modules/spring-boot-camel + testing-modules/testing-assertions + persistence-modules/fauna