Skip to content
This repository was archived by the owner on Jun 11, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/* linguist-vendored
sakila-min.sql linguist-vendored=true
2,438 changes: 1,222 additions & 1,216 deletions sakila-min.sql

Large diffs are not rendered by default.

7 changes: 3 additions & 4 deletions server/src/main/java/com/balinski/api_project/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@

import java.util.List;


public class Main {

public static void main(String[] args) {
testDatabase();
// runApplication();
runApplication();
}

static void runApplication() {
Expand All @@ -29,8 +28,8 @@ static void runApplication() {
static void testDatabase() {
try {
List<Film> list = new DaoManager().getFilmDao().getAvailableInLanguage("jaPANESE");
for(var actor : list)
System.out.println(actor.getTitle());
for(var film : list)
System.out.println(film.getTitle());
} catch (DaoException e) {
e.printStackTrace();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.balinski.api_project.database;

import com.balinski.api_project.database.dao.ActorDao;
import com.balinski.api_project.database.dao.DaoException;
import com.balinski.api_project.database.dao.FilmDao;
import com.balinski.api_project.database.dao.LanguageDao;
import com.balinski.api_project.database.dao.*;
import com.balinski.api_project.util.FilePropertiesLoader;
import com.balinski.api_project.util.SqlExceptionPrinter;

Expand All @@ -12,7 +9,7 @@
import java.util.*;

public class DaoManager {
protected DataSourceWrapper dataSource;
protected DatabaseProxy databaseProxy;

public DaoManager() throws DaoException {
try {
Expand All @@ -34,6 +31,10 @@ public LanguageDao getLanguageDao() {
return new LanguageDao(this, false);
}

public UserDao getUserDao() {
return new UserDao(this, false);
}

public ActorDao getActorDao(boolean transaction) {
return new ActorDao(this, transaction);
}
Expand All @@ -46,6 +47,10 @@ public LanguageDao getLanguageDao (boolean transaction) {
return new LanguageDao(this, transaction);
}

public UserDao getUserDao (boolean transaction) {
return new UserDao(this, transaction);
}

public List<Map<String, Object>> queryGetData(String sql) {
List<Map<String, Object>> data = null;

Expand Down Expand Up @@ -100,16 +105,16 @@ public int queryModify(String sql, boolean transaction) {
}

public Connection getConnection() {
return dataSource.getConnection();
return databaseProxy.getConnection();
}

protected void closeConnection() {
dataSource.closeConnection();
databaseProxy.closeConnection();
}

protected void initDataSource(String path) throws IOException {
Properties dbProps = FilePropertiesLoader.load(path);
this.dataSource = new DataSourceWrapper(dbProps);
this.databaseProxy = new DatabaseProxy(dbProps);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
import java.util.*;
import java.util.stream.Stream;

public class DataSourceWrapper {
public class DatabaseProxy {
private BasicDataSource dataSource;
private Connection connection;
private String url;
private String username;
private String password;

public DataSourceWrapper(Properties props) {
public DatabaseProxy(Properties props) {
try {
loadDatabaseProperties(props);
initDataSource();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,115 +4,27 @@
import com.balinski.api_project.database.DaoManager;
import com.balinski.api_project.database.model.Actor;

import java.sql.Timestamp;
import java.util.*;

public class ActorDao extends Dao {
public class ActorDao extends Dao<Actor> {
public ActorDao(DaoManager manager, boolean transaction) {
super(manager, transaction);
super(manager, DaoType.ACTOR, transaction);
}

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

return toListOfActors(result);
return toListOfObjects(result);
}

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

return toListOfActors(result);
}

@Override
public Integer getCount() {
List<Map<String, Object>> result = manager.queryGetData(
"SELECT COUNT(*) AS COUNT FROM ACTOR;"
);

return ((Long)result.get(0).get("COUNT")).intValue();
}

@Override
public List<Actor> getAll() {
List<Map<String, Object>> result = manager.queryGetData(
"SELECT * FROM ACTOR;"
);

return toListOfActors(result);
}

public Object getById(int id) {
List<Map<String, Object>> result = manager.queryGetData(
"SELECT * FROM ACTOR A WHERE A.ACTOR_ID = " + id + ";"
);

return toListOfActors(result).get(0);
}

@Override
public List<Actor> getIdBetween(int start, int stop) {
List<Map<String, Object>> result = manager.queryGetData(
"SELECT * FROM ACTOR A WHERE A.ACTOR_ID BETWEEN " + start + " AND " + stop + ";"
);

return toListOfActors(result);
}

@Override
public int add(Object obj) {
if(!(obj instanceof Actor))
return 0;

Actor actor = (Actor) obj;

String sql = String.format("INSERT INTO ACTOR VALUES (%d, '%s', '%s', TIMESTAMP '%s');",
actor.getId(), actor.getFirstName(), actor.getLastName(), actor.getLastUpdate().format(toDateTime));

int rowsAdded = manager.queryModify(sql, transaction);
count += rowsAdded;

return rowsAdded;
}

@Override
public int addAll(List<Object> list) {
if(list == null || list.size() == 0)
return 0;

StringBuilder sql = new StringBuilder("INSERT INTO ACTOR VALUES ");

for(Object obj : list) {
Actor actor = (Actor) obj;

sql.append(String.format("(%d, '%s', '%s', TIMESTAMP '%s'), ",
actor.getId(), actor.getFirstName(), actor.getLastName(), actor.getLastUpdate().format(toDateTime)));
}

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

int rowsAdded = manager.queryModify(sql.toString(), transaction);
count += rowsAdded;

return rowsAdded;
}

public List<Actor> toListOfActors(List<Map<String, Object>> listOfMaps) {
if(listOfMaps == null)
return null;

List<Actor> listOfActors = new ArrayList<>(listOfMaps.size());

for(var actor : listOfMaps) {
listOfActors.add(new Actor((int)actor.get("ACTOR_ID"), (String)actor.get("FIRST_NAME"),
(String)actor.get("LAST_NAME"), ((Timestamp)actor.get("LAST_UPDATE")).toLocalDateTime()));
}

return listOfActors;
return toListOfObjects(result);
}

}
92 changes: 78 additions & 14 deletions server/src/main/java/com/balinski/api_project/database/dao/Dao.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,91 @@
package com.balinski.api_project.database.dao;

import com.balinski.api_project.database.DaoManager;
import com.balinski.api_project.database.model.*;

import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.*;

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

protected Dao(DaoManager manager, boolean transaction) {
protected Dao(DaoManager manager, DaoType type, boolean transaction) {
this.manager = manager;
this.type = type;
this.transaction = transaction;
if(count == null)
count = getCount();
}

public abstract Integer getCount();
public abstract List<?> getAll();
public abstract Object getById(int id);
public abstract List<?> getIdBetween(int start, int stop);
public abstract int add(Object obj);
public abstract int addAll(List<Object> list);
public int getCount() {
List<Map<String, Object>> result = manager.queryGetData(
String.format("SELECT COUNT(*) AS COUNT FROM %s;", type.toString())
);

return ((Long)result.get(0).get("COUNT")).intValue();
}

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

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

public List<T> getAll() {
List<Map<String, Object>> result = manager.queryGetData(
String.format("SELECT * FROM %s;", type.toString())
);

return toListOfObjects(result);
}

public List<T> getIdBetween(int start, int stop) {
List<Map<String, Object>> result = manager.queryGetData(
String.format("SELECT * FROM %s T WHERE T.%s_ID BETWEEN %d AND %d;",
type.toString(), type.toString(), start, stop)
);

return toListOfObjects(result);
}

public int add(T obj) {
if(obj == null)
return 0;

String sql = String.format("INSERT INTO %s VALUES (%s);", type.toString(), obj.asCsv());

return manager.queryModify(sql, transaction);
}

public int addAll(List<T> list) {
if(list == null || list.size() == 0)
return 0;

StringBuilder sql = new StringBuilder(String.format("INSERT INTO %s VALUES ", type.toString()));

for(Object obj : list) {
DatabaseModel model = (DatabaseModel) obj;

sql.append(String.format("(%s), ", model.asCsv()));
}

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

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

protected List<T> toListOfObjects(List<Map<String, Object>> listOfMaps) {
if(listOfMaps == null)
return null;

List<T> listOfObjects = new ArrayList<>(listOfMaps.size());

ModelFactory<T> factory = new ModelFactory<>();

for(var map : listOfMaps)
listOfObjects.add(factory.getModel(type, map));

return listOfObjects;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.balinski.api_project.database.dao;

public enum DaoType {
ACTOR("ACTOR"), FILM("FILM"), LANGUAGE("LANGUAGE"), USER("USER");

private String tableName;

DaoType(String tableName) {
this.tableName = tableName;
}

@Override
public String toString() {
return this.tableName;
}
}
Loading