Skip to content

Commit e13e1ac

Browse files
Exam Solution: JSP, JSTL, MVC, Layered Architecture, etc
1 parent 9199542 commit e13e1ac

File tree

126 files changed

+3329
-824
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+3329
-824
lines changed

Diff for: README.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
This is repository with the source code for Java course by Andrii Piatakha.
2+
It is not allowed to copy code and any commercial use (for example in other learning courses etc) without written approval from Andrii Piatakha.
3+
4+
Only students of Andrii Piatakha can use these code examples.
5+
Thanks for respecting hard work of the author.
6+
7+
2019 © Andrii Piatakha
8+
9+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.itbulls.learnit.onlinestore.core;
2+
3+
public interface CoreConfigurations {
4+
5+
Double REFFERER_REWARD_RATE = 0.02; // 2%
6+
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.itbulls.learnit.onlinestore.core.facades;
2+
3+
import java.util.List;
4+
5+
import com.itbulls.learnit.onlinestore.persistence.enteties.Category;
6+
7+
public interface CategoryFacade {
8+
9+
List<Category> getCategories();
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.itbulls.learnit.onlinestore.core.facades;
2+
3+
import java.util.List;
4+
5+
import com.itbulls.learnit.onlinestore.persistence.enteties.Product;
6+
7+
public interface ProductFacade {
8+
9+
List<Product> getProductsLikeName(String searchQuery);
10+
11+
List<Product> getProductsByCategoryId(Integer id);
12+
13+
List<Product> getProductsByCategoryIdForPageWithLimit(Integer categoryId, Integer page, Integer paginationLimit);
14+
15+
Integer getNumberOfPagesForCategory(Integer categoryId, Integer paginationLimit);
16+
17+
Integer getNumberOfPagesForSearch(String searchQuery, Integer paginationLimit);
18+
19+
List<Product> getProductsLikeNameForPageWithLimit(String searchQuery, Integer page,
20+
Integer paginationLimit);
21+
22+
Product getProductById(Integer parameter);
23+
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.itbulls.learnit.onlinestore.core.facades;
2+
3+
import java.util.List;
4+
5+
import com.itbulls.learnit.onlinestore.persistence.enteties.Product;
6+
import com.itbulls.learnit.onlinestore.persistence.enteties.Purchase;
7+
import com.itbulls.learnit.onlinestore.persistence.enteties.User;
8+
9+
public interface PurchaseFacade {
10+
11+
Integer LAST_STATUS_OF_ORDER_FULFILMENT_ID = 6;
12+
13+
void createPurchase(User attribute, Product productId);
14+
15+
List<Purchase> getNotCompletedPurchases();
16+
17+
void markFulfilmentStageForPurchaseIdAsCompleted(Integer purchaseId);
18+
19+
}

Diff for: online-store.core/src/main/java/com/itbulls/learnit/onlinestore/core/facades/UserFacade.java

+4
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@ public interface UserFacade {
1313
List<User> getUsers();
1414

1515
User getUserById(Integer userId);
16+
17+
void updateUser(User referrerUser);
18+
19+
List<User> getReferralsForUser(User loggedInUser);
1620
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.itbulls.learnit.onlinestore.core.facades.impl;
2+
3+
import java.util.List;
4+
5+
import com.itbulls.learnit.onlinestore.core.facades.CategoryFacade;
6+
import com.itbulls.learnit.onlinestore.persistence.dao.CategoryDao;
7+
import com.itbulls.learnit.onlinestore.persistence.dao.impl.MySqlJdbcCategoryDao;
8+
import com.itbulls.learnit.onlinestore.persistence.dto.converters.CategoryDtoToCategoryConverter;
9+
import com.itbulls.learnit.onlinestore.persistence.enteties.Category;
10+
11+
public class DefaultCategoryFacade implements CategoryFacade {
12+
13+
private static DefaultCategoryFacade instance;
14+
15+
private CategoryDao categoryDao = new MySqlJdbcCategoryDao();
16+
private CategoryDtoToCategoryConverter categoryConverter = new CategoryDtoToCategoryConverter();
17+
18+
public static synchronized DefaultCategoryFacade getInstance() {
19+
if (instance == null) {
20+
instance = new DefaultCategoryFacade();
21+
}
22+
return instance;
23+
}
24+
25+
@Override
26+
public List<Category> getCategories() {
27+
return categoryConverter.convertCategoryDtosToCategories(categoryDao.getCategories());
28+
}
29+
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.itbulls.learnit.onlinestore.core.facades.impl;
2+
3+
import java.util.List;
4+
5+
import com.itbulls.learnit.onlinestore.core.facades.ProductFacade;
6+
import com.itbulls.learnit.onlinestore.persistence.dao.ProductDao;
7+
import com.itbulls.learnit.onlinestore.persistence.dao.impl.MySqlJdbcProductDao;
8+
import com.itbulls.learnit.onlinestore.persistence.dto.converters.ProductDtoToProductConverter;
9+
import com.itbulls.learnit.onlinestore.persistence.enteties.Product;
10+
11+
public class DefaultProductFacade implements ProductFacade {
12+
13+
private static DefaultProductFacade instance;
14+
15+
private ProductDao productDao = new MySqlJdbcProductDao();
16+
private ProductDtoToProductConverter productConverter = new ProductDtoToProductConverter();
17+
18+
public static synchronized DefaultProductFacade getInstance() {
19+
if (instance == null) {
20+
instance = new DefaultProductFacade();
21+
}
22+
return instance;
23+
}
24+
25+
@Override
26+
public List<Product> getProductsLikeName(String searchQuery) {
27+
return productConverter
28+
.convertProductDtosToProducts(productDao.getProductsLikeName(searchQuery));
29+
}
30+
31+
@Override
32+
public List<Product> getProductsByCategoryId(Integer id) {
33+
return productConverter
34+
.convertProductDtosToProducts(productDao.getProductsByCategoryId(id));
35+
}
36+
37+
@Override
38+
public List<Product> getProductsByCategoryIdForPageWithLimit(Integer categoryId, Integer page,
39+
Integer paginationLimit) {
40+
return productConverter
41+
.convertProductDtosToProducts(productDao.getProductsByCategoryIdPaginationLimit(categoryId, page, paginationLimit));
42+
}
43+
44+
@Override
45+
public Integer getNumberOfPagesForCategory(Integer categoryId, Integer paginationLimit) {
46+
Integer totalProductsInCategory = productDao.getProductCountForCategory(categoryId);
47+
int pages = totalProductsInCategory / paginationLimit;
48+
if ( (totalProductsInCategory % paginationLimit) != 0) {
49+
pages++;
50+
}
51+
return pages;
52+
}
53+
54+
@Override
55+
public Integer getNumberOfPagesForSearch(String searchQuery, Integer paginationLimit) {
56+
Integer totalProductsForSearch = productDao.getProductCountForSearch(searchQuery);
57+
int pages = totalProductsForSearch / paginationLimit;
58+
if ( (totalProductsForSearch % paginationLimit) != 0) {
59+
pages++;
60+
}
61+
return pages;
62+
}
63+
64+
@Override
65+
public List<Product> getProductsLikeNameForPageWithLimit(String searchQuery, Integer page,
66+
Integer paginationLimit) {
67+
return productConverter
68+
.convertProductDtosToProducts(productDao
69+
.getProductsLikeNameForPageWithLimit(searchQuery, page, paginationLimit));
70+
}
71+
72+
@Override
73+
public Product getProductById(Integer productId) {
74+
return productConverter.convertProductDtoToProduct(productDao.getProductById(productId));
75+
}
76+
77+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.itbulls.learnit.onlinestore.core.facades.impl;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.List;
6+
7+
import com.itbulls.learnit.onlinestore.core.CoreConfigurations;
8+
import com.itbulls.learnit.onlinestore.core.facades.PurchaseFacade;
9+
import com.itbulls.learnit.onlinestore.core.facades.UserFacade;
10+
import com.itbulls.learnit.onlinestore.persistence.dao.PurchaseDao;
11+
import com.itbulls.learnit.onlinestore.persistence.dao.impl.MySqlJdbcPurchaseDao;
12+
import com.itbulls.learnit.onlinestore.persistence.dto.PurchaseDto;
13+
import com.itbulls.learnit.onlinestore.persistence.dto.converters.PurchaseDtoToPurchaseConverter;
14+
import com.itbulls.learnit.onlinestore.persistence.enteties.Product;
15+
import com.itbulls.learnit.onlinestore.persistence.enteties.Purchase;
16+
import com.itbulls.learnit.onlinestore.persistence.enteties.PurchaseStatus;
17+
import com.itbulls.learnit.onlinestore.persistence.enteties.User;
18+
import com.itbulls.learnit.onlinestore.persistence.enteties.impl.DefaultPurchase;
19+
import com.itbulls.learnit.onlinestore.persistence.enteties.impl.DefaultPurchaseStatus;
20+
21+
public class DefaultPurchaseFacade implements PurchaseFacade {
22+
23+
private static DefaultPurchaseFacade instance;
24+
private PurchaseDao purchaseDao = new MySqlJdbcPurchaseDao();
25+
private PurchaseDtoToPurchaseConverter purchaseConverter = new PurchaseDtoToPurchaseConverter();
26+
private UserFacade userFacade = DefaultUserFacade.getInstance();
27+
28+
public static synchronized DefaultPurchaseFacade getInstance() {
29+
if (instance == null) {
30+
instance = new DefaultPurchaseFacade();
31+
}
32+
33+
return instance;
34+
}
35+
36+
@Override
37+
public void createPurchase(User user, Product product) {
38+
Purchase purchase = new DefaultPurchase();
39+
purchase.setCustomer(user);
40+
purchase.setProducts(new ArrayList<>(Arrays.asList(product)));
41+
42+
var purchaseStatus = new DefaultPurchaseStatus();
43+
purchaseStatus.setId(1); // the initial, the first purchase status
44+
purchase.setPurchaseStatus(purchaseStatus);
45+
46+
purchaseDao.savePurchase(purchaseConverter.convertPurchaseToPurchaseDto(purchase));
47+
}
48+
49+
@Override
50+
public List<Purchase> getNotCompletedPurchases() {
51+
return purchaseConverter.convertPurchaseDtosToPurchases(purchaseDao.getNotCompletedPurchases(LAST_STATUS_OF_ORDER_FULFILMENT_ID));
52+
}
53+
54+
@Override
55+
public void markFulfilmentStageForPurchaseIdAsCompleted(Integer purchaseId) {
56+
Purchase purchase = purchaseConverter.convertPurchaseDtoToPurchase(purchaseDao.getPurchaseById(purchaseId));
57+
PurchaseStatus purchaseStatus = purchase.getPurchaseStatus();
58+
int newPurchaseStatusId = purchaseStatus.getId() + 1;
59+
purchaseStatus.setId(newPurchaseStatusId);
60+
purchase.setPurchaseStatus(purchaseStatus);
61+
62+
purchaseDao.updatePurchase(purchaseConverter.convertPurchaseToPurchaseDto(purchase));
63+
64+
if (LAST_STATUS_OF_ORDER_FULFILMENT_ID.equals(newPurchaseStatusId)
65+
&& purchase.getCustomer().getReferrerUser() != null) {
66+
User referrerUser = purchase.getCustomer().getReferrerUser();
67+
double shareFromPurchase = purchase.getTotalPurchaseCost() * CoreConfigurations.REFFERER_REWARD_RATE;
68+
referrerUser.setMoney(referrerUser.getMoney() + shareFromPurchase);
69+
userFacade.updateUser(referrerUser);
70+
}
71+
}
72+
73+
}

Diff for: online-store.core/src/main/java/com/itbulls/learnit/onlinestore/core/facades/impl/DefaultUserFacade.java

+10
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,14 @@ public List<User> getUsers() {
5050
public User getUserById(Integer userId) {
5151
return userConverter.convertUserDtoToUser(userDao.getUserById(userId));
5252
}
53+
54+
@Override
55+
public void updateUser(User referrerUser) {
56+
userDao.updateUser(userConverter.convertUserToUserDto(referrerUser));
57+
}
58+
59+
@Override
60+
public List<User> getReferralsForUser(User loggedInUser) {
61+
return userConverter.convertUserDtosToUsers(userDao.getReferralsByUserId(loggedInUser.getId()));
62+
}
5363
}

Diff for: online-store.core/src/main/java/com/itbulls/learnit/onlinestore/core/menu/impl/CheckoutMenu.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ private boolean createOrder(String creditCardNumber) {
5050

5151
order.setCreditCardNumber(creditCardNumber);
5252
order.setProducts(context.getSessionCart().getProducts());
53-
order.setCustomerId(context.getLoggedInUser().getId());
53+
order.setCustomer(context.getLoggedInUser());
5454
purchaseManagementService.addPurchase(order);
5555
return true;
5656
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.itbulls.learnit.onlinestore.core.services;
2+
3+
public interface Validator {
4+
5+
boolean isValid(String stringValue);
6+
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.itbulls.learnit.onlinestore.core.services.impl;
2+
3+
import com.itbulls.learnit.onlinestore.core.services.Validator;
4+
5+
public class PasswordValidator implements Validator {
6+
7+
8+
private static PasswordValidator instance;
9+
10+
/**
11+
* @return true in case password has 8 or more characters and at least one special character
12+
*/
13+
@Override
14+
public boolean isValid(String password) {
15+
if (password.length() < 8) {
16+
return false;
17+
}
18+
19+
String specialCharactersString = " !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
20+
for (int i = 0; i < password.length(); i++) {
21+
char ch = password.charAt(i);
22+
if (specialCharactersString.contains(Character.toString(ch))) {
23+
return true;
24+
}
25+
}
26+
27+
return false;
28+
}
29+
30+
public static synchronized PasswordValidator getInstance() {
31+
if (instance == null) {
32+
instance = new PasswordValidator();
33+
}
34+
return instance;
35+
}
36+
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-- MySQL dump 10.13 Distrib 8.0.26, for Win64 (x86_64)
2+
--
3+
-- Host: localhost Database: learn_it_db
4+
-- ------------------------------------------------------
5+
-- Server version 8.0.26
6+
7+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10+
/*!50503 SET NAMES utf8 */;
11+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12+
/*!40103 SET TIME_ZONE='+00:00' */;
13+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17+
18+
--
19+
-- Table structure for table `category`
20+
--
21+
22+
DROP TABLE IF EXISTS `category`;
23+
/*!40101 SET @saved_cs_client = @@character_set_client */;
24+
/*!50503 SET character_set_client = utf8mb4 */;
25+
CREATE TABLE `category` (
26+
`id` int unsigned NOT NULL AUTO_INCREMENT,
27+
`category_name` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
28+
`img_name` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
29+
PRIMARY KEY (`id`)
30+
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
31+
/*!40101 SET character_set_client = @saved_cs_client */;
32+
33+
--
34+
-- Dumping data for table `category`
35+
--
36+
37+
LOCK TABLES `category` WRITE;
38+
/*!40000 ALTER TABLE `category` DISABLE KEYS */;
39+
INSERT INTO `category` VALUES (1,'Laptop','laptop2.png'),(2,'Phone','iphone.png'),(3,'TV','qledtv.png'),(4,'Chair','4.png'),(5,'Bed','5.png'),(6,'Sofa','6.png'),(8,'Camera','nikon.png');
40+
/*!40000 ALTER TABLE `category` ENABLE KEYS */;
41+
UNLOCK TABLES;
42+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
43+
44+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
45+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
46+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
47+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
48+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
49+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
50+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
51+
52+
-- Dump completed on 2022-05-05 1:23:08

0 commit comments

Comments
 (0)