This repository has been archived on 2021-12-05. You can view files and clone it, but cannot push or open issues or pull requests.
envoy/src/main/java/envoy/server/database/PersistenceManager.java

201 lines
5.8 KiB
Java
Raw Normal View History

2020-01-03 16:21:35 +01:00
package envoy.server.database;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import envoy.server.data.ConfigItem;
import envoy.server.data.Message;
import envoy.server.data.User;
2020-01-03 16:21:35 +01:00
/**
* Project: <strong>envoy-server-standalone</strong><br>
* File: <strong>PersistenceManager.java</strong><br>
* Created: <strong>1 Jan 2020</strong><br>
*
2020-01-03 16:21:35 +01:00
* @author Leon Hofmeister
* @since Envoy Server Standalone v0.1-alpha
*/
public class PersistenceManager {
private final EntityManager entityManager = Persistence.createEntityManagerFactory("envoy").createEntityManager();
private final EntityTransaction transaction = entityManager.getTransaction();
private static final PersistenceManager persistenceManager = new PersistenceManager();
/**
* Creates the singleton instance of the @link{PersistenceManager}.
*
* @since Envoy Server Standalone v0.1-alpha
*/
private PersistenceManager() {
transaction.begin();
Runtime.getRuntime().addShutdownHook(new Thread(() -> transaction.commit()));
}
/**
* @return the {@link PersistenceManager} singleton
* @since Envoy Server Standalone v0.1-alpha
*/
public static PersistenceManager getPersistenceManager() { return persistenceManager; }
/**
* Adds a {@link User} to the database.
*
* @param User the {@link User} to add to the database
* @since Envoy Server Standalone v0.1-alpha
*/
public void addUser(User User) {
entityManager.persist(User);
entityManager.flush();
}
/**
* Adds a {@link Message} to the database.
*
* @param message the {@link Message} to add to the database
* @since Envoy Server Standalone v0.1-alpha
*/
public void addMessage(Message message) {
entityManager.persist(message);
entityManager.flush();
}
/**
* Adds a {@link ConfigItem} to the database.
*
* @param configItem the {@link ConfigItem} to add to the database
* @since Envoy Server Standalone v0.1-alpha
*/
public void addConfigItem(ConfigItem configItem) {
entityManager.persist(configItem);
entityManager.flush();
}
/**
* Updates a {@link User} in the database
*
* @param user the {@link User} to add to the database
* @since Envoy Server Standalone v0.1-alpha
*/
public void updateUser(User user) {
entityManager.merge(user);
entityManager.flush();
}
/**
* Updates a {@link Message} in the database.
*
* @param message the message to update
* @since Envoy Server Standalone v0.1-alpha
*/
public void updateMessage(Message message) {
entityManager.merge(message);
entityManager.flush();
}
/**
* Updates a {@link ConfigItem} in the database.
*
* @param configItem the configItem to update
* @since Envoy Server Standalone v0.1-alpha
*/
public void updateConfigItem(ConfigItem configItem) {
entityManager.merge(configItem);
entityManager.flush();
}
/**
* Deletes a {@link User} in the database.
*
* @param user the {@link User} to delete
* @since Envoy Server Standalone v0.1-alpha
*/
public void deleteUser(User user) {
entityManager.remove(user);
entityManager.flush();
}
/**
* Deletes a {@link Message} in the database.
*
* @param message the {@link Message} to delete
* @since Envoy Server Standalone v0.1-alpha
*/
public void deleteMessage(Message message) {
entityManager.remove(message);
entityManager.flush();
}
/**
* Searches for a {@link User} with a specific id.
*
* @param id the id to search for
* @return the user with the specified id
* @since Envoy Server Standalone v0.1-alpha
*/
public User getUserById(long id) { return entityManager.find(User.class, id); }
/**
* Searched for a {@link User} with a specific name.
*
* @param name the name of the user
* @return the user with the specified name
* @since Envoy Server Standalone v0.1-alpha
*/
public User getUserByName(String name) {
return (User) entityManager.createNamedQuery("getUserByName").setParameter("name", name).getSingleResult();
}
/**
* Searches for a {@link Message} with a specific id.
*
* @param id the id to search for
* @return the message with the specified id
* @since Envoy Server Standalone v0.1-alpha
*/
public Message getMessageById(long id) { return entityManager.find(Message.class, id); }
/**
* @param key the name of this {@link ConfigItem}
* @return the {@link ConfigItem} with the given name
* @since Envoy Server Standalone v0.1-alpha
*/
public ConfigItem getConfigItemById(String key) { return entityManager.find(ConfigItem.class, key); }
/**
* Returns all messages received while being offline.
*
* @param user - the user who wants to receive his unread messages
* @return all messages that the client does not yet have (unread messages)
* @since Envoy Server Standalone v0.1-alpha
*/
2020-01-04 15:50:05 +01:00
public List<Message> getUnreadMessages(User user) {
return entityManager.createNamedQuery("getUnreadMessages").setParameter("recipient", user).getResultList();
}
2020-02-08 13:53:58 +01:00
public List<User> searchUsers(String searchPhrase) {
2020-02-08 14:27:21 +01:00
return entityManager.createNamedQuery("searchUsers").setParameter("searchPhrase", searchPhrase + "%").getResultList();
2020-02-08 13:53:58 +01:00
}
public void addContact(long userId, long contactId) {
User c1 = getUserById(userId);
User c2 = getUserById(contactId);
c1.getContacts().add(c2);
c2.getContacts().add(c1);
updateUser(c1);
updateUser(c2);
}
/**
* @param user the User whose contacts should be retrieved
* @return the contacts of this User - currently everyone using Envoy
* @since Envoy Server Standalone v0.1-alpha
*/
public List<User> getContacts(User user) { return entityManager.createQuery("FROM User").getResultList(); }
// TODO current solution gets all users, not just contacts. Should be changed to
// entityManager.createNamedQuery("getContactsOfUser").setParameter("user",
// user).getResultList();
}