Seam e JBoss AS

[size=12]Olá,
estou brincando um pouco com JBOSS SEAM mas já senti algumas dificuldades.

A primeira delas é achar informações interessantes a respeito do uso de SEAM com Maven2 e Eclipse Ganymede - geralmente as explicações recaem exageradamente no uso do JBoss Tools, isso não me agrada muito (SEAM parece não gostar de Maven).

A segunda, e minha dúvida principal é: Como eu faço para rodar aplicações seam em JBOSS AS?

Coloquei o JBOSS SEAM como dependência (usando MAVEN2) no meu projeto e fiz deploy no JBOSS AS - só isso é suficiente para tudo funcionar corretamente ou preciso modificar o JBOSS AS de algum jeito para que ele possa rodar aplicações que façam o uso de SEAM?[/size]

Eu estou apanhando do Seam faz algum tempo e estou seguindo basicamente o pdf oficial que é o mais completo!

Se você quer rodar com outros servidores de aplicação vc pode tranquilamente… no pdf oficial lá no final o pessoal explica como!

E rodar com o Maven eu acho que é possível sim!

Atualmente estou apanhando pra entender como funciona a classe Identity dele e como ela trabalha com o Drools… me parece que é uma das melhores ferramentas para gerenciar permissões de usuários!

O Seam sem o JBoss Tools é muito improdutivo, não?

Para mim se a produtividade de um framework depende de uma ferramenta para uma IDE então voltamos a história de dependência de plataforma - não puramente - mas indiretamente - a partir da necessidade de uma determinada ferramenta de desenvolvimento feita pelo vendor do framework para tornar o framework produtivo.

Mas acredito que o JBoss Seam não seja caso, ele pode ser produtivo mesmo sem o JBoss tools - segundo o que li até agora - ele (bem) basicamente liga os frameworks Java de uma forma mais proveitosa ex. EJB3 com JSF evitando a necessidade de “Backing Beans” - tornando a ligação entre parte de negócio e view mais natural. Além disso procura eliminar o uso de configurações xml, recaindo principalmente sobre o uso de anotações.

Mas volto a minha pergunta original:

[quote][b]Como eu faço para rodar aplicações seam em JBOSS AS?

Coloquei o JBOSS SEAM como dependência (usando MAVEN2) no meu projeto e fiz deploy no JBOSS AS - só isso é suficiente para tudo funcionar corretamente ou preciso modificar o JBOSS AS de algum jeito para que ele possa rodar aplicações que façam o uso de SEAM?[/b][/quote]

ThiagoWorldCoder

Olá… você citou que esta utilizando o “pdf oficial”, por favor, onde eu encontro este pdf ?

Obrigado.

[]s

documentação:

https://www.jboss.org/community/wiki/JBossapplicationserverofficialdocumentationpage

ThiagoWorldCoder

Desculpe se eu estiver errado… mas essa página que você mandou tem a documentação do JBoss AS… eu achei que você tivesse o pdf oficial do JBoss Seam.
Inclusive estou precisando muito dessa parte onde você diz que explica como rodar em outros app server, no meu caso preciso rodar no WebSphere.

Obrigado.

[]s

Confundi, achei que vc tivesse falando do jboss server, mas a documentação estão no pacote quando vc baixa o jboss seam, acredito que seja em docs, se não for lá, é só ir no site oficial do jboss seam mesmo! Qualquer dúvida me avisa!

Você tem algum manual, apostila ou livro que explique Seam do zero ?

Estou querendo fazer o curso FJ34 da Caelum, mas só vai ter turma em SP em fevereiro de 2010 :frowning:

Se o pessoal da Caelum passar por aqui fica o recado e pedido: abre uma turma agora em novembro mesmo !
Eu tenho certeza que conseguem lotar.

[]s

Faz na GlobalCode, lá também tem curso de JBoss Seam!

De qual curso você esta falando ?

Na Globalcode só encontrei um Hands-on em janeiro, e em Campinas…

[]s

Eu fiz o Hands-On do Seam, não tenho certeza, mas acho que tem o curso completo de Seam lá!

Liga pra confirmar!

  1. O Seam roda bem com o Maven, a unica restrição é se vc quer utilizar testes de integração automatizados com o SeamTest, isso não funciona sem alguns ajustes que você pode obter aqui, inclusive com um projeto exemplo com o maven todo configurado e funcional (mas nao esquece de atualizar as versões conforme a versão do seam que vc quer utilizar - as versões dos pacotes para o Seam 2.2 vc pode ter aqui )
  2. No próprio site do seamframework.org esta descrito qual versao do JBoss AS foram testados os samples que vem com o Seam. Logo, a não ser que você use uma versão de JBoss muito diferente daquela testada, não é pra ter problema algum. Se tiver problema, no proprio site tbm diz como fazer deploy em versões anteriores ou em outros appservers:
    http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/tutorial.html#d0e385
    http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/gettingstarted.html#d0e3029
    http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/websphere.html

