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

Commit e0748f5

Browse files
authored
Merge pull request #2 from jakub-balinski/develop
Major code refactoring
2 parents 183b48e + 0a5e6b8 commit e0748f5

21 files changed

+1639
-1590
lines changed

.gitattributes

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/* linguist-vendored
2+
sakila-min.sql linguist-vendored=true

sakila-min.sql

+1,222-1,216
Large diffs are not rendered by default.

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88

99
import java.util.List;
1010

11-
1211
public class Main {
1312

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

1918
static void runApplication() {
@@ -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/DaoManager.java

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package com.balinski.api_project.database;
22

3-
import com.balinski.api_project.database.dao.ActorDao;
4-
import com.balinski.api_project.database.dao.DaoException;
5-
import com.balinski.api_project.database.dao.FilmDao;
6-
import com.balinski.api_project.database.dao.LanguageDao;
3+
import com.balinski.api_project.database.dao.*;
74
import com.balinski.api_project.util.FilePropertiesLoader;
85
import com.balinski.api_project.util.SqlExceptionPrinter;
96

@@ -12,7 +9,7 @@
129
import java.util.*;
1310

1411
public class DaoManager {
15-
protected DataSourceWrapper dataSource;
12+
protected DatabaseProxy databaseProxy;
1613

1714
public DaoManager() throws DaoException {
1815
try {
@@ -34,6 +31,10 @@ public LanguageDao getLanguageDao() {
3431
return new LanguageDao(this, false);
3532
}
3633

34+
public UserDao getUserDao() {
35+
return new UserDao(this, false);
36+
}
37+
3738
public ActorDao getActorDao(boolean transaction) {
3839
return new ActorDao(this, transaction);
3940
}
@@ -46,6 +47,10 @@ public LanguageDao getLanguageDao (boolean transaction) {
4647
return new LanguageDao(this, transaction);
4748
}
4849

50+
public UserDao getUserDao (boolean transaction) {
51+
return new UserDao(this, transaction);
52+
}
53+
4954
public List<Map<String, Object>> queryGetData(String sql) {
5055
List<Map<String, Object>> data = null;
5156

@@ -100,16 +105,16 @@ public int queryModify(String sql, boolean transaction) {
100105
}
101106

102107
public Connection getConnection() {
103-
return dataSource.getConnection();
108+
return databaseProxy.getConnection();
104109
}
105110

106111
protected void closeConnection() {
107-
dataSource.closeConnection();
112+
databaseProxy.closeConnection();
108113
}
109114

110115
protected void initDataSource(String path) throws IOException {
111116
Properties dbProps = FilePropertiesLoader.load(path);
112-
this.dataSource = new DataSourceWrapper(dbProps);
117+
this.databaseProxy = new DatabaseProxy(dbProps);
113118
}
114119

115120
}

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-94
Original file line numberDiff line numberDiff line change
@@ -4,115 +4,27 @@
44
import com.balinski.api_project.database.DaoManager;
55
import com.balinski.api_project.database.model.Actor;
66

7-
import java.sql.Timestamp;
87
import java.util.*;
98

10-
public class ActorDao extends Dao {
9+
public class ActorDao extends Dao<Actor> {
1110
public ActorDao(DaoManager manager, boolean transaction) {
12-
super(manager, transaction);
11+
super(manager, DaoType.ACTOR, transaction);
1312
}
1413

1514
public List<Actor> getByFirstName(String firstName) {
1615
List<Map<String, Object>> result = manager.queryGetData(
17-
"SELECT * FROM ACTOR A WHERE lower(A.FIRST_NAME) = '" + firstName.toLowerCase() + "';"
16+
String.format("SELECT * FROM ACTOR A WHERE lower(A.FIRST_NAME) = '%s';", firstName.toLowerCase())
1817
);
1918

20-
return toListOfActors(result);
19+
return toListOfObjects(result);
2120
}
2221

2322
public List<Actor> getByLastName(String lastName) {
2423
List<Map<String, Object>> result = manager.queryGetData(
25-
"SELECT * FROM ACTOR A WHERE lower(A.LAST_NAME) = '" + lastName.toLowerCase() + "';"
24+
String.format("SELECT * FROM ACTOR A WHERE lower(A.LAST_NAME) = '%s';", lastName.toLowerCase())
2625
);
2726

28-
return toListOfActors(result);
29-
}
30-
31-
@Override
32-
public Integer getCount() {
33-
List<Map<String, Object>> result = manager.queryGetData(
34-
"SELECT COUNT(*) AS COUNT FROM ACTOR;"
35-
);
36-
37-
return ((Long)result.get(0).get("COUNT")).intValue();
38-
}
39-
40-
@Override
41-
public List<Actor> getAll() {
42-
List<Map<String, Object>> result = manager.queryGetData(
43-
"SELECT * FROM ACTOR;"
44-
);
45-
46-
return toListOfActors(result);
47-
}
48-
49-
public Object getById(int id) {
50-
List<Map<String, Object>> result = manager.queryGetData(
51-
"SELECT * FROM ACTOR A WHERE A.ACTOR_ID = " + id + ";"
52-
);
53-
54-
return toListOfActors(result).get(0);
55-
}
56-
57-
@Override
58-
public List<Actor> getIdBetween(int start, int stop) {
59-
List<Map<String, Object>> result = manager.queryGetData(
60-
"SELECT * FROM ACTOR A WHERE A.ACTOR_ID BETWEEN " + start + " AND " + stop + ";"
61-
);
62-
63-
return toListOfActors(result);
64-
}
65-
66-
@Override
67-
public int add(Object obj) {
68-
if(!(obj instanceof Actor))
69-
return 0;
70-
71-
Actor actor = (Actor) obj;
72-
73-
String sql = String.format("INSERT INTO ACTOR VALUES (%d, '%s', '%s', TIMESTAMP '%s');",
74-
actor.getId(), actor.getFirstName(), actor.getLastName(), actor.getLastUpdate().format(toDateTime));
75-
76-
int rowsAdded = manager.queryModify(sql, transaction);
77-
count += rowsAdded;
78-
79-
return rowsAdded;
80-
}
81-
82-
@Override
83-
public int addAll(List<Object> list) {
84-
if(list == null || list.size() == 0)
85-
return 0;
86-
87-
StringBuilder sql = new StringBuilder("INSERT INTO ACTOR VALUES ");
88-
89-
for(Object obj : list) {
90-
Actor actor = (Actor) obj;
91-
92-
sql.append(String.format("(%d, '%s', '%s', TIMESTAMP '%s'), ",
93-
actor.getId(), actor.getFirstName(), actor.getLastName(), actor.getLastUpdate().format(toDateTime)));
94-
}
95-
96-
sql.replace(sql.lastIndexOf(", "), sql.length(), ";");
97-
98-
int rowsAdded = manager.queryModify(sql.toString(), transaction);
99-
count += rowsAdded;
100-
101-
return rowsAdded;
102-
}
103-
104-
public List<Actor> toListOfActors(List<Map<String, Object>> listOfMaps) {
105-
if(listOfMaps == null)
106-
return null;
107-
108-
List<Actor> listOfActors = new ArrayList<>(listOfMaps.size());
109-
110-
for(var actor : listOfMaps) {
111-
listOfActors.add(new Actor((int)actor.get("ACTOR_ID"), (String)actor.get("FIRST_NAME"),
112-
(String)actor.get("LAST_NAME"), ((Timestamp)actor.get("LAST_UPDATE")).toLocalDateTime()));
113-
}
114-
115-
return listOfActors;
27+
return toListOfObjects(result);
11628
}
11729

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

33
import com.balinski.api_project.database.DaoManager;
4+
import com.balinski.api_project.database.model.*;
45

5-
import java.time.format.DateTimeFormatter;
6-
import java.util.List;
6+
import java.util.*;
77

8-
abstract class Dao {
8+
abstract class Dao<T extends DatabaseModel> {
99
protected DaoManager manager;
1010
protected boolean transaction;
11-
protected static Integer count;
12-
protected static final DateTimeFormatter toDateTime = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
11+
protected DaoType type;
1312

14-
protected Dao(DaoManager manager, boolean transaction) {
13+
protected Dao(DaoManager manager, DaoType type, boolean transaction) {
1514
this.manager = manager;
15+
this.type = type;
1616
this.transaction = transaction;
17-
if(count == null)
18-
count = getCount();
1917
}
2018

21-
public abstract Integer getCount();
22-
public abstract List<?> getAll();
23-
public abstract Object getById(int id);
24-
public abstract List<?> getIdBetween(int start, int stop);
25-
public abstract int add(Object obj);
26-
public abstract int addAll(List<Object> list);
19+
public int getCount() {
20+
List<Map<String, Object>> result = manager.queryGetData(
21+
String.format("SELECT COUNT(*) AS COUNT FROM %s;", type.toString())
22+
);
23+
24+
return ((Long)result.get(0).get("COUNT")).intValue();
25+
}
26+
27+
public T getById(int id) {
28+
List<Map<String, Object>> result = manager.queryGetData(
29+
String.format("SELECT * FROM %s T WHERE T.%s_ID = %d;", type.toString(), type.toString(), id)
30+
);
31+
32+
return result.size() > 0 ? toListOfObjects(result).get(0) : null;
33+
}
34+
35+
public List<T> getAll() {
36+
List<Map<String, Object>> result = manager.queryGetData(
37+
String.format("SELECT * FROM %s;", type.toString())
38+
);
39+
40+
return toListOfObjects(result);
41+
}
42+
43+
public List<T> getIdBetween(int start, int stop) {
44+
List<Map<String, Object>> result = manager.queryGetData(
45+
String.format("SELECT * FROM %s T WHERE T.%s_ID BETWEEN %d AND %d;",
46+
type.toString(), type.toString(), start, stop)
47+
);
48+
49+
return toListOfObjects(result);
50+
}
51+
52+
public int add(T obj) {
53+
if(obj == null)
54+
return 0;
55+
56+
String sql = String.format("INSERT INTO %s VALUES (%s);", type.toString(), obj.asCsv());
57+
58+
return manager.queryModify(sql, transaction);
59+
}
60+
61+
public int addAll(List<T> list) {
62+
if(list == null || list.size() == 0)
63+
return 0;
64+
65+
StringBuilder sql = new StringBuilder(String.format("INSERT INTO %s VALUES ", type.toString()));
66+
67+
for(Object obj : list) {
68+
DatabaseModel model = (DatabaseModel) obj;
69+
70+
sql.append(String.format("(%s), ", model.asCsv()));
71+
}
72+
73+
sql.replace(sql.lastIndexOf(", "), sql.length(), ";");
74+
75+
return manager.queryModify(sql.toString(), transaction);
76+
}
77+
78+
protected List<T> toListOfObjects(List<Map<String, Object>> listOfMaps) {
79+
if(listOfMaps == null)
80+
return null;
81+
82+
List<T> listOfObjects = new ArrayList<>(listOfMaps.size());
83+
84+
ModelFactory<T> factory = new ModelFactory<>();
85+
86+
for(var map : listOfMaps)
87+
listOfObjects.add(factory.getModel(type, map));
88+
89+
return listOfObjects;
90+
}
2791
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.balinski.api_project.database.dao;
2+
3+
public enum DaoType {
4+
ACTOR("ACTOR"), FILM("FILM"), LANGUAGE("LANGUAGE"), USER("USER");
5+
6+
private String tableName;
7+
8+
DaoType(String tableName) {
9+
this.tableName = tableName;
10+
}
11+
12+
@Override
13+
public String toString() {
14+
return this.tableName;
15+
}
16+
}

0 commit comments

Comments
 (0)