diff --git a/hexagonal-architecture/pom.xml b/hexagonal-architecture/pom.xml
index 87e599318c..d014617639 100644
--- a/hexagonal-architecture/pom.xml
+++ b/hexagonal-architecture/pom.xml
@@ -18,6 +18,8 @@
UTF-8
+ 1.8
+ 1.8
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/App.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/App.java
new file mode 100644
index 0000000000..ebc661bfdb
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/App.java
@@ -0,0 +1,16 @@
+package com.article.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);
+ }
+}
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/ConsoleApp.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/ConsoleApp.java
new file mode 100644
index 0000000000..0024438737
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/ConsoleApp.java
@@ -0,0 +1,50 @@
+package com.article.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.article.hexagonal.architecture.model.Product;
+import com.article.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 products = mapper.readerFor(Product.class)
+ .with(CsvSchema.emptySchema()
+ .withHeader())
+ . readValues(sourceFile)
+ .readAll();
+ productService.saveAll(products);
+ }
+
+ }
+
+ }
+}
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/controller/ProductController.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/controller/ProductController.java
new file mode 100644
index 0000000000..66372980d0
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/controller/ProductController.java
@@ -0,0 +1,54 @@
+package com.article.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.article.hexagonal.architecture.dtos.ProductDto;
+import com.article.hexagonal.architecture.model.Product;
+import com.article.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 list() {
+ productService.findAll().stream().map(x->x.getDescription())
+ return null;
+ //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;
+ }
+
+}
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/dtos/ProductDto.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/dtos/ProductDto.java
new file mode 100644
index 0000000000..209ae69b0a
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/dtos/ProductDto.java
@@ -0,0 +1,72 @@
+package com.article.hexagonal.architecture.dtos;
+
+import com.article.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;
+ }
+
+}
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/model/Product.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/model/Product.java
new file mode 100644
index 0000000000..f0f95d4d11
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/model/Product.java
@@ -0,0 +1,85 @@
+/**
+ *
+ */
+package com.article.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;
+ }
+
+}
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/repository/ProductRepository.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/repository/ProductRepository.java
new file mode 100644
index 0000000000..fec151780c
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/repository/ProductRepository.java
@@ -0,0 +1,14 @@
+package com.article.hexagonal.architecture.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.article.hexagonal.architecture.model.Product;
+
+/**
+ * @author AshwiniKeshri
+ *
+ */
+
+public interface ProductRepository extends JpaRepository {
+
+}
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/service/ProductService.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/service/ProductService.java
new file mode 100644
index 0000000000..5ed1e7de96
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/service/ProductService.java
@@ -0,0 +1,21 @@
+package com.article.hexagonal.architecture.service;
+
+import java.util.List;
+
+import com.article.hexagonal.architecture.model.Product;
+
+/**
+ * @author AshwiniKeshri
+ *
+ */
+
+public interface ProductService {
+
+ List findAll();
+
+ Product findById(long id);
+
+ Long create(Product product);
+
+ void saveAll(List products);
+}
diff --git a/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/service/ProductServiceImpl.java b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/service/ProductServiceImpl.java
new file mode 100644
index 0000000000..ccd1599392
--- /dev/null
+++ b/hexagonal-architecture/src/main/java/com/article/hexagonal/architecture/service/ProductServiceImpl.java
@@ -0,0 +1,44 @@
+package com.article.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.article.hexagonal.architecture.model.Product;
+import com.article.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 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 products) {
+ productRepository.save(products);
+ }
+
+}
diff --git a/hexagonal-architecture/src/test/java/com/article/hexagonal/architecture/service/ProductServiceTest.java b/hexagonal-architecture/src/test/java/com/article/hexagonal/architecture/service/ProductServiceTest.java
new file mode 100644
index 0000000000..6635fef2da
--- /dev/null
+++ b/hexagonal-architecture/src/test/java/com/article/hexagonal/architecture/service/ProductServiceTest.java
@@ -0,0 +1,43 @@
+/**
+ *
+ */
+package com.article.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.article.hexagonal.architecture.App;
+import com.article.hexagonal.architecture.model.Product;
+import com.article.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);
+ }
+
+}