Skip to content
This repository was archived by the owner on Jun 11, 2022. It is now read-only.

Commit 0a5e6b8

Browse files
committed
Refactor code, generify Dao
1 parent 2d7c42c commit 0a5e6b8

18 files changed

+126
-134
lines changed

server/src/main/java/com/balinski/api_project/Main.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package com.balinski.api_project;
22

3-
import com.balinski.api_project.database.dao.DaoManager;
3+
import com.balinski.api_project.database.DaoManager;
44

55
import com.balinski.api_project.database.dao.DaoException;
66
import com.balinski.api_project.database.model.Film;
77
import com.balinski.api_project.server.JettyServer;
88

99
import java.util.List;
1010

11-
1211
public class Main {
1312

1413
public static void main(String[] args) {
15-
//testDatabase();
14+
testDatabase();
1615
runApplication();
1716
}
1817

@@ -29,8 +28,8 @@ static void runApplication() {
2928
static void testDatabase() {
3029
try {
3130
List<Film> list = new DaoManager().getFilmDao().getAvailableInLanguage("jaPANESE");
32-
for(var actor : list)
33-
System.out.println(actor.getTitle());
31+
for(var film : list)
32+
System.out.println(film.getTitle());
3433
} catch (DaoException e) {
3534
e.printStackTrace();
3635
}

server/src/main/java/com/balinski/api_project/database/dao/DaoManager.java renamed to server/src/main/java/com/balinski/api_project/database/DaoManager.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package com.balinski.api_project.database.dao;
1+
package com.balinski.api_project.database;
22

3-
import com.balinski.api_project.database.DataSourceWrapper;
3+
import com.balinski.api_project.database.dao.*;
44
import com.balinski.api_project.util.FilePropertiesLoader;
55
import com.balinski.api_project.util.SqlExceptionPrinter;
66

@@ -9,7 +9,7 @@
99
import java.util.*;
1010

1111
public class DaoManager {
12-
protected DataSourceWrapper dataSource;
12+
protected DatabaseProxy databaseProxy;
1313

1414
public DaoManager() throws DaoException {
1515
try {
@@ -105,16 +105,16 @@ public int queryModify(String sql, boolean transaction) {
105105
}
106106

107107
public Connection getConnection() {
108-
return dataSource.getConnection();
108+
return databaseProxy.getConnection();
109109
}
110110

111111
protected void closeConnection() {
112-
dataSource.closeConnection();
112+
databaseProxy.closeConnection();
113113
}
114114

115115
protected void initDataSource(String path) throws IOException {
116116
Properties dbProps = FilePropertiesLoader.load(path);
117-
this.dataSource = new DataSourceWrapper(dbProps);
117+
this.databaseProxy = new DatabaseProxy(dbProps);
118118
}
119119

120120
}

server/src/main/java/com/balinski/api_project/database/DataSourceWrapper.java renamed to server/src/main/java/com/balinski/api_project/database/DatabaseProxy.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
import java.util.*;
88
import java.util.stream.Stream;
99

10-
public class DataSourceWrapper {
10+
public class DatabaseProxy {
1111
private BasicDataSource dataSource;
1212
private Connection connection;
1313
private String url;
1414
private String username;
1515
private String password;
1616

17-
public DataSourceWrapper(Properties props) {
17+
public DatabaseProxy(Properties props) {
1818
try {
1919
loadDatabaseProperties(props);
2020
initDataSource();

server/src/main/java/com/balinski/api_project/database/dao/ActorDao.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
package com.balinski.api_project.database.dao;
22

33

4-
import com.balinski.api_project.database.model.DatabaseModel;
4+
import com.balinski.api_project.database.DaoManager;
5+
import com.balinski.api_project.database.model.Actor;
56

67
import java.util.*;
78

8-
public class ActorDao extends Dao {
9+
public class ActorDao extends Dao<Actor> {
910
public ActorDao(DaoManager manager, boolean transaction) {
10-
super(manager, ModelType.ACTOR, transaction);
11+
super(manager, DaoType.ACTOR, transaction);
1112
}
1213

13-
public List<? super DatabaseModel> getByFirstName(String firstName) {
14+
public List<Actor> getByFirstName(String firstName) {
1415
List<Map<String, Object>> result = manager.queryGetData(
1516
String.format("SELECT * FROM ACTOR A WHERE lower(A.FIRST_NAME) = '%s';", firstName.toLowerCase())
1617
);
1718

1819
return toListOfObjects(result);
1920
}
2021

21-
public List<? super DatabaseModel> getByLastName(String lastName) {
22+
public List<Actor> getByLastName(String lastName) {
2223
List<Map<String, Object>> result = manager.queryGetData(
2324
String.format("SELECT * FROM ACTOR A WHERE lower(A.LAST_NAME) = '%s';", lastName.toLowerCase())
2425
);

server/src/main/java/com/balinski/api_project/database/dao/Dao.java

+18-21
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
package com.balinski.api_project.database.dao;
22

3+
import com.balinski.api_project.database.DaoManager;
34
import com.balinski.api_project.database.model.*;
45

5-
import java.time.format.DateTimeFormatter;
6-
import java.util.ArrayList;
7-
import java.util.List;
8-
import java.util.Map;
6+
import java.util.*;
97

10-
abstract class Dao {
8+
abstract class Dao<T extends DatabaseModel> {
119
protected DaoManager manager;
1210
protected boolean transaction;
13-
protected ModelType type;
14-
protected static final DateTimeFormatter toDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
11+
protected DaoType type;
1512

16-
protected Dao(DaoManager manager, ModelType type, boolean transaction) {
13+
protected Dao(DaoManager manager, DaoType type, boolean transaction) {
1714
this.manager = manager;
1815
this.type = type;
1916
this.transaction = transaction;
@@ -27,23 +24,23 @@ public int getCount() {
2724
return ((Long)result.get(0).get("COUNT")).intValue();
2825
}
2926

30-
public Object getById(int id) {
27+
public T getById(int id) {
3128
List<Map<String, Object>> result = manager.queryGetData(
3229
String.format("SELECT * FROM %s T WHERE T.%s_ID = %d;", type.toString(), type.toString(), id)
3330
);
3431

3532
return result.size() > 0 ? toListOfObjects(result).get(0) : null;
3633
}
3734

38-
public List<? super DatabaseModel> getAll() {
35+
public List<T> getAll() {
3936
List<Map<String, Object>> result = manager.queryGetData(
4037
String.format("SELECT * FROM %s;", type.toString())
4138
);
4239

4340
return toListOfObjects(result);
4441
}
4542

46-
public List<? super DatabaseModel> getIdBetween(int start, int stop) {
43+
public List<T> getIdBetween(int start, int stop) {
4744
List<Map<String, Object>> result = manager.queryGetData(
4845
String.format("SELECT * FROM %s T WHERE T.%s_ID BETWEEN %d AND %d;",
4946
type.toString(), type.toString(), start, stop)
@@ -52,18 +49,16 @@ public List<? super DatabaseModel> getIdBetween(int start, int stop) {
5249
return toListOfObjects(result);
5350
}
5451

55-
public int add(Object obj) {
56-
if(!(obj instanceof DatabaseModel))
52+
public int add(T obj) {
53+
if(obj == null)
5754
return 0;
5855

59-
DatabaseModel model = (DatabaseModel) obj;
60-
61-
String sql = String.format("INSERT INTO %s VALUES %s;", type.toString(), model.asTuple());
56+
String sql = String.format("INSERT INTO %s VALUES (%s);", type.toString(), obj.asCsv());
6257

6358
return manager.queryModify(sql, transaction);
6459
}
6560

66-
public int addAll(List<? super DatabaseModel> list) {
61+
public int addAll(List<T> list) {
6762
if(list == null || list.size() == 0)
6863
return 0;
6964

@@ -72,22 +67,24 @@ public int addAll(List<? super DatabaseModel> list) {
7267
for(Object obj : list) {
7368
DatabaseModel model = (DatabaseModel) obj;
7469

75-
sql.append(String.format("%s, ", model.asTuple()));
70+
sql.append(String.format("(%s), ", model.asCsv()));
7671
}
7772

7873
sql.replace(sql.lastIndexOf(", "), sql.length(), ";");
7974

8075
return manager.queryModify(sql.toString(), transaction);
8176
}
8277

83-
protected List<? super DatabaseModel> toListOfObjects(List<Map<String, Object>> listOfMaps) {
78+
protected List<T> toListOfObjects(List<Map<String, Object>> listOfMaps) {
8479
if(listOfMaps == null)
8580
return null;
8681

87-
List<? super DatabaseModel> listOfObjects = new ArrayList<>(listOfMaps.size());
82+
List<T> listOfObjects = new ArrayList<>(listOfMaps.size());
83+
84+
ModelFactory<T> factory = new ModelFactory<>();
8885

8986
for(var map : listOfMaps)
90-
listOfObjects.add(ModelFactory.getModel(type, map));
87+
listOfObjects.add(factory.getModel(type, map));
9188

9289
return listOfObjects;
9390
}

server/src/main/java/com/balinski/api_project/database/dao/ModelType.java renamed to server/src/main/java/com/balinski/api_project/database/dao/DaoType.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.balinski.api_project.database.dao;
22

3-
public enum ModelType {
3+
public enum DaoType {
44
ACTOR("ACTOR"), FILM("FILM"), LANGUAGE("LANGUAGE"), USER("USER");
55

66
private String tableName;
77

8-
ModelType(String tableName) {
8+
DaoType(String tableName) {
99
this.tableName = tableName;
1010
}
1111

server/src/main/java/com/balinski/api_project/database/dao/FilmDao.java

+18-17
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
package com.balinski.api_project.database.dao;
22

3-
import com.balinski.api_project.database.model.DatabaseModel;
3+
import com.balinski.api_project.database.DaoManager;
4+
import com.balinski.api_project.database.model.Film;
45

56
import java.math.BigDecimal;
67
import java.time.LocalDateTime;
78
import java.time.format.DateTimeFormatter;
89
import java.util.List;
910
import java.util.Map;
1011

11-
public class FilmDao extends Dao {
12+
public class FilmDao extends Dao<Film> {
1213
static final DateTimeFormatter toDate = DateTimeFormatter.ofPattern("yyyy-MM-dd");
1314

1415
public FilmDao(DaoManager manager, boolean transaction) {
15-
super(manager, ModelType.FILM, transaction);
16+
super(manager, DaoType.FILM, transaction);
1617
}
1718

18-
public List<? super DatabaseModel> getByTitle(String title) {
19+
public List<Film> getByTitle(String title) {
1920
List<Map<String, Object>> result = manager.queryGetData(
2021
String.format("SELECT * FROM FILM F WHERE lower(F.TITLE) = '%s';", title.toLowerCase())
2122
);
2223

2324
return toListOfObjects(result);
2425
}
2526

26-
public List<? super DatabaseModel> getReleasedBetween(LocalDateTime start, LocalDateTime end) {
27+
public List<Film> getReleasedBetween(LocalDateTime start, LocalDateTime end) {
2728
List<Map<String, Object>> result = manager.queryGetData(
2829
String.format("SELECT * FROM FILM F WHERE F.RELEASE_YEAR BETWEEN TIMESTAMP '%s' AND TIMESTAMP '%s';",
2930
start.format(toDate), end.format(toDate))
@@ -32,23 +33,23 @@ public List<? super DatabaseModel> getReleasedBetween(LocalDateTime start, Local
3233
return toListOfObjects(result);
3334
}
3435

35-
public List<? super DatabaseModel> getReleasedBefore(LocalDateTime date) {
36+
public List<Film> getReleasedBefore(LocalDateTime date) {
3637
List<Map<String, Object>> result = manager.queryGetData(
3738
String.format("SELECT * FROM FILM F WHERE F.RELEASE_YEAR < TIMESTAMP '%s';", date.format(toDate))
3839
);
3940

4041
return toListOfObjects(result);
4142
}
4243

43-
public List<? super DatabaseModel> getReleasedAfter(LocalDateTime date) {
44+
public List<Film> getReleasedAfter(LocalDateTime date) {
4445
List<Map<String, Object>> result = manager.queryGetData(
4546
String.format("SELECT * FROM FILM F WHERE F.RELEASE_YEAR > TIMESTAMP '%s';", date.format(toDate))
4647
);
4748

4849
return toListOfObjects(result);
4950
}
5051

51-
public List<? super DatabaseModel> getAvailableInLanguage(String language) {
52+
public List<Film> getAvailableInLanguage(String language) {
5253
List<Map<String, Object>> result = manager.queryGetData(
5354
String.format("SELECT F.* FROM (FILM F JOIN LANGUAGE L ON F.LANGUAGE_ID = L.LANGUAGE_ID" +
5455
") WHERE lower(NAME) = '%s';", language.toLowerCase())
@@ -57,7 +58,7 @@ public List<? super DatabaseModel> getAvailableInLanguage(String language) {
5758
return toListOfObjects(result);
5859
}
5960

60-
public List<? super DatabaseModel> getWithRentalRateBetween(BigDecimal min, BigDecimal max) {
61+
public List<Film> getWithRentalRateBetween(BigDecimal min, BigDecimal max) {
6162
List<Map<String, Object>> result = manager.queryGetData(
6263
String.format("SELECT * FROM FILM F WHERE F.RENTAL_RATE BETWEEN %s AND %s;",
6364
min.toPlainString(), max.toPlainString())
@@ -66,63 +67,63 @@ public List<? super DatabaseModel> getWithRentalRateBetween(BigDecimal min, BigD
6667
return toListOfObjects(result);
6768
}
6869

69-
public List<? super DatabaseModel> getWithLowerRentalRateThan(BigDecimal rate) {
70+
public List<Film> getWithLowerRentalRateThan(BigDecimal rate) {
7071
List<Map<String, Object>> result = manager.queryGetData(
7172
String.format("SELECT * FROM FILM F WHERE F.RENTAL_RATE < %s;", rate.toPlainString())
7273
);
7374

7475
return toListOfObjects(result);
7576
}
7677

77-
public List<? super DatabaseModel> getWithGreaterRentalRateThan(BigDecimal rate) {
78+
public List<Film> getWithGreaterRentalRateThan(BigDecimal rate) {
7879
List<Map<String, Object>> result = manager.queryGetData(
7980
String.format("SELECT * FROM FILM F WHERE F.RENTAL_RATE > %s;", rate.toPlainString())
8081
);
8182

8283
return toListOfObjects(result);
8384
}
8485

85-
public List<? super DatabaseModel> getWithRentalDurationBetween(int min, int max) {
86+
public List<Film> getWithRentalDurationBetween(int min, int max) {
8687
List<Map<String, Object>> result = manager.queryGetData(
8788
String.format("SELECT * FROM FILM F WHERE F.RENTAL_DURATION BETWEEN %d AND %d;", min, max)
8889
);
8990

9091
return toListOfObjects(result);
9192
}
9293

93-
public List<? super DatabaseModel> getWithShorterRentalDurationThan(int duration) {
94+
public List<Film> getWithShorterRentalDurationThan(int duration) {
9495
List<Map<String, Object>> result = manager.queryGetData(
9596
String.format("SELECT * FROM FILM F WHERE F.RENTAL_DURATION < %d;", duration)
9697
);
9798

9899
return toListOfObjects(result);
99100
}
100101

101-
public List<? super DatabaseModel> getWithGreaterRentalDurationThan(int duration) {
102+
public List<Film> getWithGreaterRentalDurationThan(int duration) {
102103
List<Map<String, Object>> result = manager.queryGetData(
103104
String.format("SELECT * FROM FILM F WHERE F.RENTAL_DURATION > %d;", duration)
104105
);
105106

106107
return toListOfObjects(result);
107108
}
108109

109-
public List<? super DatabaseModel> getWithLengthBetween(int min, int max) {
110+
public List<Film> getWithLengthBetween(int min, int max) {
110111
List<Map<String, Object>> result = manager.queryGetData(
111112
String.format("SELECT * FROM FILM F WHERE F.LENGTH BETWEEN %d AND %d;", min, max)
112113
);
113114

114115
return toListOfObjects(result);
115116
}
116117

117-
public List<? super DatabaseModel> getShorterThan(int minutes) {
118+
public List<Film> getShorterThan(int minutes) {
118119
List<Map<String, Object>> result = manager.queryGetData(
119120
String.format("SELECT * FROM FILM F WHERE F.LENGTH < %d;", minutes)
120121
);
121122

122123
return toListOfObjects(result);
123124
}
124125

125-
public List<? super DatabaseModel> getLongerThan(int minutes) {
126+
public List<Film> getLongerThan(int minutes) {
126127
List<Map<String, Object>> result = manager.queryGetData(
127128
String.format("SELECT * FROM FILM F WHERE F.LENGTH > %d;", minutes)
128129
);

0 commit comments

Comments
 (0)