Pessoal, estou com sérios problemas quanto a implementação do padrão Observer. Como faço para que a notifação chegue até o observador? A aplicação é um simples chat e estou fazendo da seguinte maneira:
<h:form id="form2">
<h:outputText value="#{ Main.usuarioBean.usuario.apelido }"/>
<h:inputText value="#{ Main.painelMensagem.mensagem }" id="mensagem"/>
<h:commandButton value="Enviar mensagem !">
<f:ajax event="click"
execute=":form2:mensagem"
render=":form1:" />
</h:commandButton>
</h:form>
<h:form id="form1">
<!-- <p:poll interval="3" update=":form1:" /> -->
<h:panelGroup id="painelChatMensagens">
<h:outputText value="Ultima mensagem: #{Main.painelMensagem.mensagem}"/>
<h:dataTable value="#{Main.painelMensagem.mensagens}" var="msg">
<h:column>#{msg}</h:column>
</h:dataTable>
</h:panelGroup>
</h:form>
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import com.marcelodeandrade.usuario.UsuarioBean;
@ManagedBean(name = "Main")
public class Main {
@ManagedProperty(value = "#{UsuarioBean}")
private UsuarioBean usuarioBean;
private PainelMensagem painelMensagem;
public Main(){
painelMensagem = PainelMensagem.getInstancia();
}
@PostConstruct
public void aposConstrutor(){
painelMensagem.adicionarObservador(getUsuarioBean());
}
public PainelMensagem getPainelMensagem() {
return painelMensagem;
}
public void setPainelMensagem(PainelMensagem painelMensagem) {
this.painelMensagem = painelMensagem;
}
public UsuarioBean getUsuarioBean() {
return usuarioBean;
}
public void setUsuarioBean(UsuarioBean usuarioBean) {
this.usuarioBean = usuarioBean;
}
}
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedProperty;
import com.marcelodeandrade.observer.Objeto;
import com.marcelodeandrade.observer.Observador;
import com.marcelodeandrade.usuario.UsuarioBean;
public class PainelMensagem implements Objeto {
private String mensagem;
private List<Observador> observadores;
private List<String> mensagens;
private static PainelMensagem instancia;
@ManagedProperty(value = "#{UsuarioBean}")
private UsuarioBean usuarioBean;
public PainelMensagem(){
this.observadores = new ArrayList<Observador>();
this.mensagens = new ArrayList<String>();
}
public static PainelMensagem getInstancia(){
if( instancia == null){
instancia = new PainelMensagem();
}
return instancia;
}
public List<String> getMensagens() {
return mensagens;
}
public String getMensagem() {
return mensagem;
}
public void setMensagem(String mensagem) {
this.mensagem = mensagem;
this.mensagens.add(mensagem);
notificarObservadores();
return;
}
@Override
public void adicionarObservador(UsuarioBean usuarioBean) {
this.observadores.add(usuarioBean);
}
@Override
public void removerObservador(UsuarioBean usuarioBean) {
this.observadores.remove(usuarioBean);
}
@Override
public void notificarObservadores() {
for( Observador observador : this.observadores){
observador.atualizarMensagem(this.mensagem);
}
}
public List<Observador> getObservadores() {
return observadores;
}
}