Skip to content
Open
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
9 changes: 9 additions & 0 deletions L24-webServer/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,17 @@ dependencies {
implementation("org.eclipse.jetty:jetty-util")
implementation("org.freemarker:freemarker")

implementation("org.postgresql:postgresql")

implementation("com.h2database:h2")
implementation("org.hibernate.orm:hibernate-core")

implementation ("org.projectlombok:lombok")
annotationProcessor ("org.projectlombok:lombok")

testImplementation("org.junit.jupiter:junit-jupiter-engine")
testImplementation("org.junit.jupiter:junit-jupiter-params")
testImplementation("org.assertj:assertj-core")
testImplementation("org.mockito:mockito-junit-jupiter")

}
7 changes: 7 additions & 0 deletions L24-webServer/docker/runDb.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
docker kill pg-docker
docker run --rm --name pg-docker \
-e POSTGRES_PASSWORD=pwd \
-e POSTGRES_USER=usr \
-e POSTGRES_DB=demoDB \
-p 5430:5432 \
postgres:12
24 changes: 24 additions & 0 deletions L24-webServer/src/main/java/ru/otus/TransactionManagerFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package ru.otus;

import org.hibernate.cfg.Configuration;
import ru.otus.from_orm_hw.core.repository.HibernateUtils;
import ru.otus.from_orm_hw.core.sessionmanager.TransactionManager;
import ru.otus.from_orm_hw.core.sessionmanager.TransactionManagerHibernate;
import ru.otus.from_orm_hw.crm.model.Address;
import ru.otus.from_orm_hw.crm.model.Client;
import ru.otus.from_orm_hw.crm.model.Phone;
import ru.otus.model.User;

