package br.com.citframework.service;
import java.util.Collection;
import org.apache.log4j.Logger;
import br.com.citframework.dto.IDto;
import br.com.citframework.dto.Usuario;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.CrudDAO;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.integracao.TransactionControlerImpl;
import br.com.citframework.util.UtilI18N;
public abstract class CrudServiceImpl implements CrudService, IService {
private static final Logger LOGGER = Logger.getLogger(CrudServiceImpl.class);
protected abstract CrudDAO getDao();
protected void validaCreate(final Object obj) throws Exception {}
protected void validaUpdate(final Object obj) throws Exception {}
protected void validaDelete(final Object obj) throws Exception {}
protected void validaFind(final Object obj) throws Exception {}
protected Usuario usuario;
@Override
public IDto create(final IDto model) throws ServiceException, LogicException {
IDto createdModel = model;
// Instancia Objeto controlador de transacao
final CrudDAO crudDao = this.getDao();
final TransactionControler tc = new TransactionControlerImpl(crudDao.getAliasDB());
try {
// Faz validacao, caso exista.
this.validaCreate(model);
// Seta o TransactionController para os DAOs
crudDao.setTransactionControler(tc);
// Inicia transacao
tc.start();
// Executa operacoes pertinentes ao negocio.
createdModel = crudDao.create(model);
// Faz commit e fecha a transacao.
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
return createdModel;
}
@Override
public IDto restore(final IDto model) throws ServiceException, LogicException {
try {
return this.getDao().restore(model);
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceException(e);
}
}
@Override
public void update(final IDto model) throws ServiceException, LogicException {
// Instancia Objeto controlador de transacao
final CrudDAO crudDao = this.getDao();
final TransactionControler tc = new TransactionControlerImpl(crudDao.getAliasDB());
try {
// Faz validacao, caso exista.
this.validaUpdate(model);
// Seta o TransactionController para os DAOs
crudDao.setTransactionControler(tc);
// Inicia transacao
tc.start();
// Executa operacoes pertinentes ao negocio.
crudDao.update(model);
// Faz commit e fecha a transacao.
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
}
@Override
public void delete(final IDto model) throws ServiceException, LogicException {
// Instancia Objeto controlador de transacao
final CrudDAO crudDao = this.getDao();
final TransactionControler tc = new TransactionControlerImpl(crudDao.getAliasDB());
try {
// Faz validacao, caso exista.
this.validaDelete(model);
// Seta o TransactionController para os DAOs
crudDao.setTransactionControler(tc);
// Inicia transacao
tc.start();
// Executa operacoes pertinentes ao negocio.
crudDao.delete(model);
// Faz commit e fecha a transacao.
tc.commit();
tc.close();
} catch (final Exception e) {
this.rollbackTransaction(tc, e);
}
}
@Override
public Collection list() throws ServiceException, LogicException {
try {
return this.getDao().list();
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceException(e);
}
}
@Override
public Collection find(final IDto obj) throws LogicException, ServiceException {
try {
this.validaFind(obj);
return this.getDao().find(obj);
} catch (final Exception e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceException(e);
}
}
/**
* Mensagem do arquivo Properties
*
* @param key
* @return Mensagem Internacionalizada
*/
public String i18nMessage(final String key) {
if (usuario != null) {
final String value = UtilI18N.internacionaliza(usuario.getLocale(), key);
if (value != null) {
return value;
}
}
return key;
}
/**
* Recupera uma mensagem internacilizada, de acordo com o {@code locale}, formatando-a com os {@code params}, caso informados
*
* @param locale
* locale para buscar o valor da {@code key}
* @param key
* chave a ser procurada
* @param params
* par�metros para formata��o, caso haja
* @return
* @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a>
* @since 30/09/2014
*/
public String i18nMessage(final String locale, final String key, final Object... params) {
return UtilI18N.internacionaliza(locale, key, params);
}
protected void rollbackTransaction(final TransactionControler tc, final Exception ex) throws ServiceException, LogicException {
LOGGER.warn(ex.getMessage(), ex);
if (tc != null) {
try {
if (tc.isStarted()) { // Se estiver startada, entao faz roolback.
tc.rollback();
}
tc.closeQuietly();
} catch (final Exception e) {
LOGGER.warn(e.getMessage(), e);
}
}
if (ex instanceof LogicException) {
throw (LogicException) ex;
}
throw new ServiceException(ex);
}
@Override
public void setUsuario(final Usuario usuario) {
this.usuario = usuario;
}
}