views:

444

answers:

1

Hi guys,

I'm in doubt about using roles for different scopes for my seam components. For example:

My project has a table called Parameter that stores all global parameters for the project as URLs, admin e-mail and etc ... For this table there is a simple CRUD interface for administration.

So, reading the seam 2.1.2 documentation i undestand that i should have a seam component with Application scope, because parameters will be applicable to all project and another scope, for CRUD administration, an Event scope.

1) Is that correct ? 2) The scope must be defined on EntityBean or SessionBean ??

The code:

Session Bean ParameterSB

@Scope(ScopeType.APPLICATION)
@Name("parametroSB")
public class ParametroSB implements java.io.Serializable{

   private static final long serialVersionUID = 1L;

   @DataModel
   private List<Parametro> lstParametro;

   @In (required=false)
   @Out
   @DataModelSelection
   private Parametro parametro;

   @In
   private EntityManager entityManager;

   @In
   private Events events;

   @Logger
   private static Log log;

   @SuppressWarnings("unchecked")
   @Factory("lstParametro")
   @Observer("recarregaListaParametro")
   public List<Parametro> getLstParametro() {

       StringBuilder strHQLBuilder = new StringBuilder("select p from Parametro p where 1=1 ");
       strHQLBuilder.append((parametro.getNome() != null && !parametro.getNome().equals("")) ?  "and p.nome=#{parametro.nome} " : "");
       strHQLBuilder.append((parametro.getValor() != null && !parametro.getValor().equals("")) ? "and p.valor=#{parametro.valor} " : "");
       strHQLBuilder.append((parametro.getPais() != null && parametro.getPais().getId() > 0) ? "and p.pais.id=#{parametro.pais.id} " : "");

       lstParametro = (List<Parametro>) entityManager.createQuery(strHQLBuilder.toString()).getResultList();

       if (lstParametro.size() == 0 ){
        FacesMessages.instance().add("Nenhum registro encontrado");
       }
       return lstParametro;
   }

   public void setLstParametro(List<Parametro> lstParametro) {
      this.lstParametro = lstParametro;
   }

   @SuppressWarnings("unchecked")
   public void delete(){

       try{
        if (parametro != null && parametro.getId() > 0){

         //busca o objeto no banco. Necessario para fazer a exclusão
         parametro = entityManager.find(Parametro.class, parametro.getId());

         //exclui o objeto do banco
         entityManager.remove(parametro);

         //limpa o DataModelSelection
         parametro = new Parametro();

         //informa mensagem de sucesso
         FacesMessages.instance().addFromResourceBundle("prepark.parametro.exclusao.sucesso");

         //chama um evento para atualizar a lista
         //events.raiseTransactionSuccessEvent("recarregaListaParametro"); 
        }

       }catch(Exception e){
        FacesMessages.instance().add("Foi encontrado um erro na aplicação. Entre em contato com o Administrador");
       }
   }

   /**
    * @author : Cateno Viglio
    * Método responsavel por fazer a persistencia no banco para uma inclusão e alteração.
    * Caso o objeto Parametro não possua id, será feito um insert no banco.
    */
   public void insert(){

       Boolean blInsert = null;

       try{

        //verifica se esta sendo feito um insert ou update na base
        blInsert = (parametro == null) ? null : ((parametro.getId() > 0) ? Boolean.FALSE : Boolean.TRUE ); 

        if (blInsert != null){

         //executa o insert ou update
         entityManager.merge(parametro);

         //limpa o DataModelSelection
         parametro = new Parametro();

         if (blInsert){
          FacesMessages.instance().addFromResourceBundle("prepark.parametro.inclusao.sucesso"); 
          events.raiseTransactionSuccessEvent("recarregaListaParametro"); //chama um evento para atualizar a lista
         }else{
          FacesMessages.instance().addFromResourceBundle("prepark.parametro.alteracao.sucesso"); //informa mensagem de sucesso
         }
        }

       }catch(Exception e){
        FacesMessages.instance().add("Foi encontrado um erro na aplicação. Entre em contato com o Administrador");
       }
   }

   /**
    * @author : Cateno Viglio
    * Metodo responsavel por fazer a chamada a pagina de alteração.
    */
   public void select(){}

}

Entity Bean Parameter

@Scope(ScopeType.APPLICATION)
@Name("parametro")
@Table(name="parametro")
@Entity
public class Parametro implements java.io.Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    private int id;

    @NotNull @Length(min=5, max=45)
    @Column(name="NM_PARAMETRO")
    private String nome;

    @NotNull @Length(min=5, max=255)
    private String valor;

    @ManyToOne
    @JoinColumn(name="FK_PAIS")
    private Pais pais = new Pais();

    public int getId() {
     return id;
    }

    public void setId(int id) {
     this.id = id;
    }

    public String getNome() {
     return nome;
    }

    public void setNome(String nome) {
     this.nome = nome;
    }

    public String getValor() {
     return valor;
    }

    public void setValor(String valor) {
     this.valor = valor;
    }

    public Pais getPais() {
     return pais;
    }

    public void setPais(Pais pais) {
     this.pais = pais;
    }

    @Override
    public int hashCode() {
     final int prime = 31;
     int result = 1;
     result = prime * result + id;
     return result;
    }

    @Override
    public boolean equals(Object obj) {
     if (this == obj)
      return true;
     if (obj == null)
      return false;
     if (getClass() != obj.getClass())
      return false;
     Parametro other = (Parametro) obj;
     if (id != other.id)
      return false;
     return true;
    }


}
+2  A: 

1) That is correct. Use the Application scope if this is data that is global to the entire application.

2) You don't need to put the scope in the Entity Bean. Since you are Injecting and Outjecting from an application scoped SFSB, it'll automatically Inject/Outject from the application scope.

But you'll have to create the initial instance somehow (using a Factory, perhaps).

Ashish Tonse