Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* JavaBeanStack FrameWork
*
* Copyright (C) 2017 Jorge Enciso
* Email: [email protected]
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.javabeanstack.data;
import org.javabeanstack.data.model.DataResult;
import org.javabeanstack.data.model.DataSet;
import org.javabeanstack.datactrl.IDataObject;
import org.javabeanstack.error.ErrorManager;
import org.javabeanstack.error.IErrorReg;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Parameter;
import javax.persistence.Query;
import javax.persistence.Table;
import javax.persistence.criteria.CriteriaQuery;
import javax.transaction.Status;
import javax.transaction.TransactionSynchronizationRegistry;
import org.apache.log4j.Logger;
import org.javabeanstack.annotation.AuditEntity;
import org.javabeanstack.data.events.IDAOEvents;
import org.javabeanstack.error.ErrorReg;
import org.javabeanstack.exceptions.CompanyError;
import org.javabeanstack.exceptions.SessionError;
import org.javabeanstack.log.ILogManager;
import org.javabeanstack.model.IAppCompany;
import org.javabeanstack.model.IAppMessage;
import org.javabeanstack.security.IOAuthConsumerData;
import org.javabeanstack.security.ISessions;
import org.javabeanstack.security.model.IUserSession;
import org.javabeanstack.util.Fn;
import static org.javabeanstack.util.Fn.nvl;
import org.javabeanstack.util.Parameters;
import org.javabeanstack.util.Strings;
/**
* Esta clase se encarga de la conexión con la base de datos. Provee metodos que
* permiten la recuperación, busqueda, refresco, borrado, inserción y
* actualización de los registros. Esta clase se ejecuta como EJB en la capa de
* la lógica del negocio.
*
* @author Jorge Enciso
*/
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public abstract class AbstractDAO implements IGenericDAO {
private static final Logger LOGGER = Logger.getLogger(AbstractDAO.class);
private static final String DEFAULT_SCHEMA_PROPERTY = "hibernate.default_schema";
public static final String FALSE = "false";
public static final String TRUE = "true";
@Resource
TransactionSynchronizationRegistry tsr;
/**
* Es el objeto responsable de la creación y gestión de los entity manager
*/
@EJB
private IDBManager dbManager;
/**
* Es el objeto responsable gestión de las sesiones de usuarios
*/
@EJB
private ISessions sessions;
@EJB
private ILogManager logManager;
public AbstractDAO() {
}
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public IDBLinkInfo getDBLinkInfo(String sessionId) {
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
return dbLinkInfo;
}
/**
* Devuelve un entity manager. Se crea un entity manager por cada thread y
* unidad de persistencia o por cada sesión de usuario y unidad de
* persistencia.
*
* @param keyId
* @return un entity manager
*/
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
protected EntityManager getEntityManager(String keyId) {
String persistUnit = keyId.substring(0, keyId.indexOf(':')).toLowerCase();
LOGGER.debug("getEntityManager()");
LOGGER.debug("pu: " + persistUnit + ", id: " + keyId);
return dbManager.getEntityManager(keyId);
}
/**
* Recupera todos los registros de una tabla
*
* @param
* @param entityClass clase mapeada a la tabla
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @return un list con los registros de una tabla
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findAll(Class entityClass,
String sessionId) throws Exception {
LOGGER.debug(Strings.replicate("-", 50));
LOGGER.debug("findAll");
LOGGER.debug(entityClass.toString());
IDBLinkInfo dbLinkInfo = getDBLinkInfo(sessionId);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
CriteriaQuery cq = em.getCriteriaBuilder().createQuery(entityClass);
cq.select(cq.from(entityClass));
return em.createQuery(cq).getResultList();
}
/**
* Devuelve un registro de una tabla dada
*
* @param
* @param entityClass clase mapeada a la tabla
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param id identificador del registro
* @return un registro solicitado
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public T findById(Class entityClass,
String sessionId,
Object id) throws Exception {
LOGGER.debug(Strings.replicate("-", 50));
LOGGER.debug("find");
LOGGER.debug(entityClass.toString());
if (id == null) {
return null;
}
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
T row = em.find(entityClass, id);
if (row == null) {
return null;
}
// Si no hay transacción activada
if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
return row;
}
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(row.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(row);
obj.size();
}
}
return row;
}
/**
* Devuelve un registro a travéz de su clave unica.
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param ejb objeto ejb con los datos de la clave unica
* @return un registro que cumple la condición de la clave unica solicitada.
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public T findByUk(String sessionId, T ejb) throws Exception {
LOGGER.debug(Strings.replicate("-", 50));
LOGGER.debug("findByUk");
LOGGER.debug(ejb.getClass().getSimpleName());
// Verificar que exista manera de generar la sentencia para buscar
// el registro o de lo contrario va a dar error.
if (ejb.getQueryUK() == null) {
return null;
}
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
// Buscar registro por la clave unica
T row;
Query q = getEntityManager(getEntityId(dbLinkInfo)).createQuery(ejb.getQueryUK());
for (Parameter param : q.getParameters()) {
q.setParameter(param, ejb.getValue(param.getName()));
}
try {
row = (T) q.getSingleResult();
// Si no hay transacción activada
if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
return row;
}
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(row.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(row);
obj.size();
}
}
} catch (NoResultException exp) {
row = null;
}
return row;
}
/**
* Devuelve una lista de registros de una tabla dada
*
* @param
* @param entityClass clase mapeada a la tabla
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @return lista de objetos
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List find(Class entityClass, String sessionId) throws Exception {
return find(entityClass, sessionId, null, null, null, 0, 0);
}
/**
* Devuelve una lista de registros de una tabla dada
*
* @param
* @param entityClass clase mapeada a la tabla
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param order
* @param filter
* @param params
* @return lista de objetos
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List find(Class entityClass, String sessionId,
String order, String filter, Map params) throws Exception {
return find(entityClass, sessionId, order, filter, params, 0, 0);
}
/**
* Devuelve una lista de registro de una tabla dada
*
* @param
* @param entityClass clase mapeada a la tabla
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param order
* @param filter
* @param params
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return lista de objetos
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List find(Class entityClass, String sessionId, String order, String filter, Map params, int first, int max) throws Exception {
String query = "select o from " + entityClass.getSimpleName() + " o ";
if (filter == null) {
filter = "";
}
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
T entity = entityClass.getConstructor().newInstance();
// Si se va a aplicar el filtro por defecto
if (entity.isApplyDBFilter()) {
String operator = (filter.isEmpty() ? "" : " and ");
IDBFilter dbFilter = dbLinkInfo.getDBFilter();
if (dbFilter != null) {
String dbFilterExpr = dbFilter.getFilterExpr(entityClass, "");
if (!Strings.isNullorEmpty(dbFilterExpr)) {
filter = dbFilterExpr + operator + filter;
}
}
}
//Filtro
if (!Strings.isNullorEmpty(filter)) {
query += " where " + filter;
}
//Orden
if (!Strings.isNullorEmpty(order)) {
query += " order by " + order;
}
return this.findListByQuery(sessionId, query, params, first, max);
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param queryString sentencia jpql
* @param parameters parametros de la sentencia
* @return un objeto con valores del registro de la tabla solicitada
* @throws Exception
*/
@Override
public T findByQuery(String sessionId,
String queryString, Map parameters)
throws Exception {
LOGGER.debug(Strings.replicate("-", 50));
LOGGER.debug("findByQuery");
LOGGER.debug(queryString);
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createQuery(queryString);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, queryString);
}
T result;
try {
result = (T) query.getSingleResult();
// Si no hay transacción activada
if (Status.STATUS_NO_TRANSACTION == tsr.getTransactionStatus()) {
return result;
}
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(result.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(result);
obj.size();
}
}
} catch (NoResultException exp) {
result = null;
} catch (Exception exp) {
ErrorManager.showError(exp, LOGGER);
throw exp;
}
LOGGER.debug("-RESULT-");
LOGGER.debug(result);
return result;
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param queryString sentencia jpql
* @param parameters parametros de la sentencia
* @return una lista de objetos conteniendo los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByQuery(String sessionId,
String queryString,
Map parameters) throws Exception {
return findListByQuery(sessionId, queryString, parameters, 0, 0);
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param queryString sentencia jpql
* @param parameters parametros de la sentencia
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos conteniendo los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByQuery(String sessionId,
String queryString,
Map parameters,
int first, int max) throws Exception {
LOGGER.debug(Strings.replicate("-", 50));
LOGGER.debug("findListByQuery");
LOGGER.debug(queryString);
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createQuery(queryString);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, queryString);
}
if (max > 0) {
query.setFirstResult(first);
query.setMaxResults(max);
}
return (List) query.getResultList();
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param queryString sentencia jpql
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos conteniendo los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByQuery(String sessionId,
String queryString,
int first, int max) throws Exception {
Map parameters = new HashMap<>();
return findListByQuery(sessionId, queryString, parameters, first, max);
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param namedQuery namedQuery
* @param parameters parámetros de la sentencia.
* @return un objeto con los datos del registro de la tabla solicitada
* @throws Exception
*/
@Override
public T findByNamedQuery(String sessionId,
String namedQuery,
Map parameters) throws Exception {
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createNamedQuery(namedQuery);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, null);
}
query.setMaxResults(1);
T result;
try {
result = (T) query.getSingleResult();
// Refrescar lazy members
List fields = DataInfo.getLazyMembers(result.getClass());
if (!fields.isEmpty()) {
List obj;
for (Field field : fields) {
field.setAccessible(true);
obj = (List) field.get(result);
obj.size();
}
}
} catch (NoResultException exp) {
result = null;
}
return result;
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param namedQuery namedQuery
* @param parameters parámetros de la sentencia.
* @return una lista de objetos con los datos de los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByNamedQuery(String sessionId,
String namedQuery,
Map parameters)
throws Exception {
return findListByNamedQuery(sessionId, namedQuery, parameters, 0, 0);
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param namedQuery namedQuery
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos con los datos de los registros de la tabla
* solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByNamedQuery(String sessionId,
String namedQuery,
int first, int max)
throws Exception {
Map parameters = new HashMap<>();
return findListByNamedQuery(sessionId, namedQuery, parameters, first, max);
}
/**
*
* @param
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param namedQuery namedQuery
* @param parameters parámetros de la sentencia.
* @param first a partir de este nro. de registro se va a traer los datos
* @param max cantidad maxima de registros
* @return una lista de objetos con los registros de la tabla solicitada
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List findListByNamedQuery(String sessionId,
String namedQuery,
Map parameters,
int first, int max) throws Exception {
IDBLinkInfo dbLinkInfo = sessions.getDBLinkInfo(sessionId);
EntityManager em = getEntityManager(getEntityId(dbLinkInfo));
Query query = em.createNamedQuery(namedQuery);
if (parameters != null && !parameters.isEmpty()) {
populateQueryParameters(query, parameters, null);
}
if (first > 0 && max > 0) {
query.setFirstResult(first);
query.setMaxResults(max);
}
return (List) query.getResultList();
}
/**
*
* @param sessionId identificador de la sesión que permite realizar las
* operaciones
* @param queryString sentencia sql
* @param parameters parámetros de la sentencia.
* @return una lista de objetos con datos de los registros solicitados
* @throws Exception
*/
@Override
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public List