Parâmetros de Sistema

A estrutura de Parâmetros de Sistema presente no Jmine-Tec permite que sejam cadastrados valores “padrão” a serem utilizados pelo sistema. Sendo esses valores configuráveis para cada cliente por meio de uma tela em que são listados todos os parâmetros.

Cada parâmetro pode ter comportamentos diferentes na tela de configuração dependendo dos valores de alguns de seus atributos. Abaixo podemos verificar a estrutura da entidade com a descrição destes atributos:

public abstract class AbstractSystemParameter<V> extends AuthPersistableBusinessObject {

        private Long id;

        private String mnemonico;

        private String descricao;

        private SystemParameterGroup systemParameterGroup;

        private Boolean visivel; // indica se o parâmetro será visível na tela de configuração

        private Boolean editavel; // indica se o parâmetro será editável na tela de configuração caso o mesmo seja visível

        @Transient
        public abstract V getParametro();

        public abstract void setParametro(V parametro);

        // getters e setters...
}

Grupo de Parâmetros de Sistema

Um grupo de parâmetro de sistema indica a categoria a qual o parâmetro pertence. Exemplos: Infraestrutura, Paginação, Agendamento, Histórico, etc.

É possível cadastrar um novo grupo qualquer via postscript como no exemplo abaixo:

<importacao>
        <services name="System Parameter Group">
                <service name="SystemParameterGroup" action="INCLUIR">
                        <param name="Database Id">1</param>
                        <param name="Mnemônico">INFRA</param>
                </service>
        </services>
</importacao>

Como utilizar os Parâmetros de Sistema

Criando diferentes tipos de Parâmetros

Atualmente, existem três tipos genéricos de parâmetros de sistema na estrutura atual(Boolean, String e BigDecimal). Para criar um parâmetro de outro tipo basta criar uma nova entidade que estenda a classe abstrata AbstractSystemParameter (de preferência com o sufixo SystemParameter) e especificar o novo tipo de parâmetro como no exemplo abaixo:

// Neste exemplo, criaremos um parâmetro de sistema do tipo Entidade
@Entity
@DiscriminatorValue("3") // valor para a coluna no banco que diferencia os tipos (os valores 0, 1 e 2 já estão sendo utilizados pelos tipos genéricos citados anteriormente)
@DiscriminatorComment("ENTIDADE") // Comentário sobre o tipo do valor
@DisplayName(value = "Parâmetro de Sistema - Entidade") // DisplayName para tela de autorização
public class EntidadeSystemParameter extends AbstractSystemParameter<Entidade> {

        private Entidade parametro; // valor do parâmetro que será armazenado

        //getters e setters
        @Override
        public Entidade getParametro() {
                return this.parametro;
        }

        @Override
        public void setParametro(Entidade parametro) {
                this.parametro = parametro;
        }
}

Inserindo Parâmetros de Sistema via postscript

O cadastro de parâmetros de sistema deverá ser realizado via postscript. Para isso, é necessário que exista um serviço de inclusão que extenda o serviço AbstractSystemParameterService para o tipo de parâmetro a ser cadastrado (os tipos genéricos já possuem esse serviço). Neste serviço deverão ser especificados a classe do Parâmetro criado e o tipo do valor do Parâmetro.

Obs: Não é necessário implementar o corpo do serviço pois este já está implementado no AbstractSystemParameterService.

Exemplo:

@ServiceImplementor(action = ActionsEnum.INCLUIR)
public class EntidadeSystemParameterService extends AbstractSystemParameterService<EntidadeSystemParameter, Entidade> {
        // vazio
}

Assim que o serviço for criado, podemos utilizá-lo para incluir um novo registro na base de dados via postscript, lembrando que é necessário que o grupo do parâmetro informado já esteja incluído na base de dados.

Exemplo:

<importacao>
        <services name="Entidade System Parameter">
                <service name="EntidadeSystemParameter" action="INCLUIR">
                        <param name="Mnemônico">ENTIDADE</param>
                        <param name="Descrição">Entidade para utilização na tela X</param>
                        <param name="Parâmetro">ValorDoParametro</param>
                        <param name="Visível">true</param>
                        <param name="Editável">true</param>
                        <param name="Grupo do Parâmetro de Sistema">INFRA</param>
                </service>
        </services>
</importacao>

Recuperando valores dos Parâmetros para uso

Agora que temos um parâmetro de sistema cadastrado na base de dados, podemos recuperar o valor do parâmetro por meio de um SystemIdentifier (diferente para cada produto) e utilizá-lo onde for necessário. A interface SystemParameterEntityIdentifier já existe no jmine-tec, para criar o SystemIdentifier basta criar um enum que implementa essa interface.

Criando o enum SystemIdentifier:

public enum SystemParameterSystemIdentifier implements SystemParameterEntityIdentifier {

        ENTIDADE_DEFAULT(1L); //aqui estarão listados os parâmetros cadastrados e seus respectivos id

        private Long id;

        private SystemParameterSystemIdentifier(Long id) {
                this.id = id;
        }

        public Long getSystemId() {
                return this.id;
        }
}

Com o SystemIdentifier criado, podemos agora recuperar o valor de um parâmetro e utilizar onde desejarmos.

Exemplo:

public class PesquisaEntidadePage extends CrudModelPage<EntidadeFilter, Entidade> {
        ...
        // neste exemplo, colocamos um valor inicial padrão no model da página
        public PesquisaEntidadePage() {
                AbstractSystemParameterDAO dao = daoFactory.getDAOByClass(AbstractSystemParameterDAO.class);
                EntidadeSystemParameter entidadeParameter = dao.findBySystemIdentifier(SystemParameterSystemIdentifier.ENTIDADE_DEFAULT);
                this.getModel().setEntidade(entidadeParameter.getParametro());
        }
        ...
}