Você pode procurar por treinamentos que abordam o Seam com a Globalcode através de seu curso Hands-on ( HO06 ) , com a Caelum no curso FJ-34 , ou mesmo com quem é responsável direta pelo framework, a Red Hat, através do treinamento oficial do Seam - o JB170, disponibilizado aqui no Brasil e ministrado pelo time JBoss (procure informações no tel +55 (11) 3529 6000 ou pelo e-mail training-br@redhat.com ).

[]s

Opa… obrigado pelas respostas tão claras e objetivas !

Na verdade eu não uso o Maven, nem sei direito o que é… :frowning:

Aliás… se tiver alguma ajuda nesse assunto para me dar, ficaria muito grato.

Li que o Maven é uma ferramenta de gerencia de projetos, mas não sei bem o que isso significa.

[]s

O Maven, entre outras coisas, é principalmente uma ferramenta de build (tão qual o Ant), que possui gerenciamento e de todo o ciclo de compilação como execução de testes unitários, integração, deploy … e controle de todos os artefatos e suas dependencias necessárias para a aplicação - isso quer dizer que ele baixa da internet os pacotes que você precisa para executar e compilar seu projeto armazendo-os em um repositório local que pode ser compartilhado por todo o time de desenvolvimento.

Tem quem ama e quem odeia o maven, sendo assim como alternativa para gerencia das dependencias do projetos existe o Ivy, que adiciona esta mesma capacidade para o Ant.

Alessandro Lazarotti

Estou seguindo o tutorial do Seam que você indicou no entanto no item 3.3, na parte que fala do Run as >> TestNG Test no meu Eclipse não tem essa opção…

Tem idéia de porque ?
Tenho que instalar algo mais ?

Obrigado

[]s

[quote=Zeed01] (…) no item 3.3, na parte que fala do Run as >> TestNG Test no meu Eclipse não tem essa opção…
Tem idéia de porque ?
Tenho que instalar algo mais ?
[/quote]

Veja o item 3.1:

Alguém tem o PDF do treinamento FJ-34 que possa compartilhar ? Claro, se o material for Open…

Grato.

Salve galera, como eu criaria uma action com seam para fazer o seguinte:

1 ? Em uma tela eu tenho um Select que é preenchido com fluxos;

2 ? Ao selecionar um fluxo ele preenche um rich:listShuttle com os itens de fluxo associados e não associados, ou seja ele faz uma consulta no banco passando o id do fluxo como parametro e retorna de um lado os selecionados e de outro os não selecionados.

3 ? O usuário manipula os itens de fluxo pelo controle rich:listShuttle e no final salva, persistindo os itens de fluxo selecionadas no banco.

Se alguém conseguir me ajudar fico muito grato.

package br.com.algartecnologia.save.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

@Entity
@Table(name="tb_Fluxo")
public class Fluxo implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id 
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="Cod_Fluxo")
	private int codigo;
	
	@Column(name="Des_Abreviatura")
	@Length(max=20)
	private String abreviatura;
	
	@NotNull @Length(max=100)
	@Column(name="Nom_Fluxo")
	private String nome;
	
	@Length(max=255) @Column(name="Des_Fluxo")
	private String descricao;
	
	@NotNull @Column(name="Ind_Ativo")
	private int status;
	
	@NotNull @Column(name="Dt_Cadastro")
	private Date dataCadastro = new Date();
	
	@OneToMany(fetch = FetchType.LAZY,
	mappedBy = "pk.fluxo",
	cascade = {CascadeType.PERSIST, CascadeType.MERGE})
	@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
	org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
	private List<ItemParaFluxo> itensParaFluxo = new LinkedList<ItemParaFluxo>();
	
	public Fluxo() {
	}
	
	public Fluxo(String abrev, String nome, String descricao, int status,
			Date dataCadastro) {
		this.abreviatura = abrev;
		this.nome = nome;
		this.descricao = descricao;
		this.status = status;
		this.dataCadastro = dataCadastro;
	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

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

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}
	
	

	public String getAbreviatura() {
		return abreviatura;
	}

	public void setAbreviatura(String abreviatura) {
		this.abreviatura = abreviatura;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		result = prime * result
				+ ((dataCadastro == null) ? 0 : dataCadastro.hashCode());
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result + status;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Fluxo other = (Fluxo) obj;
		if (codigo != other.codigo)
			return false;
		if (dataCadastro == null) {
			if (other.dataCadastro != null)
				return false;
		} else if (!dataCadastro.equals(other.dataCadastro))
			return false;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (status != other.status)
			return false;
		return true;
	}

	public void setItemParaFluxo(List<ItemParaFluxo> itensParaFluxo) {
		this.itensParaFluxo = itensParaFluxo;
	}

	public List<ItemParaFluxo> getItemParaFluxo() {
		return itensParaFluxo;
	}
	
	
}
package br.com.algartecnologia.save.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

