You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/08/15 09:51:11 UTC

[01/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Repository: wicket
Updated Branches:
  refs/heads/wicket-6.x 39c2b674a -> 3afcc3b79


WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Quick and dirty implementation of WicketAtmosphereTester


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

Branch: refs/heads/wicket-6.x
Commit: 2ab1d798e3348ba7037ab461e1be6df55cd68457
Parents: f0eb015
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Aug 12 17:08:30 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:44:12 2014 +0200

----------------------------------------------------------------------
 .../wicket/atmosphere/AtmosphereBehavior.java   | 18 ++---
 .../atmosphere/tester/TesterAsyncSupport.java   | 70 ++++++++++++++++
 .../atmosphere/tester/TesterEventBus.java       | 66 +++++++++++++++
 .../tester/WicketAtmosphereTester.java          | 76 ++++++++++++++++++
 .../atmosphere/AtmosphereApplication.java       | 79 ++++++++++++++++++
 .../wicket/atmosphere/AtmosphereTest.java       | 65 +++++++++++++++
 .../apache/wicket/atmosphere/ChatMessage.java   | 42 ++++++++++
 .../org/apache/wicket/atmosphere/HomePage.html  | 24 ++++++
 .../org/apache/wicket/atmosphere/HomePage.java  | 84 ++++++++++++++++++++
 .../wicket/atmosphere/ReceiverFilter.java       | 40 ++++++++++
 10 files changed, 551 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/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..9df55bc 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
@@ -24,7 +24,7 @@ import org.apache.wicket.Page;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.json.JSONException;
 import org.apache.wicket.ajax.json.JSONObject;
-import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.behavior.AbstractAjaxBehavior;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
@@ -49,9 +49,8 @@ import org.slf4j.LoggerFactory;
  * 
  * @author papegaaij
  */
-public class AtmosphereBehavior extends Behavior
+public class AtmosphereBehavior extends AbstractAjaxBehavior
 	implements
-		IResourceListener,
 		AtmosphereResourceEventListener
 {
 	private static final Logger log = LoggerFactory.getLogger(AtmosphereBehavior.class);
@@ -68,8 +67,6 @@ public class AtmosphereBehavior extends Behavior
 
 	private String applicationKey;
 
-	private Component component;
-
 
 	/**
 	 * Construct.
@@ -85,12 +82,6 @@ public class AtmosphereBehavior extends Behavior
 	}
 
 	@Override
-	public void bind(Component component)
-	{
-		this.component = component;
-	}
-
-	@Override
 	public final boolean getStatelessHint(Component component)
 	{
 		return false;
@@ -106,8 +97,9 @@ public class AtmosphereBehavior extends Behavior
 	{
 	}
 
+
 	@Override
-	public void onResourceRequested()
+	public void onRequest()
 	{
 		RequestCycle requestCycle = RequestCycle.get();
 		ServletWebRequest request = (ServletWebRequest)requestCycle.getRequest();
@@ -119,7 +111,7 @@ public class AtmosphereBehavior extends Behavior
 		meteor.suspend(-1);
 
 		String uuid = meteor.getAtmosphereResource().uuid();
-		Page page = component.getPage();
+		Page page = getComponent().getPage();
 		page.setMetaData(ATMOSPHERE_UUID, uuid);
 		findEventBus().registerPage(uuid, page);
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java
new file mode 100644
index 0000000..60a3cc0
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java
@@ -0,0 +1,70 @@
+/*
+ * 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.tester;
+
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+
+import org.atmosphere.cpr.Action;
+import org.atmosphere.cpr.AsyncSupport;
+import org.atmosphere.cpr.AtmosphereRequest;
+import org.atmosphere.cpr.AtmosphereResource;
+import org.atmosphere.cpr.AtmosphereResponse;
+
+/**
+ *
+ */
+public class TesterAsyncSupport<E extends AtmosphereResource> implements AsyncSupport<E>
+{
+	@Override
+	public String getContainerName()
+	{
+		return "wicket-atmosphere-tester";
+	}
+
+	@Override
+	public void init(ServletConfig sc) throws ServletException
+	{
+
+	}
+
+	@Override
+	public Action service(AtmosphereRequest req, AtmosphereResponse res) throws IOException, ServletException
+	{
+		return Action.CONTINUE;
+	}
+
+	@Override
+	public void action(E actionEvent)
+	{
+		System.err.println("TesterEventSupport#action(): " + actionEvent);
+	}
+
+	@Override
+	public boolean supportWebSocket()
+	{
+		return true;
+	}
+
+	@Override
+	public AsyncSupport complete(E r)
+	{
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
new file mode 100644
index 0000000..8f30a37
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
@@ -0,0 +1,66 @@
+/*
+ * 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.tester;
+
+import org.apache.wicket.application.IComponentOnBeforeRenderListener;
+import org.apache.wicket.atmosphere.EventBus;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.atmosphere.cpr.AtmosphereConfig;
+import org.atmosphere.cpr.AtmosphereFramework;
+import org.atmosphere.cpr.BroadcasterLifeCyclePolicy;
+import org.atmosphere.cpr.DefaultBroadcasterFactory;
+import org.atmosphere.util.SimpleBroadcaster;
+
+/**
+ *
+ */
+public class TesterEventBus extends EventBus
+{
+	AtmosphereFramework framework = new AtmosphereFramework();
+	AtmosphereConfig config = new AtmosphereConfig(framework);
+	IComponentOnBeforeRenderListener eventSubscriptionCollector;
+
+	public TesterEventBus(WebApplication application)
+	{
+		super(application, new SimpleBroadcaster());
+
+		framework.setBroadcasterFactory(new TesterBroadcasterFactory(config));
+
+		getBroadcaster().initialize("wicket-atmopshere-tester", config);
+	}
+
+	@Override
+	protected IComponentOnBeforeRenderListener createEventSubscriptionCollector()
+	{
+		eventSubscriptionCollector = super.createEventSubscriptionCollector();
+		return eventSubscriptionCollector;
+	}
+
+	@Override
+	public SimpleBroadcaster getBroadcaster()
+	{
+		return (SimpleBroadcaster) super.getBroadcaster();
+	}
+
+	private static class TesterBroadcasterFactory extends DefaultBroadcasterFactory
+	{
+		protected TesterBroadcasterFactory(AtmosphereConfig c)
+		{
+			super(SimpleBroadcaster.class, BroadcasterLifeCyclePolicy.ATMOSPHERE_RESOURCE_POLICY.NEVER.name(), c);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java
new file mode 100644
index 0000000..9ae8ad6
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java
@@ -0,0 +1,76 @@
+/*
+ * 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.tester;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.atmosphere.AtmosphereBehavior;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.util.tester.WicketTester;
+import org.atmosphere.cpr.AtmosphereRequest;
+import org.atmosphere.cpr.AtmosphereResource;
+import org.atmosphere.cpr.AtmosphereResourceImpl;
+import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.handler.AtmosphereHandlerAdapter;
+import org.atmosphere.util.SimpleBroadcaster;
+
+/**
+ *
+ */
+public class WicketAtmosphereTester
+{
+	private final TesterEventBus eventBus;
+
+	public WicketAtmosphereTester(final WicketTester wicketTester, Page page)
+	{
+		WebApplication application = wicketTester.getApplication();
+		this.eventBus = new TesterEventBus(application);
+
+		AtmosphereBehavior atmosphereBehavior = new AtmosphereBehavior()
+		{
+			@Override
+			public void onRequest()
+			{
+				SimpleBroadcaster broadcaster = eventBus.getBroadcaster();
+
+				AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
+				AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
+				AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
+				TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
+				atmosphereResource.initialize(eventBus.config, broadcaster, atmosphereRequest, atmosphereResponse,
+						asyncSupport, new AtmosphereHandlerAdapter());
+
+				atmosphereResource.setBroadcaster(broadcaster);
+				broadcaster.addAtmosphereResource(atmosphereResource);
+
+				String uuid = atmosphereResource.uuid();
+				Page page = getComponent().getPage();
+				eventBus.eventSubscriptionCollector.onBeforeRender(page);
+				page.setMetaData(ATMOSPHERE_UUID, uuid);
+				eventBus.registerPage(uuid, page);
+			}
+		};
+		page.add(atmosphereBehavior);
+
+		wicketTester.executeBehavior(atmosphereBehavior);
+	}
+
+	public WicketAtmosphereTester post(Object payload)
+	{
+		eventBus.post(payload);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java
new file mode 100644
index 0000000..aca6e62
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java
@@ -0,0 +1,79 @@
+/*
+ * 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 java.util.Date;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.atmosphere.config.AtmosphereLogLevel;
+import org.apache.wicket.atmosphere.config.AtmosphereTransport;
+import org.apache.wicket.protocol.http.WebApplication;
+
+/**
+ * Application object for your web application. If you want to run this application without
+ * deploying, run the Start class.
+ */
+public class AtmosphereApplication extends WebApplication
+{
+	private EventBus eventBus;
+
+	@Override
+	public Class<HomePage> getHomePage()
+	{
+		return HomePage.class;
+	}
+
+	public EventBus getEventBus()
+	{
+		return eventBus;
+	}
+
+	public static AtmosphereApplication get()
+	{
+		return (AtmosphereApplication)Application.get();
+	}
+
+	@Override
+	public void init()
+	{
+		super.init();
+		eventBus = new EventBus(this);
+		eventBus.getParameters().setTransport(AtmosphereTransport.STREAMING);
+		eventBus.getParameters().setLogLevel(AtmosphereLogLevel.DEBUG);
+
+		ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+		final Runnable beeper = new Runnable()
+		{
+			@Override
+			public void run()
+			{
+				try
+				{
+					eventBus.post(new Date());
+				}
+				catch (Exception e)
+				{
+					e.printStackTrace();
+				}
+			}
+		};
+		scheduler.scheduleWithFixedDelay(beeper, 2, 2, TimeUnit.SECONDS);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
new file mode 100644
index 0000000..5accac5
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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 java.util.Date;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.atmosphere.tester.WicketAtmosphereTester;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class AtmosphereTest extends Assert
+{
+	@Test
+	public void aa()
+	{
+		WicketTester tester = new WicketTester();
+		HomePage page = new HomePage(new PageParameters())
+		{
+			@Subscribe
+			public void updateTime(AjaxRequestTarget target, Date event)
+			{
+				super.updateTime(target, event);
+
+				System.err.println("updateTime");
+			}
+
+			@Subscribe(contextAwareFilter = ReceiverFilter.class)
+			public void receiveMessage(AjaxRequestTarget target, ChatMessage message)
+			{
+				super.receiveMessage(target, message);
+
+				System.err.println("receiveMessage");
+			}
+		};
+
+		tester.startPage(page);
+
+		WicketAtmosphereTester waTester = new WicketAtmosphereTester(tester, page);
+
+		Date payload = new Date();
+		waTester.post(payload);
+
+		tester.destroy();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ChatMessage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ChatMessage.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ChatMessage.java
new file mode 100644
index 0000000..c59039f
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ChatMessage.java
@@ -0,0 +1,42 @@
+/*
+ * 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 java.io.Serializable;
+
+public class ChatMessage implements Serializable
+{
+
+	private String receiver;
+	private String message;
+
+	public ChatMessage(String receiver, String message)
+	{
+		this.receiver = receiver;
+		this.message = message;
+	}
+
+	public String getReceiver()
+	{
+		return receiver;
+	}
+
+	public String getMessage()
+	{
+		return message;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.html
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.html b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.html
new file mode 100644
index 0000000..a3e4dac
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+<head>
+<title>Wicket Examples - atmosphere</title>
+<link rel="stylesheet" type="text/css" href="style.css" />
+</head>
+<body>
+	<p>
+		The current time is (updated every 2 seconds from the server using push): <span wicket:id="time"></span>
+	</p>
+	<p>This page also shows a very simple 'chat' client. Type a message in the
+	second input field and send it to everyone. To send a private message, paste
+	the session id (you can find this in the session cookie) of the receiver in
+	the first input field and send a message.</p>
+	<p>
+		Message received: <span wicket:id="message"></span>
+	</p>
+	<form wicket:id="form">
+		<div>Session id of receiver: <input wicket:id="receiver" /></div>
+		Message: <input wicket:id="input" /> <a href="#" wicket:id="send">Send
+			message</a>
+	</form>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.java
new file mode 100644
index 0000000..34063c7
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/HomePage.java
@@ -0,0 +1,84 @@
+/*
+ * 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 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.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class HomePage extends WebPage
+{
+	private static final long serialVersionUID = 1L;
+
+	private Component timeLabel;
+	private Component messageLabel;
+	private TextField<String> receiver;
+	private TextField<String> input;
+
+	public HomePage(final PageParameters parameters)
+	{
+		super(parameters);
+
+		add(timeLabel = new Label("time", Model.of("start")).setOutputMarkupId(true));
+		add(messageLabel = new Label("message", Model.of("-")).setOutputMarkupId(true));
+
+		Form<Void> form = new Form<Void>("form");
+		add(form);
+		form.add(receiver = new TextField<String>("receiver", Model.of("")));
+		form.add(input = new TextField<String>("input", Model.of("")));
+		form.add(new AjaxSubmitLink("send", form)
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(AjaxRequestTarget target, Form<?> form)
+			{
+				EventBus.get().post(
+					new ChatMessage(receiver.getModelObject(), input.getModelObject()));
+			}
+
+			@Override
+			protected void onError(AjaxRequestTarget target, Form<?> form)
+			{
+			}
+		});
+
+		setVersioned(false);
+	}
+
+	@Subscribe
+	public void updateTime(AjaxRequestTarget target, Date event)
+	{
+		timeLabel.setDefaultModelObject(event.toString());
+		target.add(timeLabel);
+	}
+
+	@Subscribe(contextAwareFilter = ReceiverFilter.class)
+	public void receiveMessage(AjaxRequestTarget target, ChatMessage message)
+	{
+		messageLabel.setDefaultModelObject(message.getMessage());
+		target.add(messageLabel);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2ab1d798/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ReceiverFilter.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ReceiverFilter.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ReceiverFilter.java
new file mode 100644
index 0000000..f035433
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/ReceiverFilter.java
@@ -0,0 +1,40 @@
+/*
+ * 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.apache.wicket.Session;
+
+import com.google.common.base.Predicate;
+
+public class ReceiverFilter implements Predicate<AtmosphereEvent>
+{
+	public ReceiverFilter()
+	{
+	}
+
+	@Override
+	public boolean apply(AtmosphereEvent input)
+	{
+		if (input.getPayload() instanceof ChatMessage)
+		{
+			ChatMessage msg = (ChatMessage)input.getPayload();
+			return msg.getReceiver() == null || msg.getReceiver().isEmpty() ||
+				msg.getReceiver().equals(Session.get().getId());
+		}
+		return false;
+	}
+}


[06/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Pretend being a websocket request when using AtmosphereTester


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

Branch: refs/heads/wicket-6.x
Commit: 2239d1e17f2a23011709815ba6eedbaf5baf8f5e
Parents: 0b770b0
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 12:19:22 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:45:36 2014 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java | 2 ++
 .../src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2239d1e1/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
index 87b3d69..a0b3e27 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
@@ -24,6 +24,7 @@ import org.atmosphere.cpr.AtmosphereRequest;
 import org.atmosphere.cpr.AtmosphereResource;
 import org.atmosphere.cpr.AtmosphereResourceImpl;
 import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.cpr.HeaderConfig;
 import org.atmosphere.handler.AtmosphereHandlerAdapter;
 import org.atmosphere.util.SimpleBroadcaster;
 
@@ -66,6 +67,7 @@ public class AtmosphereTester
 		page.add(atmosphereBehavior);
 
 		wicketTester.startPage(page);
+		wicketTester.getRequest().setHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT, AtmosphereResource.TRANSPORT.WEBSOCKET.name());
 		wicketTester.executeBehavior(atmosphereBehavior);
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/2239d1e1/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
index 1161fd6..9f86cdf 100644
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
@@ -59,7 +59,7 @@ public class AtmosphereTest extends Assert
 		Date payload = new Date();
 		waTester.post(payload);
 
-		System.err.println(tester.getLastResponseAsString());
+		System.err.println("Ajax response:\n" + tester.getLastResponseAsString());
 
 		tester.destroy();
 	}


[04/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Rename WicketAtmosphereTester to AtmosphereTester

Start the page after configuring AtmosphereTester/TesterEventBus so the method collector is called for all components in the page
Expose TesterBroadcasterFactory as BroadcasterFactory#getDefault()


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

Branch: refs/heads/wicket-6.x
Commit: e841383c045f62d5feb87413f1aa6f694df8dcb7
Parents: d0751c2
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 10:32:46 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:45:17 2014 +0200

----------------------------------------------------------------------
 .../atmosphere/tester/AtmosphereTester.java     | 77 ++++++++++++++++++++
 .../atmosphere/tester/TesterEventBus.java       | 13 +---
 .../tester/WicketAtmosphereTester.java          | 76 -------------------
 .../wicket/atmosphere/AtmosphereTest.java       |  8 +-
 4 files changed, 84 insertions(+), 90 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e841383c/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
new file mode 100644
index 0000000..87b3d69
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
@@ -0,0 +1,77 @@
+/*
+ * 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.tester;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.atmosphere.AtmosphereBehavior;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.util.tester.WicketTester;
+import org.atmosphere.cpr.AtmosphereRequest;
+import org.atmosphere.cpr.AtmosphereResource;
+import org.atmosphere.cpr.AtmosphereResourceImpl;
+import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.handler.AtmosphereHandlerAdapter;
+import org.atmosphere.util.SimpleBroadcaster;
+
+/**
+ *
+ */
+public class AtmosphereTester
+{
+	private final TesterEventBus eventBus;
+
+	public AtmosphereTester(final WicketTester wicketTester, Page page)
+	{
+		WebApplication application = wicketTester.getApplication();
+		this.eventBus = new TesterEventBus(application);
+
+		AtmosphereBehavior atmosphereBehavior = new AtmosphereBehavior()
+		{
+			@Override
+			public void onRequest()
+			{
+				SimpleBroadcaster broadcaster = eventBus.getBroadcaster();
+
+				AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
+				AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
+				AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
+				TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
+				atmosphereResource.initialize(eventBus.config, broadcaster, atmosphereRequest, atmosphereResponse,
+						asyncSupport, new AtmosphereHandlerAdapter());
+
+				atmosphereResource.setBroadcaster(broadcaster);
+				broadcaster.addAtmosphereResource(atmosphereResource);
+
+				String uuid = atmosphereResource.uuid();
+				Page page = getComponent().getPage();
+
+				page.setMetaData(ATMOSPHERE_UUID, uuid);
+				eventBus.registerPage(uuid, page);
+			}
+		};
+		page.add(atmosphereBehavior);
+
+		wicketTester.startPage(page);
+		wicketTester.executeBehavior(atmosphereBehavior);
+	}
+
+	public AtmosphereTester post(Object payload)
+	{
+		eventBus.post(payload);
+		return this;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e841383c/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
index 8f30a37..8a94f04 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
@@ -32,7 +32,6 @@ public class TesterEventBus extends EventBus
 {
 	AtmosphereFramework framework = new AtmosphereFramework();
 	AtmosphereConfig config = new AtmosphereConfig(framework);
-	IComponentOnBeforeRenderListener eventSubscriptionCollector;
 
 	public TesterEventBus(WebApplication application)
 	{
@@ -40,14 +39,7 @@ public class TesterEventBus extends EventBus
 
 		framework.setBroadcasterFactory(new TesterBroadcasterFactory(config));
 
-		getBroadcaster().initialize("wicket-atmopshere-tester", config);
-	}
-
-	@Override
-	protected IComponentOnBeforeRenderListener createEventSubscriptionCollector()
-	{
-		eventSubscriptionCollector = super.createEventSubscriptionCollector();
-		return eventSubscriptionCollector;
+		getBroadcaster().initialize("wicket-atmosphere-tester", config);
 	}
 
 	@Override
@@ -61,6 +53,9 @@ public class TesterEventBus extends EventBus
 		protected TesterBroadcasterFactory(AtmosphereConfig c)
 		{
 			super(SimpleBroadcaster.class, BroadcasterLifeCyclePolicy.ATMOSPHERE_RESOURCE_POLICY.NEVER.name(), c);
+
+			// expose myself as BroadcasterFactory.getDefault();
+			factory = this;
 		}
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e841383c/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java
deleted file mode 100644
index 9ae8ad6..0000000
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/WicketAtmosphereTester.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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.tester;
-
-import org.apache.wicket.Page;
-import org.apache.wicket.atmosphere.AtmosphereBehavior;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.util.tester.WicketTester;
-import org.atmosphere.cpr.AtmosphereRequest;
-import org.atmosphere.cpr.AtmosphereResource;
-import org.atmosphere.cpr.AtmosphereResourceImpl;
-import org.atmosphere.cpr.AtmosphereResponse;
-import org.atmosphere.handler.AtmosphereHandlerAdapter;
-import org.atmosphere.util.SimpleBroadcaster;
-
-/**
- *
- */
-public class WicketAtmosphereTester
-{
-	private final TesterEventBus eventBus;
-
-	public WicketAtmosphereTester(final WicketTester wicketTester, Page page)
-	{
-		WebApplication application = wicketTester.getApplication();
-		this.eventBus = new TesterEventBus(application);
-
-		AtmosphereBehavior atmosphereBehavior = new AtmosphereBehavior()
-		{
-			@Override
-			public void onRequest()
-			{
-				SimpleBroadcaster broadcaster = eventBus.getBroadcaster();
-
-				AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
-				AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
-				AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
-				TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
-				atmosphereResource.initialize(eventBus.config, broadcaster, atmosphereRequest, atmosphereResponse,
-						asyncSupport, new AtmosphereHandlerAdapter());
-
-				atmosphereResource.setBroadcaster(broadcaster);
-				broadcaster.addAtmosphereResource(atmosphereResource);
-
-				String uuid = atmosphereResource.uuid();
-				Page page = getComponent().getPage();
-				eventBus.eventSubscriptionCollector.onBeforeRender(page);
-				page.setMetaData(ATMOSPHERE_UUID, uuid);
-				eventBus.registerPage(uuid, page);
-			}
-		};
-		page.add(atmosphereBehavior);
-
-		wicketTester.executeBehavior(atmosphereBehavior);
-	}
-
-	public WicketAtmosphereTester post(Object payload)
-	{
-		eventBus.post(payload);
-		return this;
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e841383c/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
index e8a5b30..1161fd6 100644
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
@@ -19,7 +19,7 @@ package org.apache.wicket.atmosphere;
 import java.util.Date;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.atmosphere.tester.WicketAtmosphereTester;
+import org.apache.wicket.atmosphere.tester.AtmosphereTester;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.tester.WicketTester;
 import org.junit.Assert;
@@ -31,7 +31,7 @@ import org.junit.Test;
 public class AtmosphereTest extends Assert
 {
 	@Test
-	public void aa()
+	public void atmospherePush()
 	{
 		WicketTester tester = new WicketTester();
 		HomePage page = new HomePage(new PageParameters())
@@ -54,9 +54,7 @@ public class AtmosphereTest extends Assert
 			}
 		};
 
-		tester.startPage(page);
-
-		WicketAtmosphereTester waTester = new WicketAtmosphereTester(tester, page);
+		AtmosphereTester waTester = new AtmosphereTester(tester, page);
 
 		Date payload = new Date();
 		waTester.post(payload);


[12/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Reuse the already installed EventBus in MyApp#init. Just set TesterBroadcaster for testing purposes.

Add APIs to make it possible to assert on the suspended (by Atmosphere) http response


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

Branch: refs/heads/wicket-6.x
Commit: 77d0a46ef018a1bb35282fbb374d9de56ac51c39
Parents: 4a38ae1
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Aug 14 12:05:00 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:46:22 2014 +0200

----------------------------------------------------------------------
 .../wicket/util/tester/BaseWicketTester.java    |  10 +-
 .../org/apache/wicket/atmosphere/EventBus.java  |  27 ++-
 .../atmosphere/tester/AtmosphereTester.java     | 183 +++++++++++++++----
 .../tester/TesterAtmosphereBehavior.java        |  65 +++++++
 .../atmosphere/tester/TesterBroadcaster.java    |   6 +-
 .../atmosphere/tester/TesterEventBus.java       |  54 ------
 .../wicket/atmosphere/AtmosphereTest.java       |  68 -------
 .../wicket/atmosphere/AtmosphereTesterTest.java | 108 +++++++++++
 8 files changed, 358 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index 90285bb..15f0785 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -510,6 +510,14 @@ public class BaseWicketTester
 	}
 
 	/**
+	 * @param response
+	 */
+	public void setLastResponse(final MockHttpServletResponse response)
+	{
+		this.lastResponse = response;
+	}
+
+	/**
 	 * @return session
 	 */
 	public Session getSession()
@@ -788,7 +796,7 @@ public class BaseWicketTester
 	private void recordRequestResponse()
 	{
 		lastRequest = request;
-		lastResponse = response;
+		setLastResponse(response);
 
 		previousRequests.add(request);
 		previousResponses.add(response);

http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/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 a87a9c5..e60ca01 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
@@ -102,9 +102,16 @@ public class EventBus implements UnboundListener
 		return eventBus;
 	}
 
-	private final WebApplication application;
+	/**
+	 * @param application
+	 * @return {@code true} if there is an installed EventBus to the given application
+	 */
+	public static boolean isInstalled(Application application)
+	{
+		return application.getMetaData(EVENT_BUS_KEY) != null;
+	}
 
-	private final Broadcaster broadcaster;
+	private final WebApplication application;
 
 	private final Multimap<PageKey, EventSubscription> subscriptions = HashMultimap.create();
 
@@ -114,6 +121,8 @@ public class EventBus implements UnboundListener
 
 	private final AtmosphereParameters parameters = new AtmosphereParameters();
 
+	private Broadcaster broadcaster;
+
 	/**
 	 * Creates and registers an {@code EventBus} for the given application. The first broadcaster
 	 * returned by the {@code BroadcasterFactory} is used.
@@ -122,7 +131,7 @@ public class EventBus implements UnboundListener
 	 */
 	public EventBus(WebApplication application)
 	{
-		this(application, lookupDefaultBroadcaster());
+		this(application, null);
 	}
 
 	private static Broadcaster lookupDefaultBroadcaster()
@@ -184,7 +193,13 @@ public class EventBus implements UnboundListener
 	 */
 	public Broadcaster getBroadcaster()
 	{
-		return broadcaster;
+		return broadcaster != null ? broadcaster : lookupDefaultBroadcaster();
+	}
+
+	public EventBus setBroadcaster(Broadcaster broadcaster)
+	{
+		this.broadcaster = broadcaster;
+		return this;
 	}
 
 	/**
@@ -388,7 +403,7 @@ public class EventBus implements UnboundListener
 				Collections.unmodifiableCollection(subscriptions.get(key)), new EventFilter(event));
 		}
 		if (key == null)
-			broadcaster.removeAtmosphereResource(resource);
+			getBroadcaster().removeAtmosphereResource(resource);
 		else if (!subscriptionsForPage.isEmpty())
 			post(resource, key, subscriptionsForPage, event);
 	}
@@ -415,7 +430,7 @@ public class EventBus implements UnboundListener
 			subscriptionsForPage, event);
 		Response response = new AtmosphereWebResponse(resource.getResponse());
 		if (application.createRequestCycle(request, response).processRequestAndDetach())
-			broadcaster.broadcast(response.toString(), resource);
+			getBroadcaster().broadcast(response.toString(), resource);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
index 91ea64e..eb1cf1b 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
@@ -16,63 +16,182 @@
  */
 package org.apache.wicket.atmosphere.tester;
 
+import java.util.List;
+
 import org.apache.wicket.Page;
 import org.apache.wicket.atmosphere.AtmosphereBehavior;
+import org.apache.wicket.atmosphere.EventBus;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
 import org.apache.wicket.util.tester.WicketTester;
-import org.atmosphere.cpr.AtmosphereRequest;
+import org.atmosphere.cpr.AtmosphereConfig;
+import org.atmosphere.cpr.AtmosphereFramework;
 import org.atmosphere.cpr.AtmosphereResource;
-import org.atmosphere.cpr.AtmosphereResourceImpl;
-import org.atmosphere.cpr.AtmosphereResponse;
 import org.atmosphere.cpr.HeaderConfig;
-import org.atmosphere.handler.AtmosphereHandlerAdapter;
 
 /**
- *
+ * A helper for testing Atmosphere enabled pages
  */
 public class AtmosphereTester
 {
-	private final TesterEventBus eventBus;
+	/**
+	 * The EventBus that will be used to post/push messages
+	 * to the suspended http response
+	 */
+	private final EventBus eventBus;
+
+	private final WicketTester wicketTester;
+	
+	/**
+	 * The response which will be suspended by Atmosphere and
+	 * all pushes/post will go to
+	 */
+	private MockHttpServletResponse suspendedResponse;
 
+	private MockHttpServletResponse lastResponse;
+	
+	/**
+	 * Constructor.
+	 *
+	 * @param wicketTester
+	 *          The testing helper
+	 * @param page
+	 *          The page to test
+	 */
 	public AtmosphereTester(final WicketTester wicketTester, Page page)
 	{
+		this.wicketTester = wicketTester;
+
 		WebApplication application = wicketTester.getApplication();
-		this.eventBus = new TesterEventBus(application);
 
-		AtmosphereBehavior atmosphereBehavior = new AtmosphereBehavior()
+		TesterBroadcaster broadcaster = createBroadcaster();
+
+		if (EventBus.isInstalled(application))
+		{
+			this.eventBus = EventBus.get(application);
+			this.eventBus.setBroadcaster(broadcaster);
+		}
+		else
 		{
-			@Override
-			public void onRequest()
-			{
-				TesterBroadcaster broadcaster = eventBus.getBroadcaster();
-
-				AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
-				AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
-				AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
-				TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
-				atmosphereResource.initialize(broadcaster.getApplicationConfig(), broadcaster, atmosphereRequest, atmosphereResponse,
-						asyncSupport, new AtmosphereHandlerAdapter());
-
-				atmosphereResource.setBroadcaster(broadcaster);
-				broadcaster.addAtmosphereResource(atmosphereResource);
-
-				String uuid = atmosphereResource.uuid();
-				Page page = getComponent().getPage();
-
-				page.setMetaData(ATMOSPHERE_UUID, uuid);
-				eventBus.registerPage(uuid, page);
-			}
-		};
+			this.eventBus = new EventBus(application, broadcaster);
+		}
+
+		initialize(wicketTester, page);
+	}
+
+	private void initialize(final WicketTester wicketTester, Page page)
+	{
+		// remove any already installed AtmosphereBehaviors on the page
+		List<AtmosphereBehavior> behaviors = page.getBehaviors(AtmosphereBehavior.class);
+		page.remove(behaviors.toArray(new AtmosphereBehavior[behaviors.size()]));
+
+		// install AtmosphereBehavior that doesn't use Meteor
+		AtmosphereBehavior atmosphereBehavior = new TesterAtmosphereBehavior(wicketTester, eventBus);
 		page.add(atmosphereBehavior);
 
+		// start the page to collect all @Subscribe methods in the component hierarchy
 		wicketTester.startPage(page);
+
+		// pretend it is a websocket connection
 		wicketTester.getRequest().setHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT, AtmosphereResource.TRANSPORT.WEBSOCKET.name());
+
+		// start the "upgrade" connection
+		suspendedResponse = wicketTester.getResponse();
 		wicketTester.executeBehavior(atmosphereBehavior);
 	}
 
-	public AtmosphereTester post(Object payload)
+	private TesterBroadcaster createBroadcaster()
+	{
+		TesterBroadcaster broadcaster = new TesterBroadcaster();
+
+		AtmosphereFramework framework = new AtmosphereFramework();
+		AtmosphereConfig config = new AtmosphereConfig(framework);
+
+		TesterBroadcasterFactory broadcasterFactory = new TesterBroadcasterFactory(config, broadcaster);
+		framework.setBroadcasterFactory(broadcasterFactory);
+
+		broadcaster.initialize("wicket-atmosphere-tester", config);
+
+		return broadcaster;
+	}
+
+	/**
+	 * @return The collected so far pushed data in the suspended response
+	 */
+	public String getPushedResponse()
 	{
-		eventBus.post(payload);
+		return suspendedResponse != null ? suspendedResponse.getDocument() : null;
+	}
+
+	/**
+	 * Resets the suspended response to be empty
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester resetResponse()
+	{
+		if (suspendedResponse != null)
+		{
+			suspendedResponse.reset();
+		}
+		return this;
+	}
+
+	/**
+	 * Posts a message to all suspended responses
+	 *
+	 * @param message
+	 *          The message to push
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester post(Object message)
+	{
+		eventBus.post(message);
+		return this;
+	}
+
+	/**
+	 * Posts a message to the suspended response with the given uuid
+	 *
+	 * @param message
+	 *          The message to push
+	 * @param resourceUuid
+	 *          The identifier of the suspended http response
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester post(Object message, String resourceUuid)
+	{
+		eventBus.post(message, resourceUuid);
+		return this;
+	}
+
+	/**
+	 * Switches the current <em>lastResponse</em> with the <em>suspendedResponse</em>
+	 * so the application test can use WicketTester's assert methods.
+	 *
+	 * Note: Make sure to call {@linkplain #switchOffTestMode()} later to be able to
+	 * assert on non-Atmosphere related responses
+	 *
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester switchOnTestMode()
+	{
+		lastResponse = wicketTester.getLastResponse();
+		wicketTester.setLastResponse(suspendedResponse);
+		return this;
+	}
+
+	/**
+	 * Sets back the <em>lastResponse</em> with the saved on by {@link #switchOnTestMode()}.
+	 *
+	 * @return this instance, for chaining
+	 */
+	public AtmosphereTester switchOffTestMode()
+	{
+		if (lastResponse != null)
+		{
+			wicketTester.setLastResponse(lastResponse);
+			lastResponse = null;
+		}
 		return this;
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java
new file mode 100644
index 0000000..d6632fe
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAtmosphereBehavior.java
@@ -0,0 +1,65 @@
+/*
+ * 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.tester;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.atmosphere.AtmosphereBehavior;
+import org.apache.wicket.atmosphere.EventBus;
+import org.apache.wicket.util.tester.WicketTester;
+import org.atmosphere.cpr.AtmosphereRequest;
+import org.atmosphere.cpr.AtmosphereResource;
+import org.atmosphere.cpr.AtmosphereResourceImpl;
+import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.handler.AtmosphereHandlerAdapter;
+
+/**
+ * A specialization that doesn't use Meteor to create AtmosphereResource
+ * but creates it manually by using the WicketTester's http request and response
+ */
+class TesterAtmosphereBehavior extends AtmosphereBehavior
+{
+	private final EventBus eventBus;
+	private final WicketTester wicketTester;
+
+	TesterAtmosphereBehavior(WicketTester wicketTester, EventBus eventBus)
+	{
+		this.wicketTester = wicketTester;
+		this.eventBus = eventBus;
+	}
+
+	@Override
+	public void onRequest()
+	{
+		TesterBroadcaster broadcaster = (TesterBroadcaster) eventBus.getBroadcaster();
+
+		AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
+		AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
+		AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
+		TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
+		atmosphereResource.initialize(broadcaster.getApplicationConfig(), broadcaster, atmosphereRequest, atmosphereResponse,
+				asyncSupport, new AtmosphereHandlerAdapter());
+
+		atmosphereResource.setBroadcaster(broadcaster);
+		broadcaster.addAtmosphereResource(atmosphereResource);
+
+		String uuid = atmosphereResource.uuid();
+		Page page = getComponent().getPage();
+
+		page.setMetaData(ATMOSPHERE_UUID, uuid);
+		eventBus.registerPage(uuid, page);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
index 4fae2da..7452d6a 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
@@ -19,6 +19,8 @@ package org.apache.wicket.atmosphere.tester;
 import org.atmosphere.cpr.AtmosphereConfig;
 import org.atmosphere.cpr.AtmosphereResource;
 import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.cpr.BroadcasterConfig;
+import org.atmosphere.cpr.DefaultBroadcaster;
 import org.atmosphere.cpr.Entry;
 import org.atmosphere.util.SimpleBroadcaster;
 
@@ -33,9 +35,9 @@ class TesterBroadcaster extends SimpleBroadcaster
 	}
 
 	@Override
-	protected void executeBlockingWrite(AtmosphereResource resource, Entry entry)
+	protected void push(Entry entry)
 	{
-		AtmosphereResponse response = resource.getResponse();
+		AtmosphereResponse response = entry.resource.getResponse();
 		String message = entry.message.toString();
 		response.write(message);
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
deleted file mode 100644
index 48e97cb..0000000
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.tester;
-
-import org.apache.wicket.atmosphere.EventBus;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.atmosphere.cpr.AtmosphereConfig;
-import org.atmosphere.cpr.AtmosphereFramework;
-
-/**
- *
- */
-class TesterEventBus extends EventBus
-{
-	public TesterEventBus(WebApplication application)
-	{
-		super(application, createBroadcaster());
-	}
-
-	private static TesterBroadcaster createBroadcaster()
-	{
-		TesterBroadcaster broadcaster = new TesterBroadcaster();
-
-		AtmosphereFramework framework = new AtmosphereFramework();
-		AtmosphereConfig config = new AtmosphereConfig(framework);
-
-		TesterBroadcasterFactory broadcasterFactory = new TesterBroadcasterFactory(config, broadcaster);
-		framework.setBroadcasterFactory(broadcasterFactory);
-
-		broadcaster.initialize("wicket-atmosphere-tester", config);
-
-		return broadcaster;
-	}
-
-	@Override
-	public TesterBroadcaster getBroadcaster()
-	{
-		return (TesterBroadcaster) super.getBroadcaster();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
deleted file mode 100644
index 368367d..0000000
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 java.util.Date;
-
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.atmosphere.tester.AtmosphereTester;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.util.tester.WicketTester;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- *
- */
-public class AtmosphereTest extends Assert
-{
-	@Test
-	public void atmospherePush()
-	{
-		final String updateTimeIsExecuted = "updateTime is executed!";
-
-		WicketTester tester = new WicketTester();
-		HomePage page = new HomePage(new PageParameters())
-		{
-			@Subscribe
-			public void updateTime(AjaxRequestTarget target, Date event)
-			{
-				super.updateTime(target, event);
-
-				target.appendJavaScript(updateTimeIsExecuted);
-			}
-
-			@Subscribe(contextAwareFilter = ReceiverFilter.class)
-			public void receiveMessage(AjaxRequestTarget target, ChatMessage message)
-			{
-				super.receiveMessage(target, message);
-
-				System.err.println("receiveMessage");
-			}
-		};
-
-		AtmosphereTester waTester = new AtmosphereTester(tester, page);
-
-		Date payload = new Date();
-		waTester.post(payload);
-
-//		System.err.println("Ajax response:\n" + tester.getLastResponseAsString());
-		tester.assertContains(updateTimeIsExecuted);
-
-		tester.destroy();
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/77d0a46e/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
new file mode 100644
index 0000000..c8f2773
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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 static org.hamcrest.CoreMatchers.is;
+
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.atmosphere.tester.AtmosphereTester;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class AtmosphereTesterTest extends Assert
+{
+	final AtomicBoolean updateTimeCalled = new AtomicBoolean(false);
+	final AtomicBoolean receiveMessageCalled = new AtomicBoolean(false);
+
+	@Test
+	public void atmospherePush()
+	{
+		final String updateTimeIsExecuted = "updateTime is executed!";
+
+		WicketTester tester = new WicketTester();
+		HomePage page = new HomePage(new PageParameters())
+		{
+			@Subscribe
+			public void updateTime(AjaxRequestTarget target, Date event)
+			{
+				super.updateTime(target, event);
+
+				updateTimeCalled.set(true);
+
+				target.appendJavaScript(updateTimeIsExecuted);
+			}
+
+			@Subscribe(contextAwareFilter = ReceiverFilter.class)
+			public void receiveMessage(AjaxRequestTarget target, ChatMessage message)
+			{
+				super.receiveMessage(target, message);
+				receiveMessageCalled.set(true);
+			}
+		};
+
+		AtmosphereTester waTester = new AtmosphereTester(tester, page);
+
+		assertThat(updateTimeCalled.get(), is(false));
+		assertThat(receiveMessageCalled.get(), is(false));
+
+		Date payload = new Date();
+		waTester.post(payload);
+
+		assertThat(updateTimeCalled.get(), is(true));
+		assertThat(receiveMessageCalled.get(), is(false));
+
+		tester.assertContains(updateTimeIsExecuted);
+
+		final FormTester form = tester.newFormTester("form");
+
+		form.setValue("input", "Atmosphere rocks!");
+
+		form.submit("send");
+
+		assertThat(updateTimeCalled.get(), is(true));
+		assertThat(receiveMessageCalled.get(), is(true));
+
+		// get the the collected so far content of the suspended response
+		// Note: it may contain several <ajax-response>s.
+		// use waTester.resetResponse() to remove the collected data
+		String atmosphereResponse = waTester.getPushedResponse();
+//		System.out.println("RES:" + atmosphereResponse);
+
+		// assert
+		Assert.assertFalse("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ajax-response></ajax-response>"
+				.equals(atmosphereResponse));
+
+		waTester.switchOnTestMode();
+		// now the assertions are against the Atmosphere's suspended response data
+		tester.assertComponentOnAjaxResponse("message");
+		waTester.switchOffTestMode();
+		// now the assertions will be the real last response
+
+		tester.assertLabel("message", "Atmosphere rocks!");
+
+		tester.destroy();
+	}
+}


[05/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Fix the callback url to the AtmosphereBehavior. It should be an Ajax one to prevent incrementing of the page id/renderCount


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

Branch: refs/heads/wicket-6.x
Commit: 0b770b05e0f7b86cbe647a155dfe1a82f1bccc3a
Parents: e841383
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 12:18:28 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:45:29 2014 +0200

----------------------------------------------------------------------
 .../wicket/atmosphere/AtmosphereBehavior.java   | 21 ++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0b770b05/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 f41e91f..35c1ed8 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
@@ -24,13 +24,12 @@ import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.json.JSONException;
 import org.apache.wicket.ajax.json.JSONObject;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
-import org.apache.wicket.behavior.IBehaviorListener;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.resource.CoreLibrariesContributor;
 import org.atmosphere.cpr.AtmosphereRequest;
 import org.atmosphere.cpr.AtmosphereResource;
@@ -196,11 +195,9 @@ public class AtmosphereBehavior extends AbstractAjaxBehavior
 
 			response.render(JavaScriptHeaderItem.forReference(JQueryWicketAtmosphereResourceReference.get()));
 			JSONObject options = findEventBus().getParameters().toJSON();
-			options.put("url",
-				component.urlFor(this, IBehaviorListener.INTERFACE, new PageParameters())
-					.toString());
+			options.put("url", getCallbackUrl());
 			response.render(OnDomReadyHeaderItem.forScript("$('#" + component.getMarkupId() +
-				"').wicketAtmosphere(" + options.toString() + ")"));
+					"').wicketAtmosphere(" + options.toString() + ")"));
 		}
 		catch (JSONException e)
 		{
@@ -209,6 +206,18 @@ public class AtmosphereBehavior extends AbstractAjaxBehavior
 	}
 
 	/**
+	 * Make it look like a normal Ajax call so the page id/renderCount are not incremented when Atmosphere makes
+	 * the "upgrade" request
+	 *
+	 * @return the url to this behavior's listener interface
+	 */
+	@Override
+	public CharSequence getCallbackUrl()
+	{
+		return super.getCallbackUrl() + "&" + WebRequest.PARAM_AJAX + "=true&" + WebRequest.PARAM_AJAX_BASE_URL + "=.";
+	}
+
+	/**
 	 * Find the Atmosphere UUID for the suspended connection for the given page (if any).
 	 * 
 	 * @param page


[13/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Fix a typo in javadoc. Use Hamcrest matchers


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

Branch: refs/heads/wicket-6.x
Commit: 66bff0b1351f6559c6a102250bc5a56bf6cd9069
Parents: 77d0a46
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Aug 14 12:13:39 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:46:30 2014 +0200

----------------------------------------------------------------------
 .../org/apache/wicket/atmosphere/tester/AtmosphereTester.java  | 2 +-
 .../org/apache/wicket/atmosphere/AtmosphereTesterTest.java     | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/66bff0b1/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
index eb1cf1b..eee9b19 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
@@ -181,7 +181,7 @@ public class AtmosphereTester
 	}
 
 	/**
-	 * Sets back the <em>lastResponse</em> with the saved on by {@link #switchOnTestMode()}.
+	 * Sets back the <em>lastResponse</em> with the saved one by {@link #switchOnTestMode()}.
 	 *
 	 * @return this instance, for chaining
 	 */

http://git-wip-us.apache.org/repos/asf/wicket/blob/66bff0b1/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
index c8f2773..0d24910 100644
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTesterTest.java
@@ -16,7 +16,9 @@
  */
 package org.apache.wicket.atmosphere;
 
+import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
 
 import java.util.Date;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -92,8 +94,8 @@ public class AtmosphereTesterTest extends Assert
 //		System.out.println("RES:" + atmosphereResponse);
 
 		// assert
-		Assert.assertFalse("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ajax-response></ajax-response>"
-				.equals(atmosphereResponse));
+		assertThat(atmosphereResponse,
+				is(not(equalTo("<?xml version=\"1.0\" encoding=\"UTF-8\"?><ajax-response></ajax-response>"))));
 
 		waTester.switchOnTestMode();
 		// now the assertions are against the Atmosphere's suspended response data


[10/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Remove custom executors - they are no needed because of TesterBroadcaster#executeBlockingWrite(AtmosphereResource, Entry)


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

Branch: refs/heads/wicket-6.x
Commit: 2a52b360bf964a162cf8e76d94ad3d42ae17fd88
Parents: 5513936
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 15:57:02 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:46:05 2014 +0200

----------------------------------------------------------------------
 .../wicket/atmosphere/tester/TesterEventBus.java      | 14 --------------
 1 file changed, 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2a52b360/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
index be88777..48e97cb 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
@@ -16,14 +16,10 @@
  */
 package org.apache.wicket.atmosphere.tester;
 
-import java.util.concurrent.Executors;
-
 import org.apache.wicket.atmosphere.EventBus;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.atmosphere.cpr.AtmosphereConfig;
 import org.atmosphere.cpr.AtmosphereFramework;
-import org.atmosphere.cpr.BroadcasterConfig;
-import org.atmosphere.util.VoidExecutorService;
 
 /**
  *
@@ -47,16 +43,6 @@ class TesterEventBus extends EventBus
 
 		broadcaster.initialize("wicket-atmosphere-tester", config);
 
-		VoidExecutorService sameThreadExecutorService = new VoidExecutorService();
-		BroadcasterConfig broadcasterConfig = new BroadcasterConfig(
-				sameThreadExecutorService,
-				sameThreadExecutorService,
-				Executors.newSingleThreadScheduledExecutor(),
-				config, "tester-broadcaster-config");
-		broadcaster.setBroadcasterConfig(broadcasterConfig);
-		broadcasterConfig.setAsyncWriteService(sameThreadExecutorService);
-		broadcasterConfig.setExecutorService(sameThreadExecutorService);
-
 		return broadcaster;
 	}
 


[14/17] git commit: WICKET-5619 ConcurrentModificationException may occur when calling EventBus.post()

Posted by mg...@apache.org.
WICKET-5619 ConcurrentModificationException may occur when calling EventBus.post()

Use Iterables#filter() as suggested at com.google.common.collect.Collections2#filter


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

Branch: refs/heads/wicket-6.x
Commit: 78fc5b53eb09a76a2e7f307f2ce5fbbd2c8f6c0a
Parents: 66bff0b
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Aug 14 13:28:44 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:48:17 2014 +0200

----------------------------------------------------------------------
 .../atmosphere/AtmosphereRequestHandler.java    |  9 ++++----
 .../wicket/atmosphere/AtmosphereWebRequest.java |  8 +++----
 .../org/apache/wicket/atmosphere/EventBus.java  | 22 ++++++++++++--------
 3 files changed, 22 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/78fc5b53/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
index 8824468..3ba143d 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.atmosphere;
 
-import java.util.Collection;
+import java.util.Iterator;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
@@ -44,7 +44,7 @@ public class AtmosphereRequestHandler implements IRequestHandler
 
 	private final AtmosphereEvent event;
 
-	private final Collection<EventSubscription> subscriptions;
+	private final Iterator<EventSubscription> subscriptions;
 
 	private final EventSubscriptionInvoker eventSubscriptionInvoker;
 
@@ -58,7 +58,7 @@ public class AtmosphereRequestHandler implements IRequestHandler
 	 * @param event
 	 * @param eventSubscriptionInvoker
 	 */
-	public AtmosphereRequestHandler(PageKey pageKey, Collection<EventSubscription> subscriptions,
+	public AtmosphereRequestHandler(PageKey pageKey, Iterator<EventSubscription> subscriptions,
 		AtmosphereEvent event, EventSubscriptionInvoker eventSubscriptionInvoker)
 	{
 		this.pageKey = pageKey;
@@ -78,8 +78,9 @@ public class AtmosphereRequestHandler implements IRequestHandler
 
 	private void executeHandlers(AjaxRequestTarget target, Page page)
 	{
-		for (EventSubscription curSubscription : subscriptions)
+		while (subscriptions.hasNext())
 		{
+			EventSubscription curSubscription = subscriptions.next();
 			if (curSubscription.getContextAwareFilter().apply(event))
 			{
 				String componentPath = curSubscription.getComponentPath();

http://git-wip-us.apache.org/repos/asf/wicket/blob/78fc5b53/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
index eb8f5c1..b373983 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereWebRequest.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.atmosphere;
 
 import java.nio.charset.Charset;
-import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 
@@ -47,12 +47,12 @@ class AtmosphereWebRequest extends ServletWebRequest
 
 	private final PageKey pageKey;
 
-	private final Collection<EventSubscription> subscriptions;
+	private final Iterator<EventSubscription> subscriptions;
 
 	private final AtmosphereEvent event;
 
 	AtmosphereWebRequest(ServletWebRequest wrappedRequest, PageKey pageKey,
-		Collection<EventSubscription> subscriptions, AtmosphereEvent event)
+		Iterator<EventSubscription> subscriptions, AtmosphereEvent event)
 	{
 		super(wrappedRequest.getContainerRequest(), wrappedRequest.getFilterPrefix());
 		this.wrappedRequest = wrappedRequest;
@@ -66,7 +66,7 @@ class AtmosphereWebRequest extends ServletWebRequest
 		return pageKey;
 	}
 
-	public Collection<EventSubscription> getSubscriptions()
+	public Iterator<EventSubscription> getSubscriptions()
 	{
 		return subscriptions;
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/78fc5b53/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 e60ca01..6b56d56 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
@@ -17,7 +17,7 @@
 package org.apache.wicket.atmosphere;
 
 import java.util.Collection;
-import java.util.Collections;
+import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -48,9 +48,9 @@ import org.atmosphere.cpr.BroadcasterFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Collections2;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 
@@ -234,7 +234,7 @@ public class EventBus implements UnboundListener
 		if (log.isDebugEnabled())
 		{
 			log.debug("registered page {} for session {}", pageKey.getPageId(),
-				pageKey.getSessionId());
+					pageKey.getSessionId());
 		}
 	}
 
@@ -395,21 +395,25 @@ public class EventBus implements UnboundListener
 		ThreadContext.detach();
 		ThreadContext.setApplication(application);
 		PageKey key;
-		Collection<EventSubscription> subscriptionsForPage;
+		Iterable<EventSubscription> subscriptionsForPage;
 		synchronized (this)
 		{
 			key = trackedPages.get(resource.uuid());
-			subscriptionsForPage = Collections2.filter(
-				Collections.unmodifiableCollection(subscriptions.get(key)), new EventFilter(event));
+			Collection<EventSubscription> eventSubscriptions = subscriptions.get(key);
+			subscriptionsForPage = Iterables.filter(eventSubscriptions, new EventFilter(event));
 		}
 		if (key == null)
 			getBroadcaster().removeAtmosphereResource(resource);
-		else if (!subscriptionsForPage.isEmpty())
-			post(resource, key, subscriptionsForPage, event);
+		else
+		{
+			Iterator<EventSubscription> iterator = subscriptionsForPage.iterator();
+			if (iterator.hasNext())
+				post(resource, key, iterator, event);
+		}
 	}
 
 	private void post(AtmosphereResource resource, PageKey pageKey,
-		Collection<EventSubscription> subscriptionsForPage, AtmosphereEvent event)
+		Iterator<EventSubscription> subscriptionsForPage, AtmosphereEvent event)
 	{
 		String filterPath = WebApplication.get()
 			.getWicketFilter()


[11/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Add ASL2 headers


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

Branch: refs/heads/wicket-6.x
Commit: 4a38ae18cc76534f7fa7ace4a3f19cd44c7e41c0
Parents: 2a52b36
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 17:08:08 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:46:12 2014 +0200

----------------------------------------------------------------------
 .../wicket/atmosphere/tester/TesterBroadcaster.java | 16 ++++++++++++++++
 .../atmosphere/tester/TesterBroadcasterFactory.java | 16 ++++++++++++++++
 2 files changed, 32 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/4a38ae18/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
index ead9f3c..4fae2da 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
@@ -1,3 +1,19 @@
+/*
+ * 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.tester;
 
 import org.atmosphere.cpr.AtmosphereConfig;

http://git-wip-us.apache.org/repos/asf/wicket/blob/4a38ae18/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java
index d1b5008..ef559c1 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java
@@ -1,3 +1,19 @@
+/*
+ * 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.tester;
 
 import org.atmosphere.cpr.AtmosphereConfig;


[15/17] git commit: WICKET-5371 IllegalArgumentException: Argument 'page' may not be null. - when sending event from asynchronous process

Posted by mg...@apache.org.
WICKET-5371 IllegalArgumentException: Argument 'page' may not be null. - when sending event from asynchronous process

Log a warning and unregister all subscriptions for a page when it is no more in the page stores for any reason


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

Branch: refs/heads/wicket-6.x
Commit: 1d1b4782dbb9dbc41cec097031f338ad889c0f77
Parents: 78fc5b5
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Aug 14 15:21:18 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:48:23 2014 +0200

----------------------------------------------------------------------
 .../atmosphere/AtmosphereRequestHandler.java      | 18 +++++++++++++++---
 .../org/apache/wicket/atmosphere/EventBus.java    | 16 ++++++++++++++++
 2 files changed, 31 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/1d1b4782/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
index 3ba143d..f19e7e0 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
@@ -20,6 +20,7 @@ import java.util.Iterator;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.Page;
+import org.apache.wicket.Session;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.protocol.http.WebApplication;
@@ -71,9 +72,20 @@ public class AtmosphereRequestHandler implements IRequestHandler
 	public void respond(IRequestCycle requestCycle)
 	{
 		WebApplication application = WebApplication.get();
-		Page page = (Page)application.getMapperContext().getPageInstance(pageKey.getPageId());
-		AjaxRequestTarget target = application.newAjaxRequestTarget(page);
-		executeHandlers(target, page);
+		Integer pageId = pageKey.getPageId();
+		Page page = (Page) Session.get().getPageManager().getPage(pageId);
+		if (page != null)
+		{
+			AjaxRequestTarget target = application.newAjaxRequestTarget(page);
+			executeHandlers(target, page);
+		}
+		else
+		{
+			LOGGER.warn("Could not find a page with id '{}' for session with id '{}' in the page stores. It will be unregistered",
+					pageId, pageKey.getSessionId());
+			EventBus.get(application).unregister(pageKey);
+
+		}
 	}
 
 	private void executeHandlers(AjaxRequestTarget target, Page page)

http://git-wip-us.apache.org/repos/asf/wicket/blob/1d1b4782/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 6b56d56..253473b 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
@@ -290,6 +290,22 @@ public class EventBus implements UnboundListener
 	}
 
 	/**
+	 * Unregisters all {@link EventSubscription}s for the given pageKey.
+	 *
+	 * @param pageKey
+	 *          The key with the page id and session id
+	 */
+	public synchronized void unregister(PageKey pageKey)
+	{
+		if (log.isDebugEnabled())
+		{
+			log.debug("unregistering all subscriptions for page {} for session {}",
+					pageKey.getPageId(), pageKey.getSessionId());
+		}
+		subscriptions.removeAll(pageKey);
+	}
+
+	/**
 	 * Unregisters all {@link EventSubscription}s for the given component, including the
 	 * subscriptions for its behaviors.
 	 *


[16/17] git commit: WICKET-5371 IllegalArgumentException: Argument 'page' may not be null. - when sending event from asynchronous process

Posted by mg...@apache.org.
WICKET-5371 IllegalArgumentException: Argument 'page' may not be null. - when sending event from asynchronous process

Mark the page as dirty to keep it around in case there is no other usage with it (component added/removed/etc.)


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

Branch: refs/heads/wicket-6.x
Commit: 50df0c168b956f7ed4ffbb5884b7ab15e2d2ff52
Parents: 1d1b478
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Thu Aug 14 15:24:54 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:48:23 2014 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/50df0c16/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
index f19e7e0..4fd5f02 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereRequestHandler.java
@@ -76,6 +76,7 @@ public class AtmosphereRequestHandler implements IRequestHandler
 		Page page = (Page) Session.get().getPageManager().getPage(pageId);
 		if (page != null)
 		{
+			page.dirty();
 			AjaxRequestTarget target = application.newAjaxRequestTarget(page);
 			executeHandlers(target, page);
 		}


[17/17] git commit: Merge branch 'wicket-6.x' into wicket-atmosphere-tester

Posted by mg...@apache.org.
Merge branch 'wicket-6.x' into wicket-atmosphere-tester


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

Branch: refs/heads/wicket-6.x
Commit: 3afcc3b7924e06761713ad58fce90a5a49c7018b
Parents: 50df0c1 39c2b67
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Fri Aug 15 09:50:17 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:50:17 2014 +0200

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


http://git-wip-us.apache.org/repos/asf/wicket/blob/3afcc3b7/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/AtmosphereBehavior.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/wicket/blob/3afcc3b7/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
----------------------------------------------------------------------
diff --cc wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/EventBus.java
index 253473b,d2b96b5..113816d
--- 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
@@@ -121,9 -113,17 +120,19 @@@ public class EventBus implements Unboun
  
  	private final AtmosphereParameters parameters = new AtmosphereParameters();
  
 +	private Broadcaster broadcaster;
 +
  	/**
+ 	 * 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.
  	 *


[09/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Pretend it is WebSocket connection


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

Branch: refs/heads/wicket-6.x
Commit: 5513936eb4decd56a4ab5be07f499f47ace255ca
Parents: beeb000
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 15:07:05 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:45:58 2014 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/5513936e/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
index c5b1cb3..91ea64e 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
@@ -66,7 +66,7 @@ public class AtmosphereTester
 		page.add(atmosphereBehavior);
 
 		wicketTester.startPage(page);
-		wicketTester.getRequest().setHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT, AtmosphereResource.TRANSPORT.LONG_POLLING.name());
+		wicketTester.getRequest().setHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT, AtmosphereResource.TRANSPORT.WEBSOCKET.name());
 		wicketTester.executeBehavior(atmosphereBehavior);
 	}
 


[08/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Make it possible to write to the underlying http response


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

Branch: refs/heads/wicket-6.x
Commit: beeb0001ac71001c7fddaf519109e73a28649457
Parents: 2524554
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 15:04:59 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:45:50 2014 +0200

----------------------------------------------------------------------
 .../atmosphere/tester/AtmosphereTester.java     |  7 ++-
 .../atmosphere/tester/TesterAsyncSupport.java   |  4 +-
 .../atmosphere/tester/TesterBroadcaster.java    | 26 +++++++++
 .../tester/TesterBroadcasterFactory.java        | 32 ++++++++++++
 .../atmosphere/tester/TesterEventBus.java       | 55 +++++++++++---------
 .../wicket/atmosphere/AtmosphereTest.java       |  8 +--
 6 files changed, 98 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/beeb0001/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
index a0b3e27..c5b1cb3 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/AtmosphereTester.java
@@ -26,7 +26,6 @@ import org.atmosphere.cpr.AtmosphereResourceImpl;
 import org.atmosphere.cpr.AtmosphereResponse;
 import org.atmosphere.cpr.HeaderConfig;
 import org.atmosphere.handler.AtmosphereHandlerAdapter;
-import org.atmosphere.util.SimpleBroadcaster;
 
 /**
  *
@@ -45,13 +44,13 @@ public class AtmosphereTester
 			@Override
 			public void onRequest()
 			{
-				SimpleBroadcaster broadcaster = eventBus.getBroadcaster();
+				TesterBroadcaster broadcaster = eventBus.getBroadcaster();
 
 				AtmosphereResource atmosphereResource = new AtmosphereResourceImpl();
 				AtmosphereRequest atmosphereRequest = AtmosphereRequest.wrap(wicketTester.getRequest());
 				AtmosphereResponse atmosphereResponse = AtmosphereResponse.wrap(wicketTester.getResponse());
 				TesterAsyncSupport asyncSupport = new TesterAsyncSupport();
-				atmosphereResource.initialize(eventBus.config, broadcaster, atmosphereRequest, atmosphereResponse,
+				atmosphereResource.initialize(broadcaster.getApplicationConfig(), broadcaster, atmosphereRequest, atmosphereResponse,
 						asyncSupport, new AtmosphereHandlerAdapter());
 
 				atmosphereResource.setBroadcaster(broadcaster);
@@ -67,7 +66,7 @@ public class AtmosphereTester
 		page.add(atmosphereBehavior);
 
 		wicketTester.startPage(page);
-		wicketTester.getRequest().setHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT, AtmosphereResource.TRANSPORT.WEBSOCKET.name());
+		wicketTester.getRequest().setHeader(HeaderConfig.X_ATMOSPHERE_TRANSPORT, AtmosphereResource.TRANSPORT.LONG_POLLING.name());
 		wicketTester.executeBehavior(atmosphereBehavior);
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/beeb0001/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java
index 60a3cc0..18bb39c 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterAsyncSupport.java
@@ -30,7 +30,7 @@ import org.atmosphere.cpr.AtmosphereResponse;
 /**
  *
  */
-public class TesterAsyncSupport<E extends AtmosphereResource> implements AsyncSupport<E>
+class TesterAsyncSupport<E extends AtmosphereResource> implements AsyncSupport<E>
 {
 	@Override
 	public String getContainerName()
@@ -41,7 +41,6 @@ public class TesterAsyncSupport<E extends AtmosphereResource> implements AsyncSu
 	@Override
 	public void init(ServletConfig sc) throws ServletException
 	{
-
 	}
 
 	@Override
@@ -53,7 +52,6 @@ public class TesterAsyncSupport<E extends AtmosphereResource> implements AsyncSu
 	@Override
 	public void action(E actionEvent)
 	{
-		System.err.println("TesterEventSupport#action(): " + actionEvent);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/beeb0001/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
new file mode 100644
index 0000000..ead9f3c
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcaster.java
@@ -0,0 +1,26 @@
+package org.apache.wicket.atmosphere.tester;
+
+import org.atmosphere.cpr.AtmosphereConfig;
+import org.atmosphere.cpr.AtmosphereResource;
+import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.cpr.Entry;
+import org.atmosphere.util.SimpleBroadcaster;
+
+/**
+ *
+ */
+class TesterBroadcaster extends SimpleBroadcaster
+{
+	public AtmosphereConfig getApplicationConfig()
+	{
+		return config;
+	}
+
+	@Override
+	protected void executeBlockingWrite(AtmosphereResource resource, Entry entry)
+	{
+		AtmosphereResponse response = resource.getResponse();
+		String message = entry.message.toString();
+		response.write(message);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/beeb0001/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java
new file mode 100644
index 0000000..d1b5008
--- /dev/null
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterBroadcasterFactory.java
@@ -0,0 +1,32 @@
+package org.apache.wicket.atmosphere.tester;
+
+import org.atmosphere.cpr.AtmosphereConfig;
+import org.atmosphere.cpr.Broadcaster;
+import org.atmosphere.cpr.BroadcasterLifeCyclePolicy;
+import org.atmosphere.cpr.DefaultBroadcasterFactory;
+import org.atmosphere.util.SimpleBroadcaster;
+
+/**
+*
+*/
+class TesterBroadcasterFactory extends DefaultBroadcasterFactory
+{
+	private final TesterBroadcaster singleBroadcaster;
+
+	TesterBroadcasterFactory(AtmosphereConfig c, TesterBroadcaster broadcaster)
+	{
+		super(SimpleBroadcaster.class, BroadcasterLifeCyclePolicy.ATMOSPHERE_RESOURCE_POLICY.NEVER.name(), c);
+
+		this.singleBroadcaster = broadcaster;
+
+		// expose myself as BroadcasterFactory.getDefault();
+		factory = this;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public <T extends Broadcaster> T lookup(Class<T> c, Object id, boolean createIfNull, boolean unique)
+	{
+		return (T) singleBroadcaster;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/beeb0001/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
index 8a94f04..be88777 100644
--- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
+++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/tester/TesterEventBus.java
@@ -16,46 +16,53 @@
  */
 package org.apache.wicket.atmosphere.tester;
 
-import org.apache.wicket.application.IComponentOnBeforeRenderListener;
+import java.util.concurrent.Executors;
+
 import org.apache.wicket.atmosphere.EventBus;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.atmosphere.cpr.AtmosphereConfig;
 import org.atmosphere.cpr.AtmosphereFramework;
-import org.atmosphere.cpr.BroadcasterLifeCyclePolicy;
-import org.atmosphere.cpr.DefaultBroadcasterFactory;
-import org.atmosphere.util.SimpleBroadcaster;
+import org.atmosphere.cpr.BroadcasterConfig;
+import org.atmosphere.util.VoidExecutorService;
 
 /**
  *
  */
-public class TesterEventBus extends EventBus
+class TesterEventBus extends EventBus
 {
-	AtmosphereFramework framework = new AtmosphereFramework();
-	AtmosphereConfig config = new AtmosphereConfig(framework);
-
 	public TesterEventBus(WebApplication application)
 	{
-		super(application, new SimpleBroadcaster());
-
-		framework.setBroadcasterFactory(new TesterBroadcasterFactory(config));
-
-		getBroadcaster().initialize("wicket-atmosphere-tester", config);
+		super(application, createBroadcaster());
 	}
 
-	@Override
-	public SimpleBroadcaster getBroadcaster()
+	private static TesterBroadcaster createBroadcaster()
 	{
-		return (SimpleBroadcaster) super.getBroadcaster();
+		TesterBroadcaster broadcaster = new TesterBroadcaster();
+
+		AtmosphereFramework framework = new AtmosphereFramework();
+		AtmosphereConfig config = new AtmosphereConfig(framework);
+
+		TesterBroadcasterFactory broadcasterFactory = new TesterBroadcasterFactory(config, broadcaster);
+		framework.setBroadcasterFactory(broadcasterFactory);
+
+		broadcaster.initialize("wicket-atmosphere-tester", config);
+
+		VoidExecutorService sameThreadExecutorService = new VoidExecutorService();
+		BroadcasterConfig broadcasterConfig = new BroadcasterConfig(
+				sameThreadExecutorService,
+				sameThreadExecutorService,
+				Executors.newSingleThreadScheduledExecutor(),
+				config, "tester-broadcaster-config");
+		broadcaster.setBroadcasterConfig(broadcasterConfig);
+		broadcasterConfig.setAsyncWriteService(sameThreadExecutorService);
+		broadcasterConfig.setExecutorService(sameThreadExecutorService);
+
+		return broadcaster;
 	}
 
-	private static class TesterBroadcasterFactory extends DefaultBroadcasterFactory
+	@Override
+	public TesterBroadcaster getBroadcaster()
 	{
-		protected TesterBroadcasterFactory(AtmosphereConfig c)
-		{
-			super(SimpleBroadcaster.class, BroadcasterLifeCyclePolicy.ATMOSPHERE_RESOURCE_POLICY.NEVER.name(), c);
-
-			// expose myself as BroadcasterFactory.getDefault();
-			factory = this;
-		}
+		return (TesterBroadcaster) super.getBroadcaster();
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/beeb0001/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
index 9f86cdf..368367d 100644
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
@@ -33,6 +33,8 @@ public class AtmosphereTest extends Assert
 	@Test
 	public void atmospherePush()
 	{
+		final String updateTimeIsExecuted = "updateTime is executed!";
+
 		WicketTester tester = new WicketTester();
 		HomePage page = new HomePage(new PageParameters())
 		{
@@ -41,8 +43,7 @@ public class AtmosphereTest extends Assert
 			{
 				super.updateTime(target, event);
 
-				System.err.println("updateTime");
-				target.appendJavaScript("updateTime is executed");
+				target.appendJavaScript(updateTimeIsExecuted);
 			}
 
 			@Subscribe(contextAwareFilter = ReceiverFilter.class)
@@ -59,7 +60,8 @@ public class AtmosphereTest extends Assert
 		Date payload = new Date();
 		waTester.post(payload);
 
-		System.err.println("Ajax response:\n" + tester.getLastResponseAsString());
+//		System.err.println("Ajax response:\n" + tester.getLastResponseAsString());
+		tester.assertContains(updateTimeIsExecuted);
 
 		tester.destroy();
 	}


[07/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Upgrade Atmosphere to 2.1.8


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

Branch: refs/heads/wicket-6.x
Commit: 2524554a3b26b63c2f42c895505d3a7638d3edd6
Parents: 2239d1e
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 12:42:25 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:45:43 2014 +0200

----------------------------------------------------------------------
 wicket-experimental/wicket-atmosphere/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2524554a/wicket-experimental/wicket-atmosphere/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/pom.xml b/wicket-experimental/wicket-atmosphere/pom.xml
index 6b257c8..d92b0b5 100644
--- a/wicket-experimental/wicket-atmosphere/pom.xml
+++ b/wicket-experimental/wicket-atmosphere/pom.xml
@@ -27,7 +27,7 @@
 	<version>0.20-SNAPSHOT</version>
 	<packaging>jar</packaging>
 	<properties>
-		<atmosphere.version>2.1.4</atmosphere.version>
+		<atmosphere.version>2.1.8</atmosphere.version>
 	</properties>
 	<name>Wicket-Atmosphere</name>
 	<description>Wicket-Atmosphere provides integration of the Atmosphere Framework in Wicket.</description>


[03/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Fix the atmosphere behavior listener interface's type


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

Branch: refs/heads/wicket-6.x
Commit: d0751c2b1de861222f4b53fdcc76dc7719c0ff38
Parents: 0582a24
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Aug 13 08:56:21 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:45:00 2014 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/atmosphere/AtmosphereBehavior.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/d0751c2b/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 9a863c8..f41e91f 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
@@ -18,13 +18,13 @@ package org.apache.wicket.atmosphere;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
-import org.apache.wicket.IResourceListener;
 import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.Page;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.json.JSONException;
 import org.apache.wicket.ajax.json.JSONObject;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
+import org.apache.wicket.behavior.IBehaviorListener;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
@@ -197,7 +197,7 @@ public class AtmosphereBehavior extends AbstractAjaxBehavior
 			response.render(JavaScriptHeaderItem.forReference(JQueryWicketAtmosphereResourceReference.get()));
 			JSONObject options = findEventBus().getParameters().toJSON();
 			options.put("url",
-				component.urlFor(this, IResourceListener.INTERFACE, new PageParameters())
+				component.urlFor(this, IBehaviorListener.INTERFACE, new PageParameters())
 					.toString());
 			response.render(OnDomReadyHeaderItem.forScript("$('#" + component.getMarkupId() +
 				"').wicketAtmosphere(" + options.toString() + ")"));


[02/17] git commit: WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Posted by mg...@apache.org.
WICKET-5452 Make Wicket-Atmosphere testable - AtmosphereTester

Atmosphere tester - write to the http response (doesn't work)


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

Branch: refs/heads/wicket-6.x
Commit: 0582a24373b2bcd981f398c39f8cfea85cd08e06
Parents: 2ab1d79
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Aug 12 17:30:46 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Fri Aug 15 09:44:53 2014 +0200

----------------------------------------------------------------------
 .../wicket/atmosphere/AtmosphereBehavior.java   |  1 +
 .../atmosphere/AtmosphereApplication.java       | 79 --------------------
 .../wicket/atmosphere/AtmosphereTest.java       |  3 +
 3 files changed, 4 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0582a243/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 9df55bc..9a863c8 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
@@ -189,6 +189,7 @@ public class AtmosphereBehavior extends AbstractAjaxBehavior
 	@Override
 	public void renderHead(Component component, IHeaderResponse response)
 	{
+		super.renderHead(component, response);
 		try
 		{
 			CoreLibrariesContributor.contributeAjax(component.getApplication(), response);

http://git-wip-us.apache.org/repos/asf/wicket/blob/0582a243/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java
deleted file mode 100644
index aca6e62..0000000
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereApplication.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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 java.util.Date;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.atmosphere.config.AtmosphereLogLevel;
-import org.apache.wicket.atmosphere.config.AtmosphereTransport;
-import org.apache.wicket.protocol.http.WebApplication;
-
-/**
- * Application object for your web application. If you want to run this application without
- * deploying, run the Start class.
- */
-public class AtmosphereApplication extends WebApplication
-{
-	private EventBus eventBus;
-
-	@Override
-	public Class<HomePage> getHomePage()
-	{
-		return HomePage.class;
-	}
-
-	public EventBus getEventBus()
-	{
-		return eventBus;
-	}
-
-	public static AtmosphereApplication get()
-	{
-		return (AtmosphereApplication)Application.get();
-	}
-
-	@Override
-	public void init()
-	{
-		super.init();
-		eventBus = new EventBus(this);
-		eventBus.getParameters().setTransport(AtmosphereTransport.STREAMING);
-		eventBus.getParameters().setLogLevel(AtmosphereLogLevel.DEBUG);
-
-		ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
-		final Runnable beeper = new Runnable()
-		{
-			@Override
-			public void run()
-			{
-				try
-				{
-					eventBus.post(new Date());
-				}
-				catch (Exception e)
-				{
-					e.printStackTrace();
-				}
-			}
-		};
-		scheduler.scheduleWithFixedDelay(beeper, 2, 2, TimeUnit.SECONDS);
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/0582a243/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
----------------------------------------------------------------------
diff --git a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
index 5accac5..e8a5b30 100644
--- a/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
+++ b/wicket-experimental/wicket-atmosphere/src/test/java/org/apache/wicket/atmosphere/AtmosphereTest.java
@@ -42,6 +42,7 @@ public class AtmosphereTest extends Assert
 				super.updateTime(target, event);
 
 				System.err.println("updateTime");
+				target.appendJavaScript("updateTime is executed");
 			}
 
 			@Subscribe(contextAwareFilter = ReceiverFilter.class)
@@ -60,6 +61,8 @@ public class AtmosphereTest extends Assert
 		Date payload = new Date();
 		waTester.post(payload);
 
+		System.err.println(tester.getLastResponseAsString());
+
 		tester.destroy();
 	}
 }