Author: nbelaevski
Date: 2010-10-20 20:31:11 -0400 (Wed, 20 Oct 2010)
New Revision: 19622
Added:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/MessageException.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContext.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContextFactory.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionFactory.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DummyPushContextFactory.java
branches/RF-7817/push-redesign-app/src/main/webapp/chat.xhtml
branches/RF-7817/push-redesign-app/src/main/webapp/index.jsp
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmosphereHandlerProvider.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/ConsumingCollection.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextFactoryImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicsContextImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushFilter.java
branches/RF-7817/push-redesign/src/main/resources/META-INF/services/
branches/RF-7817/push-redesign/src/main/resources/META-INF/services/org.richfaces.application.push.PushContextFactory
Removed:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Message.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PublisherContext.java
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicImpl.java
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicsContextImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PublisherContextImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushServlet.java
Modified:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Request.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicsContext.java
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DefaultModule.java
branches/RF-7817/push-redesign-app/pom.xml
branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java
branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java
branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/faces-config.xml
branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/web.xml
branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml
branches/RF-7817/push-redesign/pom.xml
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmospherePushHandler.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/RequestImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/SessionManagerImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/MessagingContext.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushHandlerImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java
branches/RF-7817/push-redesign/src/main/java/org/richfaces/renderkit/PushRendererBase.java
branches/RF-7817/push-redesign/src/main/resources/META-INF/resources/org.richfaces/push.js
Log:
https://jira.jboss.org/browse/RF-7817
Deleted:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Message.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Message.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Message.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -1,88 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.application.push;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author Nick Belaevski
- *
- */
-public class Message implements Serializable {
-
- private static final long serialVersionUID = -2241242510684986230L;
-
- private final TopicKey topicKey;
-
- private Map<String, Object> attributes = null;
-
- private Object data;
-
- public Message(TopicKey topicKey) {
- this.topicKey = topicKey;
- }
-
- public Object getData() {
- return data;
- }
-
- public void setData(Object data) {
- this.data = data;
- }
-
- public void addAttribute(String key, Object value) {
- if (attributes == null) {
- attributes = new HashMap<String, Object>();
- }
-
- attributes.put(key, value);
- }
-
- public void removeAttribute(String key) {
- if (attributes != null) {
- attributes.remove(key);
- }
- }
-
- public Map<String, Object> getAttributes() {
- if (attributes == null) {
- attributes = new HashMap<String, Object>();
- }
-
- return attributes;
- }
-
- public Object getAttribute(String key) {
- if (attributes != null) {
- return attributes.get(key);
- }
-
- return null;
- }
-
- public TopicKey getTopicKey() {
- return topicKey;
- }
-
-}
Added:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/MessageException.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/MessageException.java
(rev 0)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/MessageException.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class MessageException extends Exception {
+
+ private static final long serialVersionUID = -8684363449647232385L;
+
+ public MessageException() {
+ super();
+ }
+
+ public MessageException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MessageException(String message) {
+ super(message);
+ }
+
+ public MessageException(Throwable cause) {
+ super(cause);
+ }
+
+}
Deleted:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PublisherContext.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PublisherContext.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PublisherContext.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -1,39 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.application.push;
-
-
-
-/**
- * @author Nick Belaevski
- *
- */
-public interface PublisherContext {
-
- public static final String ATTRIBUTE_NAME = "__publisherContxt";
-
- //TODO - return Future?
- //TODO - use topic key?
- //TODO - priority?
- public void publish(TopicKey topicKey, Object data);
-
-}
Added:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContext.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContext.java
(rev 0)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContext.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,42 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+import javax.faces.context.FacesContext;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface PushContext {
+
+ public static final String INSTANCE_KEY_NAME = PushContext.class.getName();
+
+ public TopicsContext getTopicsContext();
+
+ public SessionFactory getSessionFactory();
+
+ public void init(FacesContext facesContext);
+
+ public void destroy();
+
+}
Added:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContextFactory.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContextFactory.java
(rev 0)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/PushContextFactory.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface PushContextFactory {
+
+ public PushContext getPushContext();
+
+}
Modified:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Request.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Request.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Request.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -34,7 +34,7 @@
public void flushMessages() throws IOException;
- public void postMessage(Message message);
+ public void postMessage(TopicKey topicKey, String serializedMessage);
//TODO suspend with timeout?
public void suspend() throws IOException;
Added:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionFactory.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionFactory.java
(rev 0)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/SessionFactory.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface SessionFactory {
+
+ public Session createSession(String key);
+
+}
Modified:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/Topic.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -21,6 +21,7 @@
*/
package org.richfaces.application.push;
+
/**
* @author Nick Belaevski
*
@@ -29,8 +30,18 @@
public TopicKey getKey();
- public MessageDataSerializer getMessageSerializer();
+ public MessageDataSerializer getMessageDataSerializer();
- public void setMessageSerializer(MessageDataSerializer serializer);
+ public void setMessageDataSerializer(MessageDataSerializer serializer);
+ public void addTopicListener(TopicListener topicListener);
+
+ public void removeTopicListener(TopicListener topicListener);
+
+ public void notifySubscription(Session session, TopicKey topicKey) throws
AbortSubscriptionException;
+
+ public void notifyUnsubscription(Session session, TopicKey topicKey);
+
+ public void publish(Object messageData) throws MessageException;
+
}
\ No newline at end of file
Added:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java
(rev 0)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicListener.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface TopicListener {
+
+ public void onSessionSubscribed(Session session, TopicKey topicKey) throws
AbortSubscriptionException;
+
+ public void onSessionUnsubscribed(Session session, TopicKey topicKey);
+
+}
Modified:
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicsContext.java
===================================================================
---
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicsContext.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/api/src/main/java/org/richfaces/application/push/TopicsContext.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -21,17 +21,57 @@
*/
package org.richfaces.application.push;
+import java.text.MessageFormat;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.richfaces.application.ServiceTracker;
+
/**
* @author Nick Belaevski
*
*/
//TODO annotations for declarative topics registration
-public interface TopicsContext {
+public abstract class TopicsContext {
- public Topic getOrCreateTopic(TopicKey key);
+ private ConcurrentMap<TopicKey, Topic> topics = new
ConcurrentHashMap<TopicKey, Topic>();
- public Topic getTopic(TopicKey key);
+ protected abstract Topic createTopic(TopicKey key);
- public void removeTopic(TopicKey key);
+ public Topic getOrCreateTopic(TopicKey key) {
+ Topic result = topics.get(key);
+
+ if (result == null) {
+ Topic newTopic = createTopic(key);
+ result = topics.putIfAbsent(key, newTopic);
+ if (result == null) {
+ result = newTopic;
+ }
+ }
+
+ return result;
+ }
+
+ public Topic getTopic(TopicKey key) {
+ return topics.get(key);
+ }
+
+ public void removeTopic(TopicKey key) {
+ topics.remove(key);
+ }
+
+ public void publish(TopicKey key, Object data) throws MessageException {
+ Topic topic = getTopic(key);
+
+ if (topic == null) {
+ throw new MessageException(MessageFormat.format("Topic {0} not
found", key.getTopicName()));
+ }
+
+ topic.publish(data);
+ }
+
+ public static TopicsContext lookup() {
+ return
ServiceTracker.getService(PushContextFactory.class).getPushContext().getTopicsContext();
+ }
}
Modified:
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DefaultModule.java
===================================================================
---
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DefaultModule.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DefaultModule.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -2,8 +2,7 @@
import org.richfaces.application.configuration.ConfigurationService;
import org.richfaces.application.configuration.ConfigurationServiceImpl;
-import org.richfaces.application.push.TopicsContext;
-import org.richfaces.application.push.impl.TopicsContextImpl;
+import org.richfaces.application.push.PushContextFactory;
import org.richfaces.cache.Cache;
import org.richfaces.l10n.BundleLoader;
import org.richfaces.renderkit.AjaxDataSerializer;
@@ -27,7 +26,9 @@
factory.setInstance(DependencyInjector.class, new
DependencyInjectionServiceImpl());
factory.setInstance(MessageFactory.class, new MessageFactoryImpl(new
BundleLoader()));
factory.setInstance(ResourceLibraryFactory.class, new
ResourceLibraryFactoryImpl());
- factory.setInstance(TopicsContext.class, new TopicsContextImpl());
+
+ //TODO add default implementation class name
+ factory.setInstance(PushContextFactory.class,
ServiceLoader.loadService(PushContextFactory.class, DummyPushContextFactory.class));
}
}
Added:
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DummyPushContextFactory.java
===================================================================
---
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DummyPushContextFactory.java
(rev 0)
+++
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/DummyPushContextFactory.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application;
+
+import org.richfaces.application.push.PushContext;
+import org.richfaces.application.push.PushContextFactory;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+//TODO - remove after push-redesign project merge
+public class DummyPushContextFactory implements PushContextFactory {
+
+ public PushContext getPushContext() {
+ throw new UnsupportedOperationException();
+ }
+
+}
Deleted:
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicImpl.java
===================================================================
---
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicImpl.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -1,55 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.application.push.impl;
-
-import org.richfaces.application.push.MessageDataSerializer;
-import org.richfaces.application.push.Topic;
-import org.richfaces.application.push.TopicKey;
-
-/**
- * @author Nick Belaevski
- *
- */
-public class TopicImpl implements Topic {
-
- private TopicKey key;
-
- private volatile MessageDataSerializer serializer;
-
- public TopicImpl(TopicKey key) {
- super();
- this.key = key;
- }
-
- public MessageDataSerializer getMessageSerializer() {
- return serializer;
- }
-
- public void setMessageSerializer(MessageDataSerializer serializer) {
- this.serializer = serializer;
- }
-
- public TopicKey getKey() {
- return key;
- }
-
-}
Deleted:
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicsContextImpl.java
===================================================================
---
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicsContextImpl.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicsContextImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -1,61 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.application.push.impl;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.richfaces.application.push.Topic;
-import org.richfaces.application.push.TopicKey;
-import org.richfaces.application.push.TopicsContext;
-
-/**
- * @author Nick Belaevski
- *
- */
-public class TopicsContextImpl implements TopicsContext {
-
- private ConcurrentMap<TopicKey, Topic> topics = new
ConcurrentHashMap<TopicKey, Topic>();
-
- public Topic getOrCreateTopic(TopicKey key) {
- Topic result = topics.get(key);
-
- if (result == null) {
- Topic newTopic = new TopicImpl(key);
- result = topics.putIfAbsent(key, newTopic);
- if (result == null) {
- result = newTopic;
- }
- }
-
- return result;
- }
-
- public Topic getTopic(TopicKey key) {
- return topics.get(key);
- }
-
- public void removeTopic(TopicKey key) {
- topics.remove(key);
- }
-
-}
Modified: branches/RF-7817/push-redesign/pom.xml
===================================================================
--- branches/RF-7817/push-redesign/pom.xml 2010-10-21 00:19:03 UTC (rev 19621)
+++ branches/RF-7817/push-redesign/pom.xml 2010-10-21 00:31:11 UTC (rev 19622)
@@ -40,11 +40,12 @@
</plugin>
</plugins>
</build>
+
<dependencies>
<dependency>
- <groupId>javax.servlet</groupId>
+ <groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api</artifactId>
- <version>3.0-alpha-1</version>
+ <version>3.0.20100224</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -73,7 +74,7 @@
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-runtime</artifactId>
- <version>0.6.2</version>
+ <version>0.6.3</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
Copied:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java
(from rev 19577,
branches/RF-7817/core/impl/src/main/java/org/richfaces/application/push/impl/TopicImpl.java)
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AbstractTopic.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,116 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl;
+
+import java.util.List;
+import java.util.ListIterator;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.richfaces.application.push.AbortSubscriptionException;
+import org.richfaces.application.push.MessageDataSerializer;
+import org.richfaces.application.push.MessageException;
+import org.richfaces.application.push.Session;
+import org.richfaces.application.push.Topic;
+import org.richfaces.application.push.TopicKey;
+import org.richfaces.application.push.TopicListener;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public abstract class AbstractTopic implements Topic {
+
+ private static final Logger LOGGER = RichfacesLogger.APPLICATION.getLogger();
+
+ private TopicKey key;
+
+ private volatile MessageDataSerializer serializer;
+
+ private List<TopicListener> listeners = new
CopyOnWriteArrayList<TopicListener>();
+
+ public AbstractTopic(TopicKey key) {
+ super();
+ this.key = key;
+ }
+
+ public MessageDataSerializer getMessageDataSerializer() {
+ if (serializer == null) {
+ return DefaultMessageDataSerializer.instance();
+ }
+
+ return serializer;
+ }
+
+ public void setMessageDataSerializer(MessageDataSerializer serializer) {
+ this.serializer = serializer;
+ }
+
+ public TopicKey getKey() {
+ return key;
+ }
+
+ public void addTopicListener(TopicListener topicListener) {
+ listeners.add(topicListener);
+ }
+
+ public void removeTopicListener(TopicListener topicListener) {
+ listeners.remove(topicListener);
+ }
+
+
+ public void notifySubscription(Session session, TopicKey topicKey) throws
AbortSubscriptionException {
+ ListIterator<TopicListener> itr = listeners.listIterator();
+ while (itr.hasNext()) {
+ TopicListener listener = itr.next();
+ try {
+ listener.onSessionSubscribed(session, topicKey);
+ } catch (AbortSubscriptionException e) {
+ while (itr.hasPrevious()) {
+ try {
+ itr.previous().onSessionUnsubscribed(session, topicKey);
+ } catch (Exception e1) {
+ LOGGER.error(e1.getMessage(), e1);
+ }
+ }
+
+ throw e;
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+ }
+ }
+
+ public void notifyUnsubscription(Session session, TopicKey topicKey) {
+ for (TopicListener listener : listeners) {
+ try {
+ listener.onSessionUnsubscribed(session, topicKey);
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+ }
+ }
+
+ public abstract void publish(Object messageData) throws MessageException;
+
+}
Added:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmosphereHandlerProvider.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmosphereHandlerProvider.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmosphereHandlerProvider.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,37 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.atmosphere.cpr.AtmosphereHandler;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public interface AtmosphereHandlerProvider {
+
+ public AtmosphereHandler<HttpServletRequest, HttpServletResponse>
getHandler();
+
+}
Modified:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmospherePushHandler.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmospherePushHandler.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/AtmospherePushHandler.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -22,7 +22,6 @@
package org.richfaces.application.push.impl;
import java.io.IOException;
-import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
@@ -38,7 +37,6 @@
import org.richfaces.application.push.Request;
import org.richfaces.application.push.Session;
import org.richfaces.application.push.SessionManager;
-import org.richfaces.application.push.TopicKey;
/**
* @author Nick Belaevski
@@ -110,26 +108,6 @@
//do nothing
}
- public Session doConnect(String[] topicNames) {
- Session pushSession = createSession(UUID.randomUUID().toString());
- sessionManager.putPushSession(pushSession);
-
- for (int i = 0; i < topicNames.length; i++) {
- TopicKey topicKey = new TopicKey(topicNames[i]);
-
- try {
- pushSession.subscribe(topicKey);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- return pushSession;
- }
-
- protected abstract Session createSession(String key);
-
protected Request createRequest(AtmosphereResource<HttpServletRequest,
HttpServletResponse> resource, Session session) {
return new RequestImpl(resource, session, worker);
}
Added:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/ConsumingCollection.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/ConsumingCollection.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/ConsumingCollection.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl;
+
+import java.util.AbstractCollection;
+import java.util.Iterator;
+import java.util.Queue;
+
+import com.google.common.collect.AbstractIterator;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class ConsumingCollection<T> extends AbstractCollection<T> {
+
+ private final class ConsumingIterator extends AbstractIterator<T> {
+ @Override
+ protected T computeNext() {
+ T next = queue.poll();
+ if (next == null) {
+ endOfData();
+ }
+ return next;
+ }
+ }
+
+ private Queue<T> queue;
+
+ public ConsumingCollection(Queue<T> queue) {
+ super();
+ this.queue = queue;
+ }
+
+ @Override
+ public Iterator<T> iterator() {
+ return new ConsumingIterator();
+ }
+
+ @Override
+ public int size() {
+ return queue.size();
+ }
+
+}
Added:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/PushResource.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,93 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.faces.context.FacesContext;
+
+import org.richfaces.application.ServiceTracker;
+import org.richfaces.application.push.PushContext;
+import org.richfaces.application.push.PushContextFactory;
+import org.richfaces.application.push.Session;
+import org.richfaces.application.push.TopicKey;
+import org.richfaces.resource.DynamicResource;
+import org.richfaces.resource.UserResource;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+@DynamicResource
+public class PushResource implements UserResource {
+
+ private static final String PUSH_TOPIC_PARAM = "pushTopic";
+
+ public Map<String, String> getResponseHeaders() {
+ return null;
+ }
+
+ public Date getLastModified() {
+ return null;
+ }
+
+ public InputStream getInputStream() throws IOException {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ PushContextFactory pushContextFactory =
ServiceTracker.getService(PushContextFactory.class);
+ PushContext pushContext = pushContextFactory.getPushContext();
+
+ Session session =
pushContext.getSessionFactory().createSession(UUID.randomUUID().toString());
+
+ String[] topicNames =
facesContext.getExternalContext().getRequestParameterValuesMap().get(PUSH_TOPIC_PARAM);
+
+ if (topicNames == null) {
+ throw new IllegalArgumentException();
+ }
+
+ for (int i = 0; i < topicNames.length; i++) {
+ TopicKey topicKey = new TopicKey(topicNames[i]);
+
+ try {
+ session.subscribe(topicKey);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ return new ByteArrayInputStream(session.getId().getBytes("UTF-8"));
+ }
+
+ public String getContentType() {
+ return "text/plain";
+ }
+
+ public int getContentLength() {
+ return -1;
+ }
+
+}
Modified:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/RequestImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/RequestImpl.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/RequestImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -36,16 +36,17 @@
import javax.servlet.http.HttpServletResponse;
import org.ajax4jsf.javascript.JSLiteral;
+import org.ajax4jsf.javascript.ScriptString;
import org.ajax4jsf.javascript.ScriptUtils;
import org.atmosphere.cpr.AtmosphereEventLifecycle;
import org.atmosphere.cpr.AtmosphereResource;
import org.atmosphere.cpr.AtmosphereResourceEvent;
import org.atmosphere.cpr.AtmosphereResourceEventListener;
import org.atmosphere.websocket.WebSocketSupport;
-import org.richfaces.application.push.Message;
import org.richfaces.application.push.Request;
import org.richfaces.application.push.RequestLifecycleListener;
import org.richfaces.application.push.Session;
+import org.richfaces.application.push.TopicKey;
/**
* @author Nick Belaevski
@@ -53,6 +54,36 @@
*/
public class RequestImpl implements Request {
+ private static final String TOPIC_KEY = "topic";
+
+ private static final String DATA_KEY = "data";
+
+ private static final class Message implements ScriptString {
+
+ private TopicKey topicKey;
+
+ private String serializedData;
+
+ public Message(TopicKey topicKey, String serializedData) {
+ super();
+ this.topicKey = topicKey;
+ this.serializedData = serializedData;
+ }
+
+ public String toScript() {
+ Map<String,Object> map = new HashMap<String, Object>(2);
+
+ map.put(TOPIC_KEY, topicKey.getTopicName());
+ map.put(DATA_KEY, new JSLiteral(serializedData));
+
+ return ScriptUtils.toScript(map);
+ }
+
+ public void appendScript(StringBuffer functionString) {
+ functionString.append(toScript());
+ }
+ }
+
private static final class FlushMessagesTask implements Runnable {
private Request request;
@@ -131,38 +162,7 @@
}
private String serializeMessages() {
- StringBuilder sb = new StringBuilder();
-
- sb.append("[");
-
- boolean isFirstElement = true;
-
- while (true) {
- Message message = messagesQueue.poll();
- if (message == null) {
- break;
- }
-
- if (isFirstElement) {
- isFirstElement = false;
- } else {
- sb.append(", ");
- }
-
- //TODO - use MessageSerializer
- String messageDataString =
DefaultMessageDataSerializer.instance().serialize(message.getData());
-
- Map<String, Object> map = new HashMap<String, Object>(2);
-
- map.put("data", new JSLiteral(messageDataString));
- map.put("topic", message.getTopicKey().getTopicName());
-
- sb.append(ScriptUtils.toScript(map));
- }
-
- sb.append("]");
-
- return sb.toString();
+ return ScriptUtils.toScript(new
ConsumingCollection<Message>(messagesQueue));
}
public void flushMessages() throws IOException {
@@ -184,8 +184,8 @@
}
}
- public void postMessage(Message message) {
- messagesQueue.add(message);
+ public void postMessage(TopicKey topicKey, String serializedMessage) {
+ messagesQueue.add(new Message(topicKey, serializedMessage));
submitToWorker();
}
Modified:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/SessionManagerImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/SessionManagerImpl.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/SessionManagerImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -21,6 +21,7 @@
*/
package org.richfaces.application.push.impl;
+import java.util.Iterator;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
@@ -30,6 +31,8 @@
import org.richfaces.application.push.Session;
import org.richfaces.application.push.SessionListener;
import org.richfaces.application.push.SessionManager;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
import com.google.common.collect.MapMaker;
@@ -39,6 +42,8 @@
*/
public class SessionManagerImpl implements SessionManager {
+ private static final Logger LOGGER = RichfacesLogger.APPLICATION.getLogger();
+
//TODO - implement queue around sessions properly
private final class DelayedSessionHolder implements Delayed {
@@ -109,8 +114,7 @@
sessionMap.remove(sessionHolder.getSession().getId());
sessionHolder.getSession().destroy();
} catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ LOGGER.error(e.getMessage(), e);
}
}
@@ -156,6 +160,16 @@
public void destroy() {
//TODO notify all session
expirationQueue.clear();
+
+ while (!sessionMap.isEmpty()) {
+ for (Iterator<Session> sessionsItr = sessionMap.values().iterator();
sessionsItr.hasNext(); ) {
+ Session session = sessionsItr.next();
+ sessionsItr.remove();
+
+ session.destroy();
+ }
+ }
+
sessionMap.clear();
}
Modified:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/MessagingContext.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/MessagingContext.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/MessagingContext.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -21,8 +21,10 @@
*/
package org.richfaces.application.push.impl.jms;
+import java.util.Map;
import java.util.UUID;
+import javax.faces.context.FacesContext;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
@@ -31,6 +33,7 @@
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.NamingException;
+import javax.servlet.ServletContext;
import org.richfaces.application.push.TopicKey;
@@ -40,6 +43,8 @@
*/
public class MessagingContext {
+ private static final String SHARED_INSTANCE_KEY = MessagingContext.class.getName();
+
private final InitialContext initialContext;
private final Name connectionFactoryName;
@@ -119,4 +124,13 @@
public String getApplicationName() {
return applicationName;
}
+
+ public void shareInstance(FacesContext facesContext) {
+ Map<String, Object> applicationMap =
facesContext.getExternalContext().getApplicationMap();
+ applicationMap.put(SHARED_INSTANCE_KEY, this);
+ }
+
+ public static MessagingContext getSharedInstance(ServletContext servletContext) {
+ return (MessagingContext) servletContext.getAttribute(SHARED_INSTANCE_KEY);
+ }
}
Deleted:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PublisherContextImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PublisherContextImpl.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PublisherContextImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -1,75 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.application.push.impl.jms;
-
-import java.io.Serializable;
-
-import javax.jms.JMSException;
-import javax.jms.MessageProducer;
-import javax.jms.ObjectMessage;
-import javax.jms.Session;
-import javax.naming.NamingException;
-
-import org.richfaces.application.push.PublisherContext;
-import org.richfaces.application.push.TopicKey;
-
-/**
- * @author Nick Belaevski
- *
- */
-public class PublisherContextImpl implements PublisherContext {
-
- private MessagingContext messagingContext;
-
- public PublisherContextImpl(MessagingContext messagingContext) {
- super();
- this.messagingContext = messagingContext;
- }
-
- public void publish(TopicKey topicKey, Object data) {
- Session session = null;
- try {
- session = messagingContext.createSession();
- MessageProducer producer =
session.createProducer(messagingContext.lookup(topicKey));
-
- ObjectMessage objectMessage = session.createObjectMessage();
- objectMessage.setObject((Serializable) data);
-
- producer.send(objectMessage);
- } catch (JMSException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (NamingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- if (session != null) {
- try {
- session.close();
- } catch (JMSException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
-}
Added:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextFactoryImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextFactoryImpl.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextFactoryImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,57 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl.jms;
+
+import javax.faces.context.FacesContext;
+
+import org.richfaces.application.push.PushContext;
+import org.richfaces.application.push.PushContextFactory;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class PushContextFactoryImpl implements PushContextFactory {
+
+ private static final class PushContextHolder {
+
+ static final PushContext INSTANCE = createInstance();
+
+ private PushContextHolder() {
+ }
+
+ }
+
+ private static PushContext createInstance() {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+
+ PushContextImpl pushContext = new PushContextImpl();
+ pushContext.init(facesContext);
+
+ return pushContext;
+ }
+
+ public PushContext getPushContext() {
+ return PushContextHolder.INSTANCE;
+ }
+
+}
Added:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushContextImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,119 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl.jms;
+
+import javax.faces.FacesException;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.PreDestroyApplicationEvent;
+import javax.faces.event.SystemEvent;
+import javax.faces.event.SystemEventListener;
+import javax.naming.CompositeName;
+import javax.naming.InitialContext;
+import javax.naming.Name;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.atmosphere.cpr.AtmosphereHandler;
+import org.richfaces.application.push.PushContext;
+import org.richfaces.application.push.SessionFactory;
+import org.richfaces.application.push.TopicsContext;
+import org.richfaces.application.push.impl.AtmosphereHandlerProvider;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class PushContextImpl implements PushContext, SystemEventListener,
AtmosphereHandlerProvider {
+
+ private static final Logger LOGGER = RichfacesLogger.APPLICATION.getLogger();
+
+ private MessagingContext messagingContext;
+
+ private TopicsContext topicsContext;
+
+ private PushHandlerImpl pushHandlerImpl;
+
+ public TopicsContext getTopicsContext() {
+ return topicsContext;
+ }
+
+ public void init(FacesContext facesContext) {
+ try {
+
facesContext.getApplication().subscribeToEvent(PreDestroyApplicationEvent.class, this);
+
facesContext.getExternalContext().getApplicationMap().put(PushContext.INSTANCE_KEY_NAME,
this);
+
+ InitialContext initialContext = new InitialContext();
+ Name cnfName = new CompositeName("/ConnectionFactory");
+ Name topicsRootName = new CompositeName("/topic");
+
+ messagingContext = new MessagingContext(initialContext, cnfName,
topicsRootName,
+ facesContext.getExternalContext().getContextName());
+
+ messagingContext.shareInstance(facesContext);
+
+ messagingContext.start();
+
+ topicsContext = new TopicsContextImpl(messagingContext);
+
+ pushHandlerImpl = new PushHandlerImpl(messagingContext, topicsContext);
+ } catch (Exception e) {
+ throw new FacesException(e.getMessage(), e);
+ }
+ }
+
+ public void destroy() {
+ try {
+ messagingContext.stop();
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+
+ try {
+ pushHandlerImpl.destroy();
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ }
+ }
+
+ public void processEvent(SystemEvent event) throws AbortProcessingException {
+ if (event instanceof PreDestroyApplicationEvent) {
+ destroy();
+ } else {
+ throw new IllegalArgumentException(event.getClass().getName());
+ }
+ }
+
+ public boolean isListenerForSource(Object source) {
+ return true;
+ }
+
+ public SessionFactory getSessionFactory() {
+ return pushHandlerImpl;
+ }
+
+ public AtmosphereHandler<HttpServletRequest, HttpServletResponse> getHandler()
{
+ return pushHandlerImpl;
+ }
+}
Modified:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushHandlerImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushHandlerImpl.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/PushHandlerImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -21,57 +21,32 @@
*/
package org.richfaces.application.push.impl.jms;
-import javax.naming.CompositeName;
-import javax.naming.InitialContext;
-import javax.naming.Name;
-import javax.servlet.ServletConfig;
-
-import org.richfaces.application.push.PublisherContext;
import org.richfaces.application.push.Session;
+import org.richfaces.application.push.SessionFactory;
+import org.richfaces.application.push.TopicsContext;
import org.richfaces.application.push.impl.AtmospherePushHandler;
/**
* @author Nick Belaevski
*
*/
-public class PushHandlerImpl extends AtmospherePushHandler {
+public class PushHandlerImpl extends AtmospherePushHandler implements SessionFactory {
private MessagingContext messagingContext;
- private ServletConfig servletConfig;
+ private TopicsContext topicsContext;
- @Override
- protected Session createSession(String key) {
- return new SessionImpl(key, messagingContext);
+ public PushHandlerImpl(MessagingContext messagingContext, TopicsContext
topicsContext) {
+ super();
+ this.messagingContext = messagingContext;
+ this.topicsContext = topicsContext;
}
- @Override
- public void init(ServletConfig servletConfig) throws Exception {
- super.init(servletConfig);
-
- this.servletConfig = servletConfig;
+ public Session createSession(String key) {
+ Session session = new SessionImpl(key, messagingContext, topicsContext);
+ getSessionManager().putPushSession(session);
- InitialContext initialContext = new InitialContext();
- Name cnfName = new CompositeName("/ConnectionFactory");
- Name topicsRootName = new CompositeName("/topic");
-
- messagingContext = new MessagingContext(initialContext, cnfName, topicsRootName,
- servletConfig.getServletContext().getContextPath());
-
- messagingContext.start();
-
- PublisherContext publisherContext = new PublisherContextImpl(messagingContext);
- servletConfig.getServletContext().setAttribute(PublisherContext.ATTRIBUTE_NAME,
publisherContext);
+ return session;
}
-
- @Override
- public void destroy() throws Exception {
- super.destroy();
-
this.servletConfig.getServletContext().removeAttribute(PublisherContext.ATTRIBUTE_NAME);
- this.servletConfig = null;
-
- messagingContext.stop();
- messagingContext = null;
- }
}
Modified:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/SessionImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -29,13 +29,18 @@
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
+import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber;
+import org.richfaces.application.push.AbortSubscriptionException;
import org.richfaces.application.push.Request;
import org.richfaces.application.push.RequestLifecycleListener;
import org.richfaces.application.push.TopicKey;
+import org.richfaces.application.push.TopicsContext;
import org.richfaces.application.push.impl.AbstractSession;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
/**
* @author Nick Belaevski
@@ -43,39 +48,50 @@
*/
public class SessionImpl extends AbstractSession implements RequestLifecycleListener,
MessageListener {
- private MessagingContext messagingContext;
+ private static final Logger LOGGER = RichfacesLogger.APPLICATION.getLogger();
+ private final MessagingContext messagingContext;
+
+ private final TopicsContext topicsContext;
+
private Collection<TopicKey> subscribedTopics = new HashSet<TopicKey>();
private volatile Session jmsSession;
- public SessionImpl(String id, MessagingContext messagingContext) {
+ public SessionImpl(String id, MessagingContext messagingContext, TopicsContext
topicsContext) {
super(id);
this.messagingContext = messagingContext;
+ this.topicsContext = topicsContext;
}
- private String getSubscriptionClientId(TopicKey topic) {
- //TODO add application name
- return "rf-push:" + messagingContext.getApplicationName() +
":" + topic.getTopicName() + ":" + getId();
+ private String getSubscriptionClientId(TopicKey topicKey) {
+ return "rf-push:" + messagingContext.getApplicationName() +
":" + topicKey.getTopicName() + ":" + getId();
}
- public void subscribe(TopicKey topic) throws Exception {
+ public void subscribe(TopicKey topicKey) throws Exception {
Session session = null;
try {
session = messagingContext.createSession();
- //TODO send event to check subscription permissions
- session.createDurableSubscriber(messagingContext.lookup(topic),
getSubscriptionClientId(topic));
- subscribedTopics.add(topic);
+ org.richfaces.application.push.Topic topic =
topicsContext.getTopic(topicKey);
+ try {
+ topic.notifySubscription(this, topicKey);
+
+ //TODO send event to check subscription permissions
+ session.createDurableSubscriber(messagingContext.lookup(topicKey),
getSubscriptionClientId(topicKey));
+ subscribedTopics.add(topicKey);
+ } catch (AbortSubscriptionException e) {
+ // TODO: handle exception
+ }
+
} finally {
if (session != null) {
try {
session.close();
} catch (JMSException e) {
- // TODO: handle exception
- e.printStackTrace();
+ LOGGER.error(e.getMessage(), e);
}
}
}
@@ -83,6 +99,11 @@
@Override
public void destroy() {
+ for (TopicKey topicKey : subscribedTopics) {
+ org.richfaces.application.push.Topic topic =
topicsContext.getTopic(topicKey);
+ topic.notifyUnsubscription(this, topicKey);
+ }
+
// TODO Auto-generated method stub
super.destroy();
@@ -116,16 +137,12 @@
super.disconnect(request);
}
- /* (non-Javadoc)
- * @see
org.richfaces.application.push.RequestLifecycleListener#onFlush(org.richfaces.application.push.Request)
- */
public void onFlush(Request request) {
if (request.isPolling()) {
try {
jmsSession.close();
} catch (JMSException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ LOGGER.error(e.getMessage(), e);
}
}
}
@@ -169,24 +186,38 @@
* @see javax.jms.MessageListener#onMessage(javax.jms.Message)
*/
public void onMessage(Message message) {
- if (!(message instanceof ObjectMessage)) {
- //TODO log
- return;
- }
+ String messageData = null;
try {
- ObjectMessage objectMessage = (ObjectMessage) message;
- String topicName = ((Topic)
objectMessage.getJMSDestination()).getTopicName();
+ String topicName = ((Topic) message.getJMSDestination()).getTopicName();
- org.richfaces.application.push.Message pushMessage = new
org.richfaces.application.push.Message(new TopicKey(topicName));
- pushMessage.setData(objectMessage.getObject());
+ org.richfaces.application.push.Topic topic = topicsContext.getTopic(new
TopicKey(topicName));
+ if (topic == null) {
+ //TODO log
+ return;
+ }
- getRequest().postMessage(pushMessage);
+ if (message.getBooleanProperty(TopicImpl.SERIALIZED_DATA_INDICATOR)) {
+ messageData = ((TextMessage) message).getText();
+ } else if (message instanceof ObjectMessage) {
+ ObjectMessage objectMessage = (ObjectMessage) message;
+ messageData =
topic.getMessageDataSerializer().serialize(objectMessage.getObject());
+ } else if (message instanceof TextMessage) {
+ TextMessage textMessage = (TextMessage) message;
+ messageData =
topic.getMessageDataSerializer().serialize(textMessage.getText());
+ }
- objectMessage.acknowledge();
+
+ if (messageData == null) {
+ //TODO log
+ return;
+ }
+
+ getRequest().postMessage(new TopicKey(topicName), messageData);
+
+ message.acknowledge();
} catch (JMSException e) {
- // TODO: handle exception
- e.printStackTrace();
+ LOGGER.error(e.getMessage(), e);
}
}
}
Added:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,82 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl.jms;
+
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.NamingException;
+
+import org.richfaces.application.push.MessageException;
+import org.richfaces.application.push.TopicKey;
+import org.richfaces.application.push.impl.AbstractTopic;
+import org.richfaces.log.Logger;
+import org.richfaces.log.RichfacesLogger;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class TopicImpl extends AbstractTopic {
+
+ static final String SERIALIZED_DATA_INDICATOR =
"org_richfaces_push_SerializedData";
+
+ private static final Logger LOGGER = RichfacesLogger.APPLICATION.getLogger();
+
+ private MessagingContext messagingContext;
+
+ public TopicImpl(TopicKey key, MessagingContext messagingContext) {
+ super(key);
+
+ this.messagingContext = messagingContext;
+ }
+
+ @Override
+ public void publish(Object messageData) throws MessageException {
+ String serializedData = getMessageDataSerializer().serialize(messageData);
+
+ Session session = null;
+ try {
+ session = messagingContext.createSession();
+ MessageProducer producer =
session.createProducer(messagingContext.lookup(getKey()));
+
+ TextMessage textMessage = session.createTextMessage();
+ textMessage.setText(serializedData);
+ textMessage.setBooleanProperty(SERIALIZED_DATA_INDICATOR, true);
+
+ producer.send(textMessage);
+ } catch (JMSException e) {
+ throw new MessageException(e.getMessage(), e);
+ } catch (NamingException e) {
+ throw new MessageException(e.getMessage(), e);
+ } finally {
+ if (session != null) {
+ try {
+ session.close();
+ } catch (JMSException e) {
+ LOGGER.debug(e.getMessage(), e);
+ }
+ }
+ }
+ }
+}
Added:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicsContextImpl.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicsContextImpl.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/application/push/impl/jms/TopicsContextImpl.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.application.push.impl.jms;
+
+import org.richfaces.application.push.Topic;
+import org.richfaces.application.push.TopicKey;
+import org.richfaces.application.push.TopicsContext;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class TopicsContextImpl extends TopicsContext {
+
+ private MessagingContext messagingContext;
+
+ public TopicsContextImpl(MessagingContext messagingContext) {
+ super();
+ this.messagingContext = messagingContext;
+ }
+
+ protected Topic createTopic(TopicKey key) {
+ return new TopicImpl(key, messagingContext);
+ }
+
+}
Modified:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/renderkit/PushRendererBase.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/renderkit/PushRendererBase.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/renderkit/PushRendererBase.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -21,16 +21,17 @@
*/
package org.richfaces.renderkit;
-import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
+import javax.faces.application.Resource;
+import javax.faces.application.ResourceHandler;
import javax.faces.component.UIComponent;
-import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.render.Renderer;
import org.ajax4jsf.javascript.ScriptUtils;
+import org.richfaces.application.push.impl.PushResource;
import org.richfaces.component.AbstractPush;
/**
@@ -42,11 +43,10 @@
private static final String PUSH_URL_ENCODED_ATTRIBUTE =
PushRendererBase.class.getName();
protected String getPushUrl(FacesContext context) {
- ExternalContext ec = context.getExternalContext();
+ ResourceHandler resourceHandler = context.getApplication().getResourceHandler();
+ Resource pushResource =
resourceHandler.createResource(PushResource.class.getName());
- return MessageFormat.format("{0}://{1}:{2,number,#####}{3}/push",
- ec.getRequestScheme(), ec.getRequestServerName(),
- ec.getRequestServerPort(), ec.getRequestContextPath());
+ return pushResource.getRequestPath();
}
protected boolean shouldEncodePushUrl(FacesContext context) {
Added: branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushFilter.java
===================================================================
--- branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushFilter.java
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushFilter.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1,143 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.webapp;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.atmosphere.cpr.AtmosphereServlet;
+import org.richfaces.application.push.PushContext;
+import org.richfaces.application.push.impl.AtmosphereHandlerProvider;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+//TODO override broadcaster
+public class PushFilter implements Filter {
+
+ private static final String PUSH_HUB_MAPPING = "/*";
+
+ private static final long serialVersionUID = 7616370505508715222L;
+
+ /**
+ * @author Nick Belaevski
+ *
+ */
+ private final class ServletConfigFacade implements ServletConfig {
+ /**
+ *
+ */
+ private final FilterConfig filterConfig;
+
+ /**
+ * @param filterConfig
+ */
+ private ServletConfigFacade(FilterConfig filterConfig) {
+ this.filterConfig = filterConfig;
+ }
+
+ public String getServletName() {
+ return filterConfig.getFilterName();
+ }
+
+ public ServletContext getServletContext() {
+ return filterConfig.getServletContext();
+ }
+
+ public String getInitParameter(String name) {
+ return filterConfig.getInitParameter(name);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Enumeration<String> getInitParameterNames() {
+ return filterConfig.getInitParameterNames();
+ }
+ }
+
+ private AtmosphereServlet atmosphereServlet;
+
+ public void init(FilterConfig filterConfig) throws ServletException {
+ AtmosphereHandlerProvider handlerProvider = (AtmosphereHandlerProvider)
filterConfig.getServletContext().getAttribute(PushContext.INSTANCE_KEY_NAME);
+
+ if (handlerProvider == null) {
+ return;
+ }
+
+ atmosphereServlet = new AtmosphereServlet() {
+
+ private static final long serialVersionUID = -8719394110408476331L;
+
+ protected boolean detectSupportedFramework(ServletConfig sc) throws
ClassNotFoundException, IllegalAccessException, InstantiationException
,NoSuchMethodException ,java.lang.reflect.InvocationTargetException {
+ return false;
+ };
+ };
+ ServletConfigFacade servletConfig = new ServletConfigFacade(filterConfig);
+ atmosphereServlet.init(servletConfig);
+
+ atmosphereServlet.addAtmosphereHandler(PUSH_HUB_MAPPING,
handlerProvider.getHandler());
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
javax.servlet.ServletResponse, javax.servlet.FilterChain)
+ */
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain
chain) throws IOException,
+ ServletException {
+
+ if (atmosphereServlet != null && request instanceof HttpServletRequest
&& response instanceof HttpServletResponse) {
+ HttpServletRequest httpReq = (HttpServletRequest) request;
+ HttpServletResponse httpResp = (HttpServletResponse) response;
+
+ if ("GET".equals(httpReq.getMethod()) &&
httpReq.getQueryString() != null &&
httpReq.getQueryString().contains("__richfacesPushAsync")) {
+ atmosphereServlet.doGet(httpReq, httpResp);
+ return;
+ }
+ }
+
+ // TODO Auto-generated method stub
+ chain.doFilter(request, response);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.Filter#destroy()
+ */
+ public void destroy() {
+ if (atmosphereServlet != null) {
+ atmosphereServlet.removeAtmosphereHandler(PUSH_HUB_MAPPING);
+ atmosphereServlet.destroy();
+ atmosphereServlet = null;
+ }
+ // TODO Auto-generated method stub
+ }
+
+}
Deleted:
branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushServlet.java
===================================================================
---
branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushServlet.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/java/org/richfaces/webapp/PushServlet.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -1,104 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc. and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
- */
-package org.richfaces.webapp;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.atmosphere.cpr.AtmosphereServlet;
-import org.richfaces.application.push.Session;
-import org.richfaces.application.push.impl.AtmospherePushHandler;
-import org.richfaces.application.push.impl.jms.PushHandlerImpl;
-
-/**
- * @author Nick Belaevski
- *
- */
-//TODO override broadcaster
-public class PushServlet extends AtmosphereServlet {
-
- private static final String PUSH_HUB_MAPPING = "/push/hub/*";
-
- private static final long serialVersionUID = 7616370505508715222L;
-
- private static final String PUSH_TOPIC_PARAM = "pushTopic[]";
-
- private AtmospherePushHandler pushHandler;
-
- @Override
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
-
- pushHandler = new PushHandlerImpl();
- try {
- pushHandler.init(config);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- addAtmosphereHandler(PUSH_HUB_MAPPING, pushHandler);
- }
-
- @Override
- public void destroy() {
- super.destroy();
-
- try {
- pushHandler.destroy();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- pushHandler = null;
-
- removeAtmosphereHandler(PUSH_HUB_MAPPING);
- }
-
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
- String[] topicNames = req.getParameterValues(PUSH_TOPIC_PARAM);
- Session pushSession = pushHandler.doConnect(topicNames);
-
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.getWriter().write(pushSession.getId());
- }
-
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse res) throws
IOException, ServletException {
- doCometSupport(req, res);
- }
-
- /* (non-Javadoc)
- * @see
org.atmosphere.cpr.AtmosphereServlet#detectSupportedFramework(javax.servlet.ServletConfig)
- */
- @Override
- protected boolean detectSupportedFramework(ServletConfig sc) throws
ClassNotFoundException, IllegalAccessException,
- InstantiationException, NoSuchMethodException, InvocationTargetException {
-
- return false;
- }
-}
Modified:
branches/RF-7817/push-redesign/src/main/resources/META-INF/resources/org.richfaces/push.js
===================================================================
---
branches/RF-7817/push-redesign/src/main/resources/META-INF/resources/org.richfaces/push.js 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign/src/main/resources/META-INF/resources/org.richfaces/push.js 2010-10-21
00:31:11 UTC (rev 19622)
@@ -56,7 +56,7 @@
var connect = function() {
var pushSessionIdRequestHandler = function(data) {
pushSessionId = data;
- _$.atmosphere.subscribe(pushUrl + "/hub?pushSessionId=" + pushSessionId,
messageCallback, {
+ _$.atmosphere.subscribe(pushUrl +
"?__richfacesPushAsync=1&pushSessionId=" + pushSessionId, messageCallback,
{
transport: 'websocket'
});
};
@@ -68,7 +68,14 @@
//TODO handle request errors
//TODO separate URLs
- _$.post(pushUrl + "/connect", {"pushTopic": topics},
pushSessionIdRequestHandler, 'text');
+ _$.ajax({
+ data: {"pushTopic": topics},
+ dataType: 'text',
+ success: pushSessionIdRequestHandler,
+ traditional: true,
+ type: 'POST',
+ url: pushUrl
+ });
};
var disconnect = function() {
Added:
branches/RF-7817/push-redesign/src/main/resources/META-INF/services/org.richfaces.application.push.PushContextFactory
===================================================================
---
branches/RF-7817/push-redesign/src/main/resources/META-INF/services/org.richfaces.application.push.PushContextFactory
(rev 0)
+++
branches/RF-7817/push-redesign/src/main/resources/META-INF/services/org.richfaces.application.push.PushContextFactory 2010-10-21
00:31:11 UTC (rev 19622)
@@ -0,0 +1 @@
+org.richfaces.application.push.impl.jms.PushContextFactoryImpl
\ No newline at end of file
Modified: branches/RF-7817/push-redesign-app/pom.xml
===================================================================
--- branches/RF-7817/push-redesign-app/pom.xml 2010-10-21 00:19:03 UTC (rev 19621)
+++ branches/RF-7817/push-redesign-app/pom.xml 2010-10-21 00:31:11 UTC (rev 19622)
@@ -62,15 +62,15 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>javax.servlet</groupId>
+ <groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api</artifactId>
- <version>3.0-alpha-1</version>
+ <version>3.0.20100224</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.atmosphere</groupId>
<artifactId>atmosphere-runtime</artifactId>
- <version>0.6.2</version>
+ <version>0.6.3</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
Modified: branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java 2010-10-21
00:19:03 UTC (rev 19621)
+++ branches/RF-7817/push-redesign-app/src/main/java/demo/ChatBean.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -25,12 +25,15 @@
import java.text.MessageFormat;
import java.util.Date;
+import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
-import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
-import org.richfaces.application.push.PublisherContext;
+import org.richfaces.application.push.MessageException;
import org.richfaces.application.push.TopicKey;
+import org.richfaces.application.push.TopicsContext;
+import org.richfaces.log.LogFactory;
+import org.richfaces.log.Logger;
/**
* @author Nick Belaevski
@@ -42,15 +45,21 @@
private static final long serialVersionUID = -6377543444437645751L;
+ private static final Logger LOGGER = LogFactory.getLogger(ChatBean.class);
+
private String userName;
private String message;
private boolean chatJoined;
- @ManagedProperty("#{" + PublisherContext.ATTRIBUTE_NAME + "}")
- private transient PublisherContext publisherContext;
+ private transient TopicsContext topicsContext;
+ @PostConstruct
+ public void init() {
+ topicsContext = TopicsContext.lookup();
+ }
+
public String getMessage() {
return message;
}
@@ -74,20 +83,26 @@
}
chatJoined = true;
- publisherContext.publish(new TopicKey("chat"),
MessageFormat.format("*** {0} joined chat in {1,time,medium}",
- userName, new Date()));
+ try {
+ topicsContext.publish(new TopicKey("chat"),
MessageFormat.format("*** {0} joined chat in {1,time,medium}",
+ userName, new Date()));
+ } catch (MessageException e) {
+ LOGGER.error(e.getMessage(), e);
+ }
}
}
public void say() {
- publisherContext.publish(new TopicKey("chat"),
MessageFormat.format("{0,time,medium} {1}: {2}", new Date(),
- userName, message));
+ try {
+ topicsContext.publish(new TopicKey("chat"),
MessageFormat.format("{0,time,medium} {1}: {2}", new Date(),
+ userName, message));
+ } catch (MessageException e) {
+ LOGGER.error(e.getMessage(), e);
+ }
}
- /**
- * @param publisherContext the publisherContext to set
- */
- public void setPublisherContext(PublisherContext publisherContext) {
- this.publisherContext = publisherContext;
+ public void setTopicsContext(TopicsContext topicsContext) {
+ this.topicsContext = topicsContext;
}
+
}
Modified: branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java
===================================================================
---
branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java 2010-10-21
00:19:03 UTC (rev 19621)
+++
branches/RF-7817/push-redesign-app/src/main/java/demo/TopicsInitializer.java 2010-10-21
00:31:11 UTC (rev 19622)
@@ -21,13 +21,18 @@
*/
package demo;
+import java.text.MessageFormat;
+
+import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.SystemEvent;
import javax.faces.event.SystemEventListener;
+import javax.servlet.http.HttpServletRequest;
-import org.richfaces.application.ServiceTracker;
+import org.richfaces.application.push.Session;
import org.richfaces.application.push.Topic;
import org.richfaces.application.push.TopicKey;
+import org.richfaces.application.push.TopicListener;
import org.richfaces.application.push.TopicsContext;
import org.richfaces.application.push.impl.DefaultMessageDataSerializer;
@@ -39,11 +44,28 @@
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException {
- TopicsContext topicsContext = ServiceTracker.getService(TopicsContext.class);
+ TopicsContext topicsContext = TopicsContext.lookup();
- Topic topic = topicsContext.getOrCreateTopic(new
TopicKey("chatTopic"));
+ Topic topic = topicsContext.getOrCreateTopic(new TopicKey("chat"));
- topic.setMessageSerializer(DefaultMessageDataSerializer.instance());
+ topic.setMessageDataSerializer(DefaultMessageDataSerializer.instance());
+
+ topic.addTopicListener(new TopicListener() {
+
+ @Override
+ public void onSessionUnsubscribed(Session session, TopicKey topicKey) {
+ System.out.println(MessageFormat.format("Session {0} disconnected
from {1}", session.getId(), topicKey.getTopicName()));
+ }
+
+ @Override
+ public void onSessionSubscribed(Session session, TopicKey topicKey) {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ HttpServletRequest hsr = (HttpServletRequest)
facesContext.getExternalContext().getRequest();
+
+ System.out.println(MessageFormat.format("Session {0} connected to
{1} from {2}", session.getId(),
+ topicKey.getTopicName(), hsr.getRemoteAddr()));
+ }
+ });
}
@Override
Modified: branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/faces-config.xml 2010-10-21
00:19:03 UTC (rev 19621)
+++ branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/faces-config.xml 2010-10-21
00:31:11 UTC (rev 19622)
@@ -14,5 +14,19 @@
<system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class>
</system-event-listener>
</application>
+
+ <navigation-rule>
+ <from-view-id>*</from-view-id>
+ <navigation-case>
+ <from-outcome>chat</from-outcome>
+ <to-view-id>/chat.xhtml</to-view-id>
+ <redirect>
+ <view-param>
+ <name>username</name>
+ <value>#{username}</value>
+ </view-param>
+ </redirect>
+ </navigation-case>
+ </navigation-rule>
</faces-config>
\ No newline at end of file
Modified: branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/web.xml
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/web.xml 2010-10-21 00:19:03
UTC (rev 19621)
+++ branches/RF-7817/push-redesign-app/src/main/webapp/WEB-INF/web.xml 2010-10-21 00:31:11
UTC (rev 19622)
@@ -12,6 +12,19 @@
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
+
+ <filter-mapping>
+ <filter-name>PushFilter</filter-name>
+ <url-pattern>/faces/*</url-pattern>
+ </filter-mapping>
+
+ <filter>
+ <filter-name>PushFilter</filter-name>
+ <filter-class>org.richfaces.webapp.PushFilter</filter-class>
+ <async-supported>true</async-supported>
+ </filter>
+
+ <!--
<servlet>
<servlet-name>push</servlet-name>
<servlet-class>org.richfaces.webapp.PushServlet</servlet-class>
@@ -26,7 +39,7 @@
<servlet-name>push</servlet-name>
<url-pattern>/push/*</url-pattern>
</servlet-mapping>
-
+ -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
Copied: branches/RF-7817/push-redesign-app/src/main/webapp/chat.xhtml (from rev 19574,
branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml)
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/webapp/chat.xhtml
(rev 0)
+++ branches/RF-7817/push-redesign-app/src/main/webapp/chat.xhtml 2010-10-21 00:31:11 UTC
(rev 19622)
@@ -0,0 +1,41 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html
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://richfaces.org/push-redesign">
+
+ <f:view>
+ <f:metadata>
+ <f:viewParam name="username" value="#{chatBean.userName}"
/>
+ <f:event type="preRenderView"
listener="#{chatBean.joinChat}"/>
+ </f:metadata>
+ <h:head>
+ </h:head>
+ <h:body>
+ <h:form id="form">
+ <p:push topic="chat" ondataavailable="jQuery('<div
/>').prependTo('.chatOutput').text(data)" />
+
+ You are: #{chatBean.userName} <br />
+
+ <h:inputText styleClass="messageInput"
value="#{chatBean.message}" size="40" />
+
+ <script type="text/javascript">
+ function clearInput(event) {
+ if (event.status == 'success') {
+ jQuery('.messageInput').val('');
+ }
+ }
+ </script>
+
+ <h:commandLink value="ajax" action="#{chatBean.say}">
+ <f:ajax execute="@form" onevent="clearInput" />
+ </h:commandLink>
+
+ <h:panelGroup id="group" styleClass="chatOutput"
layout="block" />
+ </h:form>
+ </h:body>
+ </f:view>
+</html>
\ No newline at end of file
Added: branches/RF-7817/push-redesign-app/src/main/webapp/index.jsp
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/webapp/index.jsp
(rev 0)
+++ branches/RF-7817/push-redesign-app/src/main/webapp/index.jsp 2010-10-21 00:31:11 UTC
(rev 19622)
@@ -0,0 +1,6 @@
+<%@ page language="java" contentType="text/html;
charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+
+<%
+ response.sendRedirect(request.getContextPath() + "/faces/index.xhtml");
+%>
\ No newline at end of file
Modified: branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml
===================================================================
--- branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml 2010-10-21 00:19:03 UTC
(rev 19621)
+++ branches/RF-7817/push-redesign-app/src/main/webapp/index.xhtml 2010-10-21 00:31:11 UTC
(rev 19622)
@@ -4,37 +4,15 @@
<html
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://richfaces.org/push-redesign">
+
xmlns:f="http://java.sun.com/jsf/core">
<f:view>
- <f:metadata>
- <f:viewParam name="username" value="#{chatBean.userName}"
/>
- <f:event type="preRenderView"
listener="#{chatBean.joinChat}"/>
- </f:metadata>
<h:head>
</h:head>
<h:body>
<h:form id="form">
- <p:push topic="chat" ondataavailable="jQuery('<div
/>').prependTo('.chatOutput').text(data)" />
-
- You are: #{chatBean.userName} <br />
-
- <h:inputText styleClass="messageInput"
value="#{chatBean.message}" size="40" />
-
- <script type="text/javascript">
- function clearInput(event) {
- if (event.status == 'success') {
- jQuery('.messageInput').val('');
- }
- }
- </script>
-
- <h:commandLink value="ajax" action="#{chatBean.say}">
- <f:ajax execute="@form" onevent="clearInput" />
- </h:commandLink>
-
- <h:panelGroup id="group" styleClass="chatOutput"
layout="block" />
+ Enter username: <h:inputText value="#{username}"
required="true" />
+ <h:commandLink action="chat" value="Enter chat" />
</h:form>
</h:body>
</f:view>