Repository: wicket
Updated Branches:
  refs/heads/master 02bcd8523 -> 1a7998544


WICKET-4660 Make it possible to notify about Atmosphere internal events

(cherry picked from commit 39c2b674abf79f458417450c37010a353c70917e)


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/1a799854
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/1a799854
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/1a799854

Branch: refs/heads/master
Commit: 1a79985446b0a09de6ef699cd7dc4609df7b63d8
Parents: 02bcd85
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Thu Aug 14 16:20:10 2014 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Thu Aug 14 16:20:28 2014 +0200

----------------------------------------------------------------------
 .../wicket/examples/atmosphere/HomePage.java    |  7 ++
 .../wicket/atmosphere/AtmosphereBehavior.java   | 24 +++++-
 .../atmosphere/AtmosphereInternalEvent.java     | 88 ++++++++++++++++++++
 .../org/apache/wicket/atmosphere/EventBus.java  | 36 ++++++++
 4 files changed, 154 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/1a799854/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
----------------------------------------------------------------------
diff --git 
a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
 
b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
index 29e38b7..7377c48 100644
--- 
a/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
+++ 
b/wicket-examples/src/main/java/org/apache/wicket/examples/atmosphere/HomePage.java
@@ -21,6 +21,7 @@ import java.util.Date;
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.atmosphere.AtmosphereInternalEvent;
 import org.apache.wicket.atmosphere.EventBus;
 import org.apache.wicket.atmosphere.Subscribe;
 import org.apache.wicket.examples.WicketExamplePage;
@@ -83,4 +84,10 @@ public class HomePage extends WicketExamplePage
                messageLabel.setDefaultModelObject(message.getMessage());
                target.add(messageLabel);
        }
+
+       @Subscribe
+       public void internalEvent(AjaxRequestTarget target, 
AtmosphereInternalEvent message)
+       {
+//             System.err.println(message);
+       }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/1a799854/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereBehavior.java
----------------------------------------------------------------------
diff --git 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereBehavior.java
 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereBehavior.java
index 1d04911..61d281d 100644
--- 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereBehavior.java
+++ 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereBehavior.java
@@ -143,6 +143,11 @@ public class AtmosphereBehavior extends Behavior
                        Meteor meteor = 
Meteor.lookup(event.getResource().getRequest());
                        meteor.resume();
                }
+               EventBus eventBus = findEventBus();
+               if (eventBus.isWantAtmosphereNotifications())
+               {
+                       eventBus.post(new 
AtmosphereInternalEvent(AtmosphereInternalEvent.Type.Broadcast, event));
+               }
        }
 
        @Override
@@ -167,6 +172,11 @@ public class AtmosphereBehavior extends Behavior
                        log.debug(String.format("Resuming the %s response from 
ip %s:%s", transport == null
                                ? "websocket" : transport, 
atmosphereRequest.getRemoteAddr(), atmosphereRequest.getRemotePort()));
                }
+               EventBus eventBus = findEventBus();
+               if (eventBus.isWantAtmosphereNotifications())
+               {
+                       eventBus.post(new 
AtmosphereInternalEvent(AtmosphereInternalEvent.Type.Resume, event));
+               }
        }
 
        @Override
@@ -181,9 +191,15 @@ public class AtmosphereBehavior extends Behavior
                }
                // It is possible that the application has already been 
destroyed, in which case
                // unregistration is no longer needed
+               EventBus eventBus = findEventBus();
                if (Application.get(applicationKey) != null)
                {
-                       
findEventBus().unregisterConnection(event.getResource().uuid());
+                       
eventBus.unregisterConnection(event.getResource().uuid());
+               }
+
+               if (eventBus.isWantAtmosphereNotifications())
+               {
+                       eventBus.post(new 
AtmosphereInternalEvent(AtmosphereInternalEvent.Type.Disconnect, event));
                }
        }
 