public class TransactionManagerFactory {

public static final String HIBERNATE_CFG_FILE = "hibernate.cfg.xml";

public static TransactionManager initTransactionManager() {
var configuration = new Configuration().configure(HIBERNATE_CFG_FILE);

var sessionFactory =
HibernateUtils.buildSessionFactory(configuration, Client.class, Address.class, Phone.class, User.class);

return new TransactionManagerHibernate(sessionFactory);
}
}
16 changes: 13 additions & 3 deletions L24-webServer/src/main/java/ru/otus/WebServerSimpleDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,14 @@

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import ru.otus.dao.InMemoryUserDao;
import ru.otus.dao.ClientDao;
import ru.otus.dao.DbClientDao;
import ru.otus.dao.DbUserDao;
import ru.otus.dao.UserDao;
import ru.otus.from_orm_hw.core.repository.DataTemplateHibernate;
import ru.otus.from_orm_hw.core.sessionmanager.TransactionManager;
import ru.otus.from_orm_hw.crm.model.Client;
import ru.otus.model.User;
import ru.otus.server.UsersWebServer;
import ru.otus.server.UsersWebServerSimple;
import ru.otus.services.TemplateProcessor;
Expand All @@ -26,11 +32,15 @@ public class WebServerSimpleDemo {
private static final String TEMPLATES_DIR = "/templates/";

public static void main(String[] args) throws Exception {
UserDao userDao = new InMemoryUserDao();
TransactionManager tm = TransactionManagerFactory.initTransactionManager();

UserDao userDao = new DbUserDao(tm, new DataTemplateHibernate<>(User.class));
ClientDao clientDao = new DbClientDao(tm, new DataTemplateHibernate<>(Client.class));
Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
TemplateProcessor templateProcessor = new TemplateProcessorImpl(TEMPLATES_DIR);

UsersWebServer usersWebServer = new UsersWebServerSimple(WEB_SERVER_PORT, userDao, gson, templateProcessor);
UsersWebServer usersWebServer =
new UsersWebServerSimple(WEB_SERVER_PORT, userDao, clientDao, gson, templateProcessor);

usersWebServer.start();
usersWebServer.join();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,15 @@
import org.eclipse.jetty.security.LoginService;
import org.eclipse.jetty.util.resource.PathResourceFactory;
import org.eclipse.jetty.util.resource.Resource;
import ru.otus.dao.InMemoryUserDao;
import ru.otus.dao.ClientDao;
import ru.otus.dao.DbClientDao;
import ru.otus.dao.DbUserDao;
import ru.otus.dao.UserDao;
import ru.otus.from_orm_hw.core.repository.DataTemplateHibernate;
import ru.otus.from_orm_hw.core.sessionmanager.TransactionManager;
import ru.otus.from_orm_hw.crm.model.Client;
import ru.otus.helpers.FileSystemHelper;
import ru.otus.model.User;
import ru.otus.server.UsersWebServer;
import ru.otus.server.UsersWebServerWithBasicSecurity;
import ru.otus.services.TemplateProcessor;
Expand All @@ -34,7 +40,11 @@ public class WebServerWithBasicSecurityDemo {
private static final String REALM_NAME = "AnyRealm";

public static void main(String[] args) throws Exception {
UserDao userDao = new InMemoryUserDao();
TransactionManager tm = TransactionManagerFactory.initTransactionManager();

UserDao userDao = new DbUserDao(tm, new DataTemplateHibernate<>(User.class));
ClientDao clientDao = new DbClientDao(tm, new DataTemplateHibernate<>(Client.class));

Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
TemplateProcessor templateProcessor = new TemplateProcessorImpl(TEMPLATES_DIR);

Expand All @@ -46,8 +56,8 @@ public static void main(String[] args) throws Exception {
LoginService loginService = new HashLoginService(REALM_NAME, configResource);
// LoginService loginService = new InMemoryLoginServiceImpl(userDao); // NOSONAR

UsersWebServer usersWebServer =
new UsersWebServerWithBasicSecurity(WEB_SERVER_PORT, loginService, userDao, gson, templateProcessor);
UsersWebServer usersWebServer = new UsersWebServerWithBasicSecurity(
WEB_SERVER_PORT, loginService, userDao, clientDao, gson, templateProcessor);

usersWebServer.start();
usersWebServer.join();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,14 @@

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import ru.otus.dao.InMemoryUserDao;
import ru.otus.dao.ClientDao;
import ru.otus.dao.DbClientDao;
import ru.otus.dao.DbUserDao;
import ru.otus.dao.UserDao;
import ru.otus.from_orm_hw.core.repository.DataTemplateHibernate;
import ru.otus.from_orm_hw.core.sessionmanager.TransactionManager;
import ru.otus.from_orm_hw.crm.model.Client;
import ru.otus.model.User;
import ru.otus.server.UsersWebServer;
import ru.otus.server.UsersWebServerWithFilterBasedSecurity;
import ru.otus.services.TemplateProcessor;
Expand All @@ -28,13 +34,17 @@ public class WebServerWithFilterBasedSecurityDemo {
private static final String TEMPLATES_DIR = "/templates/";

public static void main(String[] args) throws Exception {
UserDao userDao = new InMemoryUserDao();
TransactionManager tm = TransactionManagerFactory.initTransactionManager();

UserDao userDao = new DbUserDao(tm, new DataTemplateHibernate<>(User.class));
ClientDao clientDao = new DbClientDao(tm, new DataTemplateHibernate<>(Client.class));

Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create();
TemplateProcessor templateProcessor = new TemplateProcessorImpl(TEMPLATES_DIR);
UserAuthService authService = new UserAuthServiceImpl(userDao);

UsersWebServer usersWebServer = new UsersWebServerWithFilterBasedSecurity(
WEB_SERVER_PORT, authService, userDao, gson, templateProcessor);
WEB_SERVER_PORT, authService, userDao, clientDao, gson, templateProcessor);

usersWebServer.start();
usersWebServer.join();
Expand Down
20 changes: 20 additions & 0 deletions L24-webServer/src/main/java/ru/otus/dao/ClientDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.otus.dao;

import java.util.List;
import java.util.Optional;
import ru.otus.from_orm_hw.crm.model.Client;

public interface ClientDao {

Optional<Client> findById(long id);

List<Client> getAll();

Optional<Client> createClient(Client client);

Optional<Client> addPhone(Long clientId, String number);

Optional<Client> deletePhone(Long clientId, String number);

Optional<Client> updateAddress(Long clientId, String address);
}
99 changes: 99 additions & 0 deletions L24-webServer/src/main/java/ru/otus/dao/DbClientDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package ru.otus.dao;

import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.otus.from_orm_hw.core.repository.DataTemplate;
import ru.otus.from_orm_hw.core.sessionmanager.TransactionManager;
import ru.otus.from_orm_hw.crm.model.Address;
import ru.otus.from_orm_hw.crm.model.Client;
import ru.otus.from_orm_hw.crm.model.Phone;

public class DbClientDao implements ClientDao {

private final Logger logger = LoggerFactory.getLogger(DbClientDao.class);

private final TransactionManager tm;
private final DataTemplate<Client> dataTemplate;

public DbClientDao(TransactionManager tm, DataTemplate<Client> dataTemplate) {
this.tm = tm;
this.dataTemplate = dataTemplate;
}

@Override
public Optional<Client> findById(long id) {
return tm.doInReadOnlyTransaction(session -> {
var clientOptional = dataTemplate.findById(session, id);
logger.info("user: {}", clientOptional);
return clientOptional;
});
}

@Override
public List<Client> getAll() {
return tm.doInReadOnlyTransaction(session -> {
var clientsOptional = dataTemplate.findAll(session);
logger.info("user: {}", clientsOptional);
return clientsOptional;
});
}

@Override
public Optional<Client> createClient(final Client client) {
return tm.doInTransaction(session -> {
Client createdClient = dataTemplate.insert(session, client);
return Optional.ofNullable(createdClient);
});
}

@Override
public Optional<Client> addPhone(final Long clientId, final String number) {

return updateClient(clientId, client -> {
Phone phone = new Phone();
phone.setNumber(number);

client.getPhones().add(phone);
return client;
});
}

@Override
public Optional<Client> deletePhone(final Long clientId, final String number) {

return updateClient(clientId, client -> {
client.getPhones().removeIf(p -> p.getNumber().equals(number));

return client;
});
}

@Override
public Optional<Client> updateAddress(final Long clientId, final String address) {

return updateClient(clientId, client -> {
Address newAddress = new Address();
newAddress.setStreet(address);

client.setAddress(newAddress);

return client;
});
}

private Optional<Client> updateClient(Long clientId, Function<Client, Client> operation) {
return tm.doInTransaction(session -> {
var clientOptional = dataTemplate.findById(session, clientId);

if (clientOptional.isPresent()) {
Client client = clientOptional.get();

return Optional.ofNullable(session.merge(operation.apply(client)));
}
return Optional.empty();
});
}
}
61 changes: 61 additions & 0 deletions L24-webServer/src/main/java/ru/otus/dao/DbUserDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package ru.otus.dao;

import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.otus.from_orm_hw.core.repository.DataTemplate;
import ru.otus.from_orm_hw.core.sessionmanager.TransactionManager;
import ru.otus.model.User;

public class DbUserDao implements UserDao {

private final Logger logger = LoggerFactory.getLogger(DbUserDao.class);

private final TransactionManager tm;
private final DataTemplate<User> dataTemplate;

public DbUserDao(TransactionManager tm, DataTemplate<User> dataTemplate) {
this.tm = tm;
this.dataTemplate = dataTemplate;
}

@Override
public Optional<User> findById(long id) {
return tm.doInReadOnlyTransaction(session -> {
var userOptional = dataTemplate.findById(session, id);
logger.info("user: {}", userOptional);
return userOptional;
});
}

@Override
public Optional<User> findRandomUser() {

return tm.doInTransaction(session -> {
User userNullable = session.createQuery("FROM User ORDER BY random()", User.class)
.setMaxResults(1)
.uniqueResult();

return Optional.ofNullable(userNullable);
});
}

@Override
public Optional<User> findByLogin(String login) {
return tm.doInReadOnlyTransaction(session -> {
User usr = session.createQuery("FROM User WHERE login = :login", User.class)
.setParameter("login", login)
.uniqueResult();

return Optional.ofNullable(usr);
});
}

@Override
public Optional<User> createUser(final User user) {
return tm.doInTransaction(session -> {
User usr = dataTemplate.insert(session, user);
return Optional.ofNullable(usr);
});
}
}
7 changes: 7 additions & 0 deletions L24-webServer/src/main/java/ru/otus/dao/InMemoryUserDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,11 @@ public Optional<User> findRandomUser() {
public Optional<User> findByLogin(String login) {
return users.values().stream().filter(v -> v.getLogin().equals(login)).findFirst();
}

@Override
public Optional<User> createUser(final User user) {
long nextId = users.keySet().stream().max(Long::compare).get() + 1;

return Optional.of(users.put(nextId, user));
}
}
2 changes: 2 additions & 0 deletions L24-webServer/src/main/java/ru/otus/dao/UserDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ public interface UserDao {
Optional<User> findRandomUser();

Optional<User> findByLogin(String login);

Optional<User> createUser(User user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.otus.from_orm_hw.core.repository;

import java.util.List;
import java.util.Optional;
import org.hibernate.Session;

public interface DataTemplate<T> {
Optional<T> findById(Session session, long id);

List<T> findByEntityField(Session session, String entityFieldName, Object entityFieldValue);

List<T> findAll(Session session);

T insert(Session session, T object);

T update(Session session, T object);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.otus.from_orm_hw.core.repository;

public class DataTemplateException extends RuntimeException {
public DataTemplateException(Exception ex) {
super(ex);
}
}
Loading