@Entity
@Table(name="tb_Item_Fluxo")
public class ItemFluxo implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="Cod_Item_Fluxo")
	private int codigo;
	
	@NotNull @Length(max=100)
	@Column(name="Nom_Item_Fluxo")
	private String nome;
	
	@Length(max=255) @Column(name="Des_Item_Fluxo")
	private String descricao;
	
	@NotNull @Column(name="Dt_Cadastro")
	private Date dataCadastro = new Date();
	
	@NotNull @Column(name="Ind_Ativo")
	private int status;
	
	@OneToMany(fetch=FetchType.LAZY, mappedBy = "pk.itemFluxo",
	cascade = {CascadeType.PERSIST, CascadeType.MERGE})
	@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
	org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
	private List<ItemParaFluxo> itensParaFluxo = new LinkedList<ItemParaFluxo>();
	

	public ItemFluxo(String nome, String descricao, Date dataCadastro,
			int status) {
		this.nome = nome;
		this.descricao = descricao;
		this.dataCadastro = dataCadastro;
		this.status = status;
	}
	
	public ItemFluxo(int codigo, String nome){
		this.codigo = codigo;
		this.nome = nome;
	}
	
	public ItemFluxo(){}


	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public String getNome() {
		return nome;
	}

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

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		result = prime * result
				+ ((dataCadastro == null) ? 0 : dataCadastro.hashCode());
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result + status;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ItemFluxo other = (ItemFluxo) obj;
		if (codigo != other.codigo)
			return false;
		if (dataCadastro == null) {
			if (other.dataCadastro != null)
				return false;
		} else if (!dataCadastro.equals(other.dataCadastro))
			return false;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (status != other.status)
			return false;
		return true;
	}

	@Override
	public String toString() {
		return this.codigo + ":" + this.nome;
	}

	public void setItemParaFluxo(List<ItemParaFluxo> itemParaFluxo) {
		this.itensParaFluxo = itemParaFluxo;
	}

	public List<ItemParaFluxo> getItemParaFluxo() {
		return itensParaFluxo;
	}
	
	
	

}
package br.com.algartecnologia.save.entity;

import java.io.Serializable;

import javax.persistence.FetchType;
import javax.persistence.ManyToOne;

public class ItemParaFluxoPK implements Serializable {

	private static final long serialVersionUID = -563932347348882025L;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private Fluxo fluxo;

	@ManyToOne(fetch = FetchType.LAZY, optional = false)
	private ItemFluxo itemFluxo;
	

	public Fluxo getFluxo() {
		return fluxo;
	}


	public void setFluxo(Fluxo fluxo) {
		this.fluxo = fluxo;
	}


	public ItemFluxo getItemFluxo() {
		return itemFluxo;
	}


	public void setItemFluxo(ItemFluxo itemFluxo) {
		this.itemFluxo = itemFluxo;
	}


	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o == null || getClass() != o.getClass())
			return false;
		if (!(o instanceof ItemParaFluxoPK))
			return false;

		ItemParaFluxoPK that = (ItemParaFluxoPK) o;

		if (this.fluxo != null ? !this.fluxo.equals(that.fluxo)
				: that.fluxo != null)
			return false;
		if (this.itemFluxo != null ? !this.itemFluxo.equals(that.itemFluxo)
				: that.itemFluxo != null)
			return false;

		return true;
	}
	
	
	public int hashCode() {
		int result;
		result = (this.fluxo != null ? this.fluxo.hashCode() : 0);
		result = 31 * result
				+ (this.itemFluxo != null ? this.itemFluxo.hashCode() : 0);
		return result;
	}


}
package br.com.algartecnologia.save.entity;

import java.io.Serializable;

import javax.persistence.AssociationOverride;
import javax.persistence.AssociationOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "tb_Fluxo_Item_Fluxo")
@AssociationOverrides( {
		@AssociationOverride(name = "pk.fluxo", joinColumns = @JoinColumn(name = "Cod_Fluxo")),
		@AssociationOverride(name = "pk.itemFluxo", joinColumns = @JoinColumn(name = "Cod_Item_Fluxo")) })
public class ItemParaFluxo implements Serializable {

	private static final long serialVersionUID = -860591466706422568L;

	@EmbeddedId
	private ItemParaFluxoPK pk = new ItemParaFluxoPK();

	@Column(name = "Num_Posicao")
	private int posicao;

	public boolean equals(Object o) {
		if (this == o)
			return true;
		if (o == null || getClass() != o.getClass())
			return false;

		ItemParaFluxo that = (ItemParaFluxo) o;

		if (getPk() != null ? !getPk().equals(that.getPk())
				: that.getPk() != null)
			return false;

		return true;
	}

	@Transient
	public Fluxo getFluxo() {
		return this.getPk().getFluxo();
	}

	@Transient
	public ItemFluxo getItemFluxo() {
		return this.getPk().getItemFluxo();
	}

	public int hashCode() {
		return (getPk() != null ? getPk().hashCode() : 0);
	}

	public ItemParaFluxoPK getPk() {
		return pk;
	}

	public void setPosicao(int posicao) {
		this.posicao = posicao;
	}

	public int getPosicao() {
		return posicao;
	}
	
	

}