# JSF Primefaces Chatproblem trotz 3.4



## .Domii (26. Jul 2012)

Nachdem ich den Chat von Primefaces (PrimeFaces - ShowCase) zum laufen gebracht habe (das überhaupt mal etwas angezeigt wird) bekomme ich einfach keine Anzeige der Nachrichten die ich versende.. nein ich werd nicht einmal eingeloggt!

Wichtig: damit dieser Chat funktioniert müsst ihr Primefaces 3.4 verwenden!


```
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.org/ui"
                template="../templates/ui.xhtml">

    <ui:define name="head">
        <style type="text/css">
            .messageInput {
                width:400px;
            }

            .publicColumn {
                width:80%;
            }

            .usersColumn {
                width:20%;
            }

            .vtop {
                vertical-align: top;
            }

            .chatlogs {
                height:200px;
                overflow:auto;
                padding: 0.5em 1em 0.5em 0.5em;
            }

            .usersList {
                height:200px;
                overflow:auto;
            }

            .usersList ul {
                list-style-type: none;
                padding-left:10px;
            }

            .usersList ul li {
                margin-bottom: 2px;
            }

            .usersList .ui-button-text {
                padding:0;
            }
        </style>

        <script type="text/javascript">
            //<![CDATA[
            function handleMessage(data) {
                var chatContent = $(PrimeFaces.escapeClientId('form:public'));
                chatContent.append(data + '<br />');
                
                //keep scroll
                chatContent.scrollTop(chatContent.height());
            }
            //]]>
        </script>
    </ui:define>

    <ui:define name="content">

        <h1 class="title ui-widget-header ui-corner-all">PrimePush - Chat</h1>
        <div class="entry">
            <p>Chat is a simple push based application created with PrimePush.</p>

            <p:growl id="growl" showDetail="true" />

            <h:form id="form">

                <p:fieldset id="container" legend="PrimeChat" toggleable="true">

                    <h:panelGroup rendered="#{chatView.loggedIn}">

                        <h:panelGrid columns="2" columnClasses="publicColumn,usersColumn" style="width:100%">
                            <p:outputPanel id="public" layout="block" styleClass="ui-corner-all ui-widget-content chatlogs"/>

                            <p:dataList id="users" var="user" value="#{chatUsers.users}" styleClass="usersList">
                                <f:facet name="header">
                                    Users
                                </f:facet>

                                <p:commandButton title="Chat" icon="ui-icon-comment" oncomplete="pChat.show()" update=":form:privateChatContainer">
                                    <f:setPropertyActionListener value="#{user}" target="#{chatView.privateUser}" />
                                </p:commandButton>
                                #{user}
                            </p:dataList>
                        </h:panelGrid>

                        <p:separator />

                        <p:inputText value="#{chatView.globalMessage}" styleClass="messageInput" />
                        <p:spacer width="5" />
                        <p:commandButton value="Send" actionListener="#{chatView.sendGlobal}" oncomplete="$('.messageInput').val('').focus()"/>
                        <p:spacer width="5" />
                        <p:commandButton value="Disconnect" actionListener="#{chatView.disconnect}" global="false" update="container" />
                    </h:panelGroup>

                    <h:panelGroup rendered="#{not chatView.loggedIn}" >
                        Username: <p:inputText value="#{chatView.username}" />

                        <p:spacer width="5" />
                        <p:commandButton value="Login" actionListener="#{chatView.login}" update="container" 
                                         icon="ui-icon-person" />
                    </h:panelGroup>

                </p:fieldset>

                <p:dialog widgetVar="pChat" header="Private Chat" modal="true" showEffect="fade" hideEffect="fade">
                    <h:panelGrid id="privateChatContainer" columns="2" columnClasses="vtop,vtop">
                        <p:outputLabel for="pChatInput" value="To: #{chatView.privateUser}" />
                        <p:inputTextarea id="pChatInput" value="#{chatView.privateMessage}" rows="5" cols="30" />

                        <p:spacer />
                        <p:commandButton value="Send" actionListener="#{chatView.sendPrivate}" oncomplete="pChat.hide()" />
                    </h:panelGrid>
                </p:dialog>

            </h:form>

            <p:socket onMessage="handleMessage" channel="/chat" autoConnect="false" widgetVar="subscriber">
                <p:ajax event="message" update=":form:users" />
            </p:socket>
        </div>
    </ui:define>
</ui:composition>
```


```
/*
 * Copyright 2009-2012 Prime Teknoloji.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package view;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;

public class ChatUsers {
    
    private List<String> users;
    
    @PostConstruct
    public void init() {
        this.users = new ArrayList<String>();
    }

    public List<String> getUsers() {
        return users;
    }

    public void setUsers(List<String> users) {
        this.users = users;
    }
    
    public void addUser(String user) {
        this.users.add(user);
    }
    
    public void removeUser(String user) {
        this.users.remove(user);
    }
    
    public boolean contains(String user) {
        return this.users.contains(user);
    }
}
```


```
/*
 * Copyright 2009-2012 Prime Teknoloji.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package view;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

public class ChatView {
    
    private final PushContext pushContext = PushContextFactory.getDefault().getPushContext();
    
    private ChatUsers users;

        private String privateMessage;
    
    private String globalMessage;
        
        private String username;
        
        private boolean loggedIn;
    
    private String privateUser;
    
    private final static String CHANNEL = "/chat/";

    public void setUsers(ChatUsers users) {
        this.users = users;
    }

    public String getPrivateUser() {
        return privateUser;
    }

    public void setPrivateUser(String privateUser) {
        this.privateUser = privateUser;
    }

    public String getGlobalMessage() {
        return globalMessage;
    }

    public void setGlobalMessage(String globalMessage) {
        this.globalMessage = globalMessage;
    }

    public String getPrivateMessage() {
        return privateMessage;
    }

    public void setPrivateMessage(String privateMessage) {
        this.privateMessage = privateMessage;
    }
    
        public String getUsername() {
                return username;
        }
        public void setUsername(String username) {
                this.username = username;
        }
        
        public boolean isLoggedIn() {
                return loggedIn;
        }
        public void setLoggedIn(boolean loggedIn) {
                this.loggedIn = loggedIn;
        }

        public void sendGlobal() {
        pushContext.push(CHANNEL + "*", username + ": " + globalMessage);
                
                globalMessage = null;
        }
    
    public void sendPrivate() {
        pushContext.push(CHANNEL + privateUser, "[PM] " + username + ": " + privateMessage);
        
        privateMessage = null;
    }
        
        public void login() {
        RequestContext requestContext = RequestContext.getCurrentInstance();
        
                if(users.contains(username)) {
            loggedIn = false;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Username taken", "Try with another username."));
            
            requestContext.update("growl");
        }
        else {
            users.addUser(username);
            pushContext.push(CHANNEL + "*", username + " joined the channel.");
            requestContext.execute("subscriber.connect('/" + username + "')");
            loggedIn = true;
        }
        }
    
    public void disconnect() {
        //remove user and update ui
        users.removeUser(username);
        RequestContext.getCurrentInstance().update("form:users");
        
        //push leave information
        pushContext.push(CHANNEL + "*", username + " left the channel.");
        
        //reset state
        loggedIn = false;
        username = null;
    }
}
```

Vllt wisst ihr eine andere JSF Alternative zu diesem Chat - wäre euch sehr Dankbar!

.Domii


----------



## Templarthelast (26. Jul 2012)

Warum nicht eben einen eigenen Chat programmieren, dieser ist ja nicht besonders komplex. Einfach ein Formular für den Namen, das den user in einer Datenbank registiert und dort auch alle nachrichten speichert.


----------



## krazun (27. Jul 2012)

Hast du denn auch Atmosphere in der web.xml richtig konfiguriert? Den Teil hast du nämlich nicht gepostet.

grüße,
krazun


----------



## .Domii (27. Jul 2012)

@Templarthelast: Das wäre eine Idee (habe diese auch aufgeschnappt) jedoch habe ich die User bereits in einer Datenbank - und möchte mir dies auch später sparen. Ich habe nun versucht mithilfe des ObserverPatterns einen Chat zu realisieren - scheitere aber an der Anbindung des fertig ausprogrammierten Patterns in eine JSF Seite.. siehe hier: Own Chat App Problem


Atmosphere? Sry ich bin relativ neu was JSF betrifft o.o


```
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>
```

so schaut meine web.xml aus!


----------



## .Domii (29. Jul 2012)

Hat wirklich keiner eine Idee was daran nicht stimmt? :/ komme einfach nicht mehr weiter...


----------



## Fant (29. Jul 2012)

Wie schaut die faces-config aus? Hast du die Beans innerhalb der Applikation bekannt gemacht? Wenn ja in welchem Scope liegen diese?

Wird denn z.B. die login-Methode aufgerufen? Einfach mal ein paar Systemausgaben einbauen oder ein bisschen was loggen.


----------



## .Domii (29. Jul 2012)

faces-config wird in JSF 2.0 nichtmehr benötigt?

Scopes kannst du oben aus den Files lesen!  - vorallem wichtig - Es ist das genaue Beispiel vom Showcase Lab (primesfaces.org)


----------



## Fant (30. Jul 2012)

.Domii hat gesagt.:


> faces-config wird in JSF 2.0 nichtmehr benötigt?
> 
> Scopes kannst du oben aus den Files lesen!  - vorallem wichtig - Es ist das genaue Beispiel vom Showcase Lab (primesfaces.org)



Wo soll ich das denn ablesen können? 

Klar brauchst du nicht zwingend die passenden Einträge in der faces-config, aber dann sollten die Beans per Annotation bekannt gemacht werden. Ich seh aber weder das eine, noch das andere.

Wenn das erledigt ist, dann schau mal, wie es bezüglich der zweiten Frage aussieht. 


Die Codebeispiele von Primefaces sind übrigens auch nicht immer zu 100% vollständig, sondern zeigen meist nur das für das Problem wesentliche.


----------



## jwiesmann (30. Jul 2012)

Vielleicht solltest du der Klasse ChatView noch mitteilen, dass diese eine ManagedBean ist...

```
@ManagedBean
public class ChatView {
.....
```


----------



## .Domii (30. Jul 2012)

@Fant - war wohl schon der erste Fehler sieht jetzt so aus:


```
@ViewScoped
@ManagedBean
public class ChatView {
........
```

Bezüglich der 2. Frage:
Bekomme jetzt direkt nach dem Deploying & Build auf der Seite folgende Fehlerausgabe: "java.io.FileNotFoundException"
die So aussieht:

```
java.io.FileNotFoundException
	at org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:403)
	at com.sun.faces.facelets.impl.DefaultFaceletCache._getLastModified(DefaultFaceletCache.java:172)
	at com.sun.faces.facelets.impl.DefaultFaceletCache.access$000(DefaultFaceletCache.java:62)
	at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:82)
	at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:78)
	at com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
	at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:121)
	at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:62)
	at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:256)
	at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:366)
	at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
	at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
	at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
	at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
	at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86)
	at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:774)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)
```

In folgendem Tag:

```
<UIViewRoot id="j_id1" inView="true" locale="de_AT" renderKitId="HTML_BASIC" rendered="true" transient="false" viewId="/index.xhtml"/>
```

Verstehe das Problem einfach nicht :/


----------



## imillitay (31. Jul 2012)

Zeig mal deine Ordner-/Dateistruktur...


----------



## jwiesmann (31. Jul 2012)

Hi, ich kenne zwar das Tag nicht, aber probier mal 
[XML]<UIViewRoot id="j_id1" inView="true" locale="de_AT" renderKitId="HTML_BASIC" rendered="true" transient="false" viewId="/faces/index.xhtml"/>[/XML]


```
faces
```
 kennzeichnet den Pfad, der in deiner Web.xml steht.
Alles was in deiner Entwicklungsumgebung im root-Verzeichnis steht, wird sozusagen, dahin kopiert.

Deine Web.xml
[XML]
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
[/XML]


----------



## .Domii (31. Jul 2012)

imillitay hat gesagt.:


> Zeig mal deine Ordner-/Dateistruktur...



Hab sie dir im Anhang als jpg rangehängt! ScreenShot010.jpg!




> Alles was in deiner Entwicklungsumgebung im root-Verzeichnis steht, wird sozusagen, dahin kopiert.


D.h. ich muss an die normale 
	
	
	
	





```
localhost:8080/projektname
```
noch 
	
	
	
	





```
/faces/
```
 dranhängen?
Hab es so jetzt probiert - immer noch "java.io.FileNotFoundException".

Habt ihr bei euch die Primefaces.org Showcase Lab schon zum laufen gebracht - die rede ist vom Chat.. um den geht es hier nämlich.. 


EDIT:

FileNotFoundException behoben dank "Dateistruktur" ansehen ;D
Bin drauf gekommen das ich die templates im Web Pages nicht hatte (ui.xthml) und habe sie nun eingerichtet. zudem kam noch die falsche Verlinkung (../templates/ui.xthml) da gehört natürlich dann auch ./templates/ui.xthml 
Nun stehe ich vor einem anderen Problem nämlich:


```
Could not initialize class org.primefaces.push.PushContextFactory
```
Diese wird mir nun geworfen! Ich glaube das dies mit Atmosphere zusammenhängt! Woher bekomme ich die dazugehörige .jar und wie kann ich diese dann konfigurieren? 

Neue Dateistruktur unter ScreenShot011.jpg

EDIT: Atmosphere hab ich nun eingebunden..^^
trotzdem immer noch dieser Fehler: 
	
	
	
	





```
Could not initialize class org.primefaces.push.PushContextFactory
```

Mit freundlichen Grüßen
.Domii


----------



## Fant (31. Jul 2012)

Ist das die _komplette_ Meldung?

Was passiert, wenn du die PushContext-Variable zusätzlich noch als _static_ deklarierst?


----------

