/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.pieShare.pieShareApp.service.database; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Parameter; import javax.persistence.Query; import javax.persistence.TypedQuery; import org.pieShare.pieShareApp.model.PieUser; import org.pieShare.pieShareApp.model.entities.FilterEntity; import org.pieShare.pieShareApp.model.entities.PieFileEntity; import org.pieShare.pieShareApp.model.entities.PieUserEntity; import org.pieShare.pieShareApp.model.entities.api.IBaseEntity; import org.pieShare.pieShareApp.model.pieFile.PieFile; import org.pieShare.pieShareApp.service.configurationService.api.IConfigurationFactory; import org.pieShare.pieShareApp.service.database.api.IDatabaseService; import org.pieShare.pieShareApp.service.database.api.IModelEntityConverterService; import org.pieShare.pieShareApp.service.database.api.IPieDatabaseManagerFactory; import org.pieShare.pieShareApp.service.fileFilterService.filters.RegexFileFilter; import org.pieShare.pieShareApp.service.fileFilterService.filters.api.IFilter; import org.pieShare.pieTools.pieUtilities.service.base64Service.api.IBase64Service; import org.pieShare.pieTools.pieUtilities.service.beanService.IBeanService; import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger; public class DatabaseService implements IDatabaseService { private IPieDatabaseManagerFactory pieDatabaseManagerFactory; private EntityManagerFactory emf; private IBase64Service base64Service; private IBeanService beanService; private IConfigurationFactory configurationFactory; private IModelEntityConverterService modelEntityConverterService; public void setModelEntityConverterService(IModelEntityConverterService modelEntityConverterService) { this.modelEntityConverterService = modelEntityConverterService; } public void setConfigurationFactory(IConfigurationFactory configurationFactory) { this.configurationFactory = configurationFactory; } public void setPieDatabaseManagerFactory(IPieDatabaseManagerFactory factory) { this.pieDatabaseManagerFactory = factory; } public void setBase64Service(IBase64Service base64Service) { this.base64Service = base64Service; } public void setBeanService(IBeanService beanService) { this.beanService = beanService; } @Override public void persist(PieUser model) { PieUserEntity entity; entity = this.modelEntityConverterService.convertToEntity(model); persist(entity); } @Override public ArrayList<PieUser> findAllPieUser() { EntityManager em = pieDatabaseManagerFactory.getEntityManger(PieUserEntity.class); Query query = em.createQuery(String.format("SELECT e FROM %s e", PieUserEntity.class.getSimpleName()), PieUserEntity.class); PieUser user = null; ArrayList<PieUserEntity> entities; ArrayList<PieUser> models = new ArrayList<>(); if (query.getResultList().isEmpty()) { return null; } entities = (ArrayList<PieUserEntity>) query.getResultList(); entities.forEach((en) -> { try { models.add(modelEntityConverterService.convertFromEntity(en)); } catch (Exception ex) { PieLogger.error(this.getClass(), "Error converting Entity", ex); } }); return models; } @Override public void removePieUser(PieUser user) { PieUserEntity ent; ent = modelEntityConverterService.convertToEntity(user); remove(ent); } @Override public void mergePieUser(PieUser user) { PieUserEntity entity; entity = modelEntityConverterService.convertToEntity(user); merge(entity); } @Override public void persistFileFilter(IFilter filter) { FilterEntity en = null; en = modelEntityConverterService.convertToEntity(filter); persist(en); } @Override public void removeFileFilter(IFilter filter) { FilterEntity f; f = modelEntityConverterService.convertToEntity(filter); remove(f); } @Override public ArrayList<IFilter> findAllFilters() { EntityManager em = pieDatabaseManagerFactory.getEntityManger(FilterEntity.class); Query query = em.createQuery(String.format("SELECT e FROM %s e", FilterEntity.class.getSimpleName()), FilterEntity.class); ArrayList<IFilter> list = new ArrayList<>(); if (query.getResultList().isEmpty()) { return list; } for (FilterEntity entity : (Collection<FilterEntity>) query.getResultList()) { RegexFileFilter filter = modelEntityConverterService.convertFromEntity(entity); list.add(filter); } return list; } public void persist(PieFile file) { PieFileEntity entity; entity = this.modelEntityConverterService.convertToEntity(file); this.persist(entity); } private void persist(IBaseEntity entity) { EntityManager em = pieDatabaseManagerFactory.getEntityManger(entity.getClass()); em.getTransaction().begin(); em.persist(entity); em.getTransaction().commit(); } private synchronized void merge(IBaseEntity entity) { EntityManager em = pieDatabaseManagerFactory.getEntityManger(entity.getClass()); em.getTransaction().begin(); em.merge(entity); em.getTransaction().commit(); } private void remove(IBaseEntity entity) { EntityManager em = pieDatabaseManagerFactory.getEntityManger(entity.getClass()); em.getTransaction().begin(); em.remove(entity); em.getTransaction().commit(); } @Override public PieFile findPieFile(PieFile file) { EntityManager em = pieDatabaseManagerFactory.getEntityManger(PieFileEntity.class); PieFileEntity historyFileEntity = em.find(PieFileEntity.class, file.getRelativeFilePath()); return this.modelEntityConverterService.convertFromEntity(historyFileEntity); } @Override public void mergePieFile(PieFile file) { PieFileEntity entity = this.modelEntityConverterService.convertToEntity(file); merge(entity); } @Override public void persistPieFile(PieFile file) { PieFileEntity entity = this.modelEntityConverterService.convertToEntity(file); persist(entity); } @Override public List<PieFile> findAllUnsyncedPieFiles() { EntityManager em = pieDatabaseManagerFactory.getEntityManger(PieFileEntity.class); String sqlQuery = String.format("SELECT f FROM %s f WHERE f.synched=TRUE", PieFileEntity.class.getSimpleName()); TypedQuery<PieFileEntity> query = em.createQuery(sqlQuery, PieFileEntity.class); ArrayList<PieFile> files = new ArrayList<>(); List<PieFileEntity> entities = query.getResultList(); for(PieFileEntity entity: entities) { files.add(this.modelEntityConverterService.convertFromEntity(entity)); } return files; } @Override public void resetAllPieFileSynchedFlags() { EntityManager em = pieDatabaseManagerFactory.getEntityManger(PieFileEntity.class); String sqlQuery = String.format("UPDATE %s SET synched=TRUE", PieFileEntity.class.getSimpleName()); TypedQuery<PieFileEntity> query = em.createQuery(sqlQuery, PieFileEntity.class); em.getTransaction().begin(); query.executeUpdate(); em.getTransaction().commit(); } @Override public List<PieFile> findAllPieFiles() { EntityManager em = pieDatabaseManagerFactory.getEntityManger(PieFileEntity.class); String sqlQuery = String.format("SELECT f FROM %s f", PieFileEntity.class.getSimpleName()); TypedQuery<PieFileEntity> query = em.createQuery(sqlQuery, PieFileEntity.class); ArrayList<PieFile> files = new ArrayList<>(); List<PieFileEntity> entities = query.getResultList(); for(PieFileEntity entity: entities) { files.add(this.modelEntityConverterService.convertFromEntity(entity)); } return files; } }