@@ -192,6 +208,12 @@ public class AtmosphereBehavior extends Behavior
        {
                Throwable throwable = event.throwable();
                log.error(throwable.getMessage(), throwable);
+
+               EventBus eventBus = findEventBus();
+               if (eventBus.isWantAtmosphereNotifications())
+               {
+                       eventBus.post(new 
AtmosphereInternalEvent(AtmosphereInternalEvent.Type.Throwable, event));
+               }
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/1a799854/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereInternalEvent.java
----------------------------------------------------------------------
diff --git 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereInternalEvent.java
 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereInternalEvent.java
new file mode 100644
index 0000000..46b8da6
--- /dev/null
+++ 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereInternalEvent.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.atmosphere;
+
+import org.atmosphere.cpr.AtmosphereResourceEvent;
+
+/**
+ * An event that is broadcasted by the EventBus whenever Atmosphere notifies
+ * {@linkplain org.apache.wicket.atmosphere.AtmosphereBehavior} about {@link 
org.atmosphere.cpr.AtmosphereResourceEventListener}
+ * events.
+ *
+ * To be notified add a method like the one below to your components:
+ * <pre><code>{@literal
+ *      @Subscribe
+ *      public void anyName(AjaxRequestTarget target, AtmosphereInternalEvent 
event) {
+ *          switch (event.getType()) {
+ *              case Resume: ...; break;
+ *              case Disconnect: ...; break;
+ *              ....
+ *          }
+ *      }
+ * }</code></pre>
+ *
+ * @see org.apache.wicket.atmosphere.EventBus#wantAtmosphereNotifications
+ * @see org.atmosphere.cpr.AtmosphereResourceEventListener
+ */
+public class AtmosphereInternalEvent
+{
+       /**
+        * The types enumerating the notification methods in {@link 
org.atmosphere.cpr.AtmosphereResourceEventListener}
+        *
+        * Suspend type is not supported because it is not possible to push 
messages with suspended connection
+        */
+       public static enum Type
+       {
+               PreSuspend, /*Suspend,*/ Resume, Disconnect, Broadcast, 
Throwable, Close
+       }
+
+       /**
+        * The internal Atmosphere event
+        */
+       private final AtmosphereResourceEvent event;
+
+       /**
+        * The type of the notification
+        */
+       private final Type type;
+
+
+       public AtmosphereInternalEvent(Type type, AtmosphereResourceEvent event)
+       {
+               this.type = type;
+               this.event = event;
+       }
+
+       public AtmosphereResourceEvent getEvent()
+       {
+               return event;
+       }
+
+       public Type getType()
+       {
+               return type;
+       }
+
+       @Override
+       public String toString()
+       {
+               return "AtmosphereInternalEvent{" +
+                               "event=" + event +
+                               ", type=" + type +
+                               '}';
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/1a799854/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
----------------------------------------------------------------------
diff --git 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
index 8935864..e4dd4a5 100644
--- 
a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
+++ 
b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
@@ -114,6 +114,16 @@ public class EventBus implements UnboundListener
        private final AtmosphereParameters parameters = new 
AtmosphereParameters();
 
        /**
+        * A flag indicating whether to be notified about Atmosphere internal 
events
+        *
+        * <strong>Caution:</strong>: enabling this may cause a lot of 
<em>onBroadcast</em> notifications
+        *
+        * @see org.apache.wicket.atmosphere.AtmosphereInternalEvent
+        * @see org.atmosphere.cpr.AtmosphereResourceEventListener
+        */
+       private boolean wantAtmosphereNotifications = false;
+
+       /**
         * Creates and registers an {@code EventBus} for the given application. 
The first broadcaster
         * returned by the {@code BroadcasterFactory} is used.
         *
@@ -493,4 +503,30 @@ public class EventBus implements UnboundListener
                        curListener.resourceUnregistered(uuid);
                }
        }
+
+       /**
+        * @see org.apache.wicket.atmosphere.AtmosphereInternalEvent
+        * @see org.atmosphere.cpr.AtmosphereResourceEventListener
+        * @return whether to be notified about Atmosphere internal events or 
not
+        */
+       public boolean isWantAtmosphereNotifications()
+       {
+               return wantAtmosphereNotifications;
+       }
+
+       /**
+        * A flag indicating whether to be notified about Atmosphere internal 
events
+        *
+        * <strong>Caution:</strong>: enabling this may cause a lot of 
<em>onBroadcast</em> notifications
+        *
+        * @param wantAtmosphereNotifications
+        *          {@code true} to be notified, {@code false} - otherwise
+        * @see org.apache.wicket.atmosphere.AtmosphereInternalEvent
+        * @see org.atmosphere.cpr.AtmosphereResourceEventListener
+        */
+       public EventBus setWantAtmosphereNotifications(boolean 
wantAtmosphereNotifications)
+       {
+               this.wantAtmosphereNotifications = wantAtmosphereNotifications;
+               return this;
+       }
 }

Reply via email to