first pair code
This commit is contained in:
		
							parent
							
								
									976862de1a
								
							
						
					
					
						commit
						b331b1779f
					
				| @ -0,0 +1,17 @@ | ||||
| /** | ||||
|  *  | ||||
|  */ | ||||
| package com.baeldung.collections.mapfirstpair; | ||||
| 
 | ||||
| import java.util.Map; | ||||
| 
 | ||||
| /** | ||||
|  * @author ASHWINI | ||||
|  * | ||||
|  */ | ||||
| public interface MapFirstPairService { | ||||
| 
 | ||||
|     <K, V> Map.Entry<K, V> getFirstPairUsingIterator(Map<K, V> map); | ||||
| 
 | ||||
|     <K, V> Map.Entry<K, V> getFirstPairUsingStream(Map<K, V> map); | ||||
| } | ||||
| @ -0,0 +1,40 @@ | ||||
| /** | ||||
|  *  | ||||
|  */ | ||||
| package com.baeldung.collections.mapfirstpair; | ||||
| 
 | ||||
| import java.util.Iterator; | ||||
| import java.util.Map; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| /** | ||||
|  * @author ASHWINI | ||||
|  * | ||||
|  */ | ||||
| public class MapFirstPairServiceImpl implements MapFirstPairService { | ||||
| 
 | ||||
|     public <K, V> Map.Entry<K, V> getFirstPairUsingIterator(Map<K, V> map) { | ||||
|         if (map == null || map.size() == 0) | ||||
|             return null; | ||||
| 
 | ||||
|         Iterator<Map.Entry<K, V>> iterator = map.entrySet() | ||||
|             .iterator(); | ||||
| 
 | ||||
|         if (iterator.hasNext()) | ||||
|             return iterator.next(); | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public <K, V> Map.Entry<K, V> getFirstPairUsingStream(Map<K, V> map) { | ||||
|         if (map == null || map.size() == 0) | ||||
|             return null; | ||||
| 
 | ||||
|         Set<Map.Entry<K, V>> entrySet = map.entrySet(); | ||||
| 
 | ||||
|         return entrySet.stream() | ||||
|             .findFirst() | ||||
|             .get(); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,125 @@ | ||||
| package com.baeldung.collections.mapfirstpair; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| import static org.junit.Assert.assertNotEquals; | ||||
| 
 | ||||
| import java.util.AbstractMap; | ||||
| import java.util.HashMap; | ||||
| import java.util.LinkedHashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import org.junit.Before; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class MapFirstPairServiceUnitTest { | ||||
| 
 | ||||
|     private MapFirstPairService mapFirstPairService; | ||||
| 
 | ||||
|     @Before | ||||
|     public void Setup() { | ||||
| 
 | ||||
|         mapFirstPairService = new MapFirstPairServiceImpl(); | ||||
|     } | ||||
| 
 | ||||
|     private void populateMapValues(Map<Integer, String> map) { | ||||
|         if (map != null) { | ||||
|             map.put(5, "A"); | ||||
|             map.put(1, "B"); | ||||
|             map.put(2, "C"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenUsingIteratorForHashMap() { | ||||
|         Map<Integer, String> hashMap = new HashMap<>(); | ||||
|         populateMapValues(hashMap); | ||||
| 
 | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingIterator(hashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B"); | ||||
|         Map.Entry<Integer, String> pairInsertedFirst = new AbstractMap.SimpleEntry<Integer, String>(5, "A"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|         assertNotEquals(pairInsertedFirst, actualValue); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenUsingStreamForHashMap() { | ||||
|         Map<Integer, String> hashMap = new HashMap<>(); | ||||
|         populateMapValues(hashMap); | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingStream(hashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(1, "B"); | ||||
|         Map.Entry<Integer, String> pairInsertedFirst = new AbstractMap.SimpleEntry<Integer, String>(5, "A"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|         assertNotEquals(pairInsertedFirst, actualValue); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenUsingIteratorForLinkedHashMap() { | ||||
|         Map<Integer, String> linkedHashMap = new LinkedHashMap<>(); | ||||
|         populateMapValues(linkedHashMap); | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingIterator(linkedHashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenUsingStreamForLinkedHashMap() { | ||||
|         Map<Integer, String> linkedHashMap = new LinkedHashMap<>(); | ||||
|         populateMapValues(linkedHashMap); | ||||
| 
 | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingStream(linkedHashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenAddedAnElementInHashMap_thenFirstPairChangedUsingIterator() { | ||||
|         Map<Integer, String> hashMap = new HashMap<>(); | ||||
|         populateMapValues(hashMap); | ||||
| 
 | ||||
|         hashMap.put(0, "D"); | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingIterator(hashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(0, "D"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenAddedAnElementInHashMap_thenFirstPairChangedUsingStream() { | ||||
|         Map<Integer, String> hashMap = new HashMap<>(); | ||||
|         populateMapValues(hashMap); | ||||
| 
 | ||||
|         hashMap.put(0, "D"); | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingStream(hashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(0, "D"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenAddedAnElementInLinkedHashMap_thenFirstPairRemainUnchangedUsingIterator() { | ||||
|         Map<Integer, String> linkedHashMap = new LinkedHashMap<>(); | ||||
|         populateMapValues(linkedHashMap); | ||||
| 
 | ||||
|         linkedHashMap.put(0, "D"); | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingIterator(linkedHashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void whenAddedAnElementInLinkedHashMap_thenFirstPairRemainUnchangedUsingStream() { | ||||
|         Map<Integer, String> linkedHashMap = new LinkedHashMap<>(); | ||||
|         populateMapValues(linkedHashMap); | ||||
| 
 | ||||
|         linkedHashMap.put(0, "D"); | ||||
|         Map.Entry<Integer, String> actualValue = mapFirstPairService.getFirstPairUsingStream(linkedHashMap); | ||||
|         Map.Entry<Integer, String> expectedValue = new AbstractMap.SimpleEntry<Integer, String>(5, "A"); | ||||
| 
 | ||||
|         assertEquals(expectedValue, actualValue); | ||||
|     } | ||||
| } | ||||
| @ -1,17 +0,0 @@ | ||||
| # Hexagonal Architecture | ||||
| A quick and practical example of Hexagonal Architecture using Spring boot. | ||||
| 
 | ||||
| This application is using h2 database,which can be accessible http:/localhost:8080/h2 | ||||
| 
 | ||||
| Main Application schema : hexagonal | ||||
| 
 | ||||
| Test Application Schema : hexagonal_test | ||||
| 
 | ||||
| 1. Rest Api : execute [App](https://github.com/akeshri/tutorials/blob/master/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/architecture/App.java) | ||||
|       - Get All products  : http://localhost:8080/api/v1/product/all | ||||
|       - Get product by id : http://localhost:8080/api/v1/product/{productId} | ||||
|       - Add a product     : http://localhost:8080/api/v1/product/add                                                                   | ||||
|       For more detail refer [ProductController](https://github.com/akeshri/tutorials/blob/master/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/architecture/controller/ProductController.java) | ||||
| 
 | ||||
| 2. Batch processing : We need to configure active profile as batch i.e. -Dspring.profiles.active=batch and execute [ConsoleApp](https://github.com/akeshri/tutorials/blob/master/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/architecture/ConsoleApp.java) | ||||
| 3. Test case : [ProductServiceTest](https://github.com/akeshri/tutorials/blob/master/hexagonal-architecture/src/test/java/com/baeldung/hexagonal/architecture/service/ProductServiceTest.java) | ||||
| @ -1,48 +0,0 @@ | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
| 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
| 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
| 	<modelVersion>4.0.0</modelVersion> | ||||
| 
 | ||||
| 	<groupId>com.article</groupId> | ||||
| 	<artifactId>hexagonal-architecture</artifactId> | ||||
| 	<version>0.0.1-SNAPSHOT</version> | ||||
| 	<packaging>jar</packaging> | ||||
| 	<parent> | ||||
| 		<groupId>org.springframework.boot</groupId> | ||||
| 		<artifactId>spring-boot-starter-parent</artifactId> | ||||
| 		<version>1.3.1.RELEASE</version> | ||||
| 	</parent> | ||||
| 
 | ||||
| 	<name>hexagonal-architecture</name> | ||||
| 	<url>http://maven.apache.org</url> | ||||
| 
 | ||||
| 	<properties> | ||||
| 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||||
| 		<maven.compiler.target>1.8</maven.compiler.target> | ||||
| 		<maven.compiler.source>1.8</maven.compiler.source> | ||||
| 	</properties> | ||||
| 
 | ||||
| 	<dependencies> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-web</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-data-jpa</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>com.h2database</groupId> | ||||
| 			<artifactId>h2</artifactId> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.springframework.boot</groupId> | ||||
| 			<artifactId>spring-boot-starter-test</artifactId> | ||||
| 			<scope>test</scope> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>com.fasterxml.jackson.dataformat</groupId> | ||||
| 			<artifactId>jackson-dataformat-csv</artifactId> | ||||
| 		</dependency> | ||||
| 	</dependencies> | ||||
| </project> | ||||
| @ -1,16 +0,0 @@ | ||||
| package com.baeldung.hexagonal.architecture; | ||||
| 
 | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| @SpringBootApplication | ||||
| public class App { | ||||
|     public static void main(String[] args) { | ||||
|         SpringApplication.run(App.class, args); | ||||
|     } | ||||
| } | ||||
| @ -1,50 +0,0 @@ | ||||
| package com.baeldung.hexagonal.architecture; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.boot.CommandLineRunner; | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||
| import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration; | ||||
| import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; | ||||
| 
 | ||||
| import com.baeldung.hexagonal.architecture.model.Product; | ||||
| import com.baeldung.hexagonal.architecture.service.ProductService; | ||||
| import com.fasterxml.jackson.dataformat.csv.CsvMapper; | ||||
| import com.fasterxml.jackson.dataformat.csv.CsvSchema; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| @SpringBootApplication(exclude = { EmbeddedServletContainerAutoConfiguration.class, WebMvcAutoConfiguration.class }) | ||||
| public class ConsoleApp implements CommandLineRunner { | ||||
|     @Autowired | ||||
|     private ProductService productService; | ||||
| 
 | ||||
|     public static void main(String[] args) { | ||||
|         SpringApplication.run(ConsoleApp.class, args); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void run(String... args) throws Exception { | ||||
|         String filePath = ""; | ||||
|         if (args != null && args.length == 2 && "Product".equalsIgnoreCase(args[0]) && (filePath = args[1]).length() > 0) { | ||||
|             File sourceFile = new File(filePath); | ||||
|             if (sourceFile.exists()) { | ||||
|                 CsvMapper mapper = new CsvMapper(); | ||||
|                 List<Product> products = mapper.readerFor(Product.class) | ||||
|                     .with(CsvSchema.emptySchema() | ||||
|                         .withHeader()) | ||||
|                     .<Product> readValues(sourceFile) | ||||
|                     .readAll(); | ||||
|                 productService.saveAll(products); | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @ -1,55 +0,0 @@ | ||||
| package com.baeldung.hexagonal.architecture.controller; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestBody; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMethod; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 
 | ||||
| import com.baeldung.hexagonal.architecture.dtos.ProductDto; | ||||
| import com.baeldung.hexagonal.architecture.model.Product; | ||||
| import com.baeldung.hexagonal.architecture.service.ProductService; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| @RestController | ||||
| @RequestMapping("api/v1/product") | ||||
| public class ProductController { | ||||
| 
 | ||||
|     @Autowired | ||||
|     private ProductService productService; | ||||
| 
 | ||||
|     @RequestMapping(value = "/all", method = RequestMethod.GET) | ||||
|     public List<ProductDto> list() { | ||||
|         return productService.findAll() | ||||
|             .stream() | ||||
|             .map(p -> new ProductDto(p)) | ||||
|             .collect(Collectors.toList()); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/{productId}", method = RequestMethod.GET) | ||||
|     public ProductDto get(@PathVariable long productId) { | ||||
|         Product p = productService.findById(productId); | ||||
|         return p != null ? new ProductDto(p) : null; | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/add", method = RequestMethod.POST) | ||||
|     public ProductDto create(@RequestBody ProductDto product) { | ||||
|         Product p = new Product(); | ||||
|         p.setDescription(product.getDescription()); | ||||
|         p.setName(product.getName()); | ||||
|         p.setPrice(product.getPrice()); | ||||
|         p.setQuantity(product.getQuantity()); | ||||
|         Long id = productService.create(p); | ||||
|         product.setId(id); | ||||
|         return product; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,72 +0,0 @@ | ||||
| package com.baeldung.hexagonal.architecture.dtos; | ||||
| 
 | ||||
| import com.baeldung.hexagonal.architecture.model.Product; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| public class ProductDto { | ||||
| 
 | ||||
|     private Long id; | ||||
| 
 | ||||
|     private String name; | ||||
| 
 | ||||
|     private Long quantity; | ||||
| 
 | ||||
|     private Double price; | ||||
| 
 | ||||
|     private String description; | ||||
| 
 | ||||
|     public ProductDto() { | ||||
|     } | ||||
| 
 | ||||
|     public ProductDto(Product product) { | ||||
|         this.description = product.getDescription(); | ||||
|         this.id = product.getId(); | ||||
|         this.name = product.getName(); | ||||
|         this.price = product.getPrice(); | ||||
|         this.quantity = product.getQuantity(); | ||||
|     } | ||||
| 
 | ||||
|     public Long getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(Long id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public Long getQuantity() { | ||||
|         return quantity; | ||||
|     } | ||||
| 
 | ||||
|     public void setQuantity(Long quantity) { | ||||
|         this.quantity = quantity; | ||||
|     } | ||||
| 
 | ||||
|     public Double getPrice() { | ||||
|         return price; | ||||
|     } | ||||
| 
 | ||||
|     public void setPrice(Double price) { | ||||
|         this.price = price; | ||||
|     } | ||||
| 
 | ||||
|     public String getDescription() { | ||||
|         return description; | ||||
|     } | ||||
| 
 | ||||
|     public void setDescription(String description) { | ||||
|         this.description = description; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,85 +0,0 @@ | ||||
| /** | ||||
|  *  | ||||
|  */ | ||||
| package com.baeldung.hexagonal.architecture.model; | ||||
| 
 | ||||
| import java.io.Serializable; | ||||
| 
 | ||||
| import javax.persistence.Column; | ||||
| import javax.persistence.Entity; | ||||
| import javax.persistence.GeneratedValue; | ||||
| import javax.persistence.GenerationType; | ||||
| import javax.persistence.Id; | ||||
| import javax.persistence.Table; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| @Entity | ||||
| @Table(name = "PRODUCT") | ||||
| public class Product implements Serializable { | ||||
| 
 | ||||
|     /** | ||||
|      *  | ||||
|      */ | ||||
|     private static final long serialVersionUID = 4000353732860709995L; | ||||
| 
 | ||||
|     @Id | ||||
|     @GeneratedValue(strategy = GenerationType.AUTO) | ||||
|     private Long id; | ||||
| 
 | ||||
|     @Column(name = "NAME") | ||||
|     private String name; | ||||
| 
 | ||||
|     @Column(name = "QUANTITY") | ||||
|     private Long quantity; | ||||
| 
 | ||||
|     @Column(name = "PRICE") | ||||
|     private Double price; | ||||
| 
 | ||||
|     @Column(name = "DESCRIPTION") | ||||
|     private String description; | ||||
| 
 | ||||
|     public Long getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(Long id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public Long getQuantity() { | ||||
|         return quantity; | ||||
|     } | ||||
| 
 | ||||
|     public void setQuantity(Long quantity) { | ||||
|         this.quantity = quantity > 0 ? quantity : 0; | ||||
|     } | ||||
| 
 | ||||
|     public Double getPrice() { | ||||
|         return price; | ||||
|     } | ||||
| 
 | ||||
|     public void setPrice(Double price) { | ||||
|         this.price = price == null ? 0.0 : price; | ||||
|     } | ||||
| 
 | ||||
|     public String getDescription() { | ||||
|         return description; | ||||
|     } | ||||
| 
 | ||||
|     public void setDescription(String description) { | ||||
|         this.description = description; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,14 +0,0 @@ | ||||
| package com.baeldung.hexagonal.architecture.repository; | ||||
| 
 | ||||
| import org.springframework.data.jpa.repository.JpaRepository; | ||||
| 
 | ||||
| import com.baeldung.hexagonal.architecture.model.Product; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| public interface ProductRepository extends JpaRepository<Product, Long> { | ||||
| 
 | ||||
| } | ||||
| @ -1,21 +0,0 @@ | ||||
| package com.baeldung.hexagonal.architecture.service; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| import com.baeldung.hexagonal.architecture.model.Product; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| public interface ProductService { | ||||
| 
 | ||||
|     List<Product> findAll(); | ||||
| 
 | ||||
|     Product findById(long id); | ||||
| 
 | ||||
|     Long create(Product product); | ||||
| 
 | ||||
|     void saveAll(List<Product> products); | ||||
| } | ||||
| @ -1,44 +0,0 @@ | ||||
| package com.baeldung.hexagonal.architecture.service; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import com.baeldung.hexagonal.architecture.model.Product; | ||||
| import com.baeldung.hexagonal.architecture.repository.ProductRepository; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| @Service | ||||
| public class ProductServiceImpl implements ProductService { | ||||
| 
 | ||||
|     private Logger logger = LoggerFactory.getLogger(ProductServiceImpl.class); | ||||
| 
 | ||||
|     @Autowired | ||||
|     private ProductRepository productRepository; | ||||
| 
 | ||||
|     public List<Product> findAll() { | ||||
|         return productRepository.findAll(); | ||||
|     } | ||||
| 
 | ||||
|     public Product findById(long id) { | ||||
|         return productRepository.findOne(id); | ||||
|     } | ||||
| 
 | ||||
|     public Long create(Product product) { | ||||
|         product = productRepository.saveAndFlush(product); | ||||
|         return product.getId(); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void saveAll(List<Product> products) { | ||||
|         productRepository.save(products); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -1,9 +0,0 @@ | ||||
| spring.main.web-environment=false | ||||
| spring.jpa.hibernate.ddl-auto=false; | ||||
| spring.h2.console.enabled=true | ||||
| spring.h2.console.path=/h2 | ||||
| 
 | ||||
| spring.datasource.url=jdbc:h2:file:~/hexagonal | ||||
| spring.datasource.username=sa | ||||
| spring.datasource.password= | ||||
| spring.datasource.driver-class-name=org.h2.Driver | ||||
| @ -1,8 +0,0 @@ | ||||
| spring.jpa.hibernate.ddl-auto=false; | ||||
| spring.h2.console.enabled=true | ||||
| spring.h2.console.path=/h2 | ||||
| 
 | ||||
| spring.datasource.url=jdbc:h2:file:~/hexagonal_test | ||||
| spring.datasource.username=sa | ||||
| spring.datasource.password= | ||||
| spring.datasource.driver-class-name=org.h2.Driver | ||||
| @ -1,8 +0,0 @@ | ||||
| spring.jpa.hibernate.ddl-auto=false; | ||||
| spring.h2.console.enabled=true | ||||
| spring.h2.console.path=/h2 | ||||
| 
 | ||||
| spring.datasource.url=jdbc:h2:file:~/hexagonal | ||||
| spring.datasource.username=sa | ||||
| spring.datasource.password= | ||||
| spring.datasource.driver-class-name=org.h2.Driver | ||||
| @ -1,9 +0,0 @@ | ||||
| CREATE TABLE PRODUCT( | ||||
| 	ID INT AUTO_INCREMENT, | ||||
| 	NAME VARCHAR(255), | ||||
| 	QUANTITY INTEGER, | ||||
| 	PRICE DOUBLE, | ||||
| 	DESCRIPTION VARCHAR(1000), | ||||
| ); | ||||
| 
 | ||||
| INSERT INTO PRODUCT(NAME,QUANTITY,PRICE,DESCRIPTION) VALUES ('iPhone 11 Pro',10,300,'First triple camera system'); | ||||
| @ -1,43 +0,0 @@ | ||||
| /** | ||||
|  *  | ||||
|  */ | ||||
| package com.baeldung.hexagonal.architecture.service; | ||||
| 
 | ||||
| import org.junit.Assert; | ||||
| import org.junit.Test; | ||||
| import org.junit.runner.RunWith; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | ||||
| import org.springframework.boot.test.SpringApplicationConfiguration; | ||||
| import org.springframework.context.annotation.PropertySource; | ||||
| import org.springframework.context.annotation.PropertySources; | ||||
| import org.springframework.test.context.ActiveProfiles; | ||||
| import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; | ||||
| 
 | ||||
| import com.baeldung.hexagonal.architecture.App; | ||||
| import com.baeldung.hexagonal.architecture.model.Product; | ||||
| import com.baeldung.hexagonal.architecture.service.ProductService; | ||||
| 
 | ||||
| /** | ||||
|  * @author AshwiniKeshri | ||||
|  * | ||||
|  */ | ||||
| @RunWith(SpringJUnit4ClassRunner.class) | ||||
| @SpringApplicationConfiguration(App.class) | ||||
| @ActiveProfiles(value = "test") | ||||
| public class ProductServiceTest { | ||||
| 
 | ||||
|     @Autowired | ||||
|     private ProductService productService; | ||||
| 
 | ||||
|     @Test | ||||
|     public void testCreateProduct() { | ||||
|         Product product = new Product(); | ||||
|         product.setDescription("test product"); | ||||
|         product.setName("Product1"); | ||||
|         product.setPrice(10.0); | ||||
|         product.setQuantity(100l); | ||||
|         Long id = productService.create(product); | ||||
|         Assert.assertTrue(id > 0); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user