http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java deleted file mode 100644 index 945c9cf..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/ConversationPropagatorTest.java +++ /dev/null @@ -1,202 +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.cdi; - -import javax.enterprise.context.Conversation; -import javax.inject.Inject; - -import org.apache.wicket.cdi.testapp.TestConversationPage; -import org.apache.wicket.cdi.testapp.TestConversationalPage; -import org.apache.wicket.core.request.mapper.MountedMapper; -import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.hamcrest.CoreMatchers; -import org.junit.Test; - -/** - * @author jsarman - */ -public class ConversationPropagatorTest extends WicketCdiTestCase -{ - @Inject - Conversation conversation; - - @Test - public void testAutoConversationNonBookmarkable() - { - configure(new CdiConfiguration()); - - tester.startPage(TestConversationalPage.class); - int i; - for (i = 0; i < 3; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - tester.clickLink("next"); - for (; i < 6; i++) - { - tester.clickLink("increment"); - tester.assertCount(1); - } - } - - @Test - public void testAutoConversationBookmarkable() - { - configure(new CdiConfiguration()); - - tester.startPage(TestConversationalPage.class, - new PageParameters().add("pageType", "bookmarkable")); - - int i; - for (i = 0; i < 3; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - tester.clickLink("next"); - for (i = 0; i < 3; i++) - { - tester.clickLink("increment"); - tester.assertCount(1); - } - } - - @Test - public void testPropagationAllNonBookmarkable() - { - configure(new CdiConfiguration().setPropagation(ConversationPropagation.ALL)); - - tester.startPage(TestConversationPage.class); - int i; - for (i = 0; i < 3; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - tester.clickLink("next"); - for (; i < 6; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - } - - @Test - public void testPropagationAllHybrid() - { - configure(new CdiConfiguration().setPropagation(ConversationPropagation.ALL)); - tester.getApplication().getRootRequestMapperAsCompound().add(new MountedMapper("segment/${pageType}", TestConversationPage.class)); - - tester.startPage(TestConversationPage.class, new PageParameters().add("pageType", "hybrid")); - - int i; - for (i = 0; i < 3; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - tester.clickLink("next"); - for (; i < 6; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - } - - /** - * https://issues.apache.org/jira/browse/WICKET-6257 - */ - @Test - public void testPropagationAllHybridRefresh() - { - configure(new CdiConfiguration().setPropagation(ConversationPropagation.ALL)); - tester.getApplication().getRootRequestMapperAsCompound().add(new MountedMapper("segment/${pageType}", TestConversationPage.class)); - - tester.startPage(TestConversationPage.class, new PageParameters().add("pageType", "hybrid")); - - String pageId = tester.getLastRenderedPage().getId(); - String cid = conversation.getId(); - - tester.executeUrl("segment/hybrid?"+pageId+"&cid="+cid); - - assertThat(tester.getLastRenderedPage().getId(), CoreMatchers.is(pageId)); - } - - @Test - public void testPropagationAllBookmarkable() - { - configure(new CdiConfiguration().setPropagation(ConversationPropagation.ALL)); - - tester.startPage(TestConversationPage.class, - new PageParameters().add("pageType", "bookmarkable")); - int i; - for (i = 0; i < 3; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - tester.clickLink("next"); - for (; i < 6; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - } - - @Test - public void testPropagationNonBookmarkable() - { - configure(new CdiConfiguration()); - - tester.startPage(TestConversationPage.class, - new PageParameters().add("pageType", "bookmarkable")); - int i; - for (i = 0; i < 3; i++) - { - tester.assertCount(i); - tester.clickLink("increment"); - } - tester.clickLink("next"); - for (; i < 6; i++) - { - tester.clickLink("increment"); - tester.assertCount(1); - } - } - - @Test - public void testPropagationNone() - { - configure(new CdiConfiguration().setPropagation(ConversationPropagation.NONE)); - - tester.startPage(TestConversationPage.class); - int i; - for (i = 0; i < 3; i++) - { - tester.clickLink("increment"); - tester.assertCount(1); - } - tester.clickLink("next"); - for (; i < 6; i++) - { - tester.clickLink("increment"); - tester.assertCount(1); - } - } - -}
http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java deleted file mode 100644 index 3f82075..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/WicketCdiTestCase.java +++ /dev/null @@ -1,185 +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.cdi; - -import javax.inject.Inject; - -import org.apache.wicket.Component; -import org.apache.wicket.Page; -import org.apache.wicket.ThreadContext; -import org.apache.wicket.behavior.AbstractAjaxBehavior; -import org.apache.wicket.cdi.testapp.TestAppScope; -import org.apache.wicket.cdi.testapp.TestCdiApplication; -import org.apache.wicket.cdi.testapp.TestConversationBean; -import org.apache.wicket.mock.MockApplication; -import org.apache.wicket.protocol.http.WebApplication; -import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.util.tester.WicketTester; -import org.jglue.cdiunit.AdditionalClasses; -import org.jglue.cdiunit.CdiRunner; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.runner.RunWith; - -/** - * @author jsarman - */ -@RunWith(CdiRunner.class) -@AdditionalClasses({ CdiWicketTester.class, BehaviorInjector.class, CdiConfiguration.class, - CdiShutdownCleaner.class, ComponentInjector.class, ConversationExpiryChecker.class, - ConversationPropagator.class, DetachEventEmitter.class, SessionInjector.class, - TestAppScope.class, TestConversationBean.class, TestCdiApplication.class, - AutoConversation.class }) -public abstract class WicketCdiTestCase extends Assert -{ - @Inject - private ContextManager contextManager; - /** */ - protected CdiWicketTester tester; - - protected CdiWicketTester newWicketTester(WebApplication app) - { - return new CdiWicketTester(app); - } - - public void configure(CdiConfiguration configuration) - { - configuration.configure(tester.getApplication()); - } - - @After - public void end() - { - if (contextManager.isRequestActive()) - { - contextManager.deactivateContexts(); - contextManager.destroy(); - } - } - - /** - * @see junit.framework.TestCase#setUp() - */ - @Before - public void commonBefore() - { - // make sure no leaked threadlocals are present - ThreadContext.detach(); - - WebApplication application = newApplication(); - tester = newWicketTester(application); - } - - /** - * @return the application that should be used for the test - */ - protected WebApplication newApplication() - { - return new MockApplication(); - } - - /** - * - */ - @After - public void commonAfter() - { - tester.destroy(); - } - - /** - * Use <code>-Dwicket.replace.expected.results=true</code> to automatically - * replace the expected output file. - * - * @param <T> - * - * @param pageClass - * @param filename - * @throws Exception - */ - protected <T extends Page> void executeTest(final Class<T> pageClass, final String filename) - throws Exception - { - tester.executeTest(getClass(), pageClass, filename); - } - - /** - * Use <code>-Dwicket.replace.expected.results=true</code> to automatically - * replace the expected output file. - * - * @param page - * @param filename - * @throws Exception - */ - protected void executeTest(final Page page, final String filename) throws Exception - { - tester.executeTest(getClass(), page, filename); - } - - /** - * Use <code>-Dwicket.replace.expected.results=true</code> to automatically - * replace the expected output file. - * - * @param <T> - * - * @param pageClass - * @param parameters - * @param filename - * @throws Exception - */ - protected <T extends Page> void executeTest(final Class<T> pageClass, - PageParameters parameters, final String filename) throws Exception - { - tester.executeTest(getClass(), pageClass, parameters, filename); - } - - /** - * - * @param component - * @param filename - * @throws Exception - */ - protected void executeListener(final Component component, final String filename) - throws Exception - { - tester.executeListener(getClass(), component, filename); - } - - /** - * - * @param behavior - * @param filename - * @throws Exception - */ - protected void executeBehavior(final AbstractAjaxBehavior behavior, final String filename) - throws Exception - { - tester.executeBehavior(getClass(), behavior, filename); - } - - /** - * Returns the current Maven build directory taken from the <tt>basedir</tt> - * system property, or null if not set - * - * @return path with a trailing slash - */ - public String getBasedir() - { - return WicketTester.getBasedir(); - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestAppScope.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestAppScope.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestAppScope.java deleted file mode 100644 index b36f8a7..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestAppScope.java +++ /dev/null @@ -1,40 +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.cdi.testapp; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.inject.Produces; - -/** - * @author jsarman - */ -@ApplicationScoped -public class TestAppScope -{ - - public String test() - { - return "Test ok"; - } - - public @Produces - @TestQualifier - String testString() - { - return "Test String"; - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestApplication.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestApplication.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestApplication.java deleted file mode 100644 index 7b82203..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestApplication.java +++ /dev/null @@ -1,39 +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.cdi.testapp; - -import org.apache.wicket.Page; -import org.apache.wicket.protocol.http.WebApplication; - -/** - * @author jsarman - */ -public class TestApplication extends WebApplication -{ - - @Override - public Class<? extends Page> getHomePage() - { - return TestPage.class; - } - - @Override - protected void init() - { - super.init(); - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestCdiApplication.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestCdiApplication.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestCdiApplication.java deleted file mode 100644 index 1bd8656..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestCdiApplication.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.cdi.testapp; - -import javax.inject.Inject; - -import org.apache.wicket.Page; -import org.apache.wicket.cdi.CdiConfiguration; -import org.apache.wicket.protocol.http.WebApplication; - -/** - * @author jsarman - */ -public class TestCdiApplication extends WebApplication -{ - - @Inject - @TestQualifier - String testString; - - - @Override - public Class<? extends Page> getHomePage() - { - return TestPage.class; - } - - @Override - protected void init() - { - super.init(); - new CdiConfiguration().configure(this); - } - - public String getInjectedTestString() - { - return testString; - } - -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java deleted file mode 100644 index 140ecdb..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationBean.java +++ /dev/null @@ -1,56 +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.cdi.testapp; - -import java.io.Serializable; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.enterprise.context.ConversationScoped; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author jsarman - */ -@ConversationScoped -public class TestConversationBean implements Serializable -{ - private static final long serialVersionUID = 1L; - - private static final Logger logger = LoggerFactory.getLogger(TestConversationBean.class); - - private AtomicInteger counter = new AtomicInteger(); - - public int getCount() - { - logger.debug("Count = {}", counter.get()); - return counter.get(); - } - - public String getCountStr() - { - return "COUNT=x" + getCount() + "x"; - } - - public void increment() - { - - counter.incrementAndGet(); - - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.html ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.html b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.html deleted file mode 100644 index e7f3de7..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.html +++ /dev/null @@ -1,12 +0,0 @@ -<!DOCTYPE html> -<html xmlns:wicket> -<head> - <title></title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> -</head> -<body> -<span wicket:id="count">100</span> -<a wicket:id="increment">increment</a> -<a wicket:id="next">Reset</a> -</body> -</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java deleted file mode 100644 index c6cc8bc..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationPage.java +++ /dev/null @@ -1,84 +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.cdi.testapp; - -import javax.enterprise.context.Conversation; -import javax.inject.Inject; - -import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.link.Link; -import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.request.mapper.parameter.PageParameters; - - -/** - * @author jsarman - */ -public class TestConversationPage extends WebPage -{ - private static final long serialVersionUID = 1L; - - @Inject - Conversation conversation; - - @Inject - TestConversationBean counter; - - public TestConversationPage() - { - this(new PageParameters()); - } - - public TestConversationPage(final PageParameters parameters) - { - super(parameters); - - conversation.begin(); - System.out.println("Opened Conversion with id = " + conversation.getId()); - - add(new Label("count", new PropertyModel<String>(this, "counter.countStr"))); - - add(new Link<Void>("increment") - { - private static final long serialVersionUID = 1L; - - @Override - public void onClick() - { - counter.increment(); - } - }); - add(new Link<Void>("next") - { - private static final long serialVersionUID = 1L; - - @Override - public void onClick() - { - String pageType = parameters.get("pageType").toString("nonbookmarkable"); - if ("bookmarkable".equals(pageType.toLowerCase())) - setResponsePage(TestNonConversationalPage.class); - else if ("hybrid".equals(pageType.toLowerCase())) - setResponsePage(TestConversationPage.this); - else - setResponsePage(new TestNonConversationalPage()); - } - }); - - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.html ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.html b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.html deleted file mode 100644 index b3550f1..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.html +++ /dev/null @@ -1,12 +0,0 @@ -<!DOCTYPE html> -<html xmlns:wicket> -<head> - <title></title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> -</head> -<body> -<span wicket:id="count">100</span> -<a wicket:id="increment">increment</a> -<a wicket:id="next">next</a> -</body> -</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java deleted file mode 100644 index 5e41fd5..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestConversationalPage.java +++ /dev/null @@ -1,78 +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.cdi.testapp; - -import javax.inject.Inject; - -import org.apache.wicket.cdi.ConversationalComponent; -import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.link.Link; -import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author jsarman - */ -public class TestConversationalPage extends WebPage implements ConversationalComponent -{ - private static final long serialVersionUID = 1L; - - private static final Logger logger = LoggerFactory.getLogger(TestConversationPage.class); - @Inject - TestConversationBean counter; - - public TestConversationalPage() - { - this(new PageParameters()); - } - - - public TestConversationalPage(final PageParameters pp) - { - logger.debug("Starting TestConversationalPage"); - - add(new Label("count", new PropertyModel<String>(this, "counter.countStr"))); - - add(new Link<Void>("increment") - { - private static final long serialVersionUID = 1L; - - @Override - public void onClick() - { - counter.increment(); - } - }); - add(new Link<Void>("next") - { - private static final long serialVersionUID = 1L; - - @Override - public void onClick() - { - String pageType = pp.get("pageType").toString("nonbookmarkable"); - if ("bookmarkable".equals(pageType.toLowerCase())) - setResponsePage(TestNonConversationalPage.class); - else - setResponsePage(new TestNonConversationalPage()); - } - }); - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.html ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.html b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.html deleted file mode 100644 index fd58f2d..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.html +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html xmlns:wicket> -<head> - <title></title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> -</head> -<body> -<span wicket:id="count">100</span> -<a wicket:id="increment">increment</a> -</body> -</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java deleted file mode 100644 index 7728e81..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestNonConversationalPage.java +++ /dev/null @@ -1,55 +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.cdi.testapp; - -import javax.inject.Inject; - -import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.link.Link; -import org.apache.wicket.model.PropertyModel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * @author jsarman - */ -public class TestNonConversationalPage extends WebPage -{ - private static final long serialVersionUID = 1L; - private static final Logger logger = LoggerFactory.getLogger(TestConversationPage.class); - @Inject - TestConversationBean counter; - - public TestNonConversationalPage() - { - logger.debug("Starting TestConversationalPage"); - add(new Label("count", new PropertyModel<String>(this, "counter.countStr"))); - - add(new Link<Void>("increment") - { - private static final long serialVersionUID = 1L; - - @Override - public void onClick() - { - counter.increment(); - } - }); - } -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.html ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.html b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.html deleted file mode 100644 index 4689c49..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.html +++ /dev/null @@ -1,10 +0,0 @@ -<!DOCTYPE html> -<html xmlns:wicket> -<head> - <title></title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> -</head> -<body> -<div wicket:id="appscope">Fail</div> -</body> -</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.java deleted file mode 100644 index cf5108b..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestPage.java +++ /dev/null @@ -1,40 +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.cdi.testapp; - -import javax.inject.Inject; - -import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.markup.html.basic.Label; - -/** - * @author jsarman - */ -public class TestPage extends WebPage -{ - private static final long serialVersionUID = 1L; - - @Inject - TestAppScope appScope; - - public TestPage() - { - - add(new Label("appscope", appScope.test())); - } - -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestQualifier.java ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestQualifier.java b/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestQualifier.java deleted file mode 100644 index dcd0289..0000000 --- a/wicket-cdi-1.1/src/test/java/org/apache/wicket/cdi/testapp/TestQualifier.java +++ /dev/null @@ -1,35 +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.cdi.testapp; - - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import javax.inject.Qualifier; - -/** - * @author jsarman - */ -@Qualifier -@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD }) -@Retention(RetentionPolicy.RUNTIME) -public @interface TestQualifier { - -} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi-1.1/src/test/java/simplelogger.properties ---------------------------------------------------------------------- diff --git a/wicket-cdi-1.1/src/test/java/simplelogger.properties b/wicket-cdi-1.1/src/test/java/simplelogger.properties deleted file mode 100644 index 17c5fe6..0000000 --- a/wicket-cdi-1.1/src/test/java/simplelogger.properties +++ /dev/null @@ -1 +0,0 @@ -org.slf4j.simpleLogger.log.org.apache.wicket.cdi=info \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/pom.xml ---------------------------------------------------------------------- diff --git a/wicket-cdi/pom.xml b/wicket-cdi/pom.xml index a0cf977..29de4bb 100644 --- a/wicket-cdi/pom.xml +++ b/wicket-cdi/pom.xml @@ -27,7 +27,7 @@ </parent> <artifactId>wicket-cdi</artifactId> <packaging>bundle</packaging> - <name>Wicket CDI Integration</name> + <name>Wicket CDI</name> <description> Provides integration between Wicket and CDI containers. Enables injection of components and behaviors, as well as other non-contextual object instances. @@ -55,12 +55,41 @@ <artifactId>wicket-core</artifactId> </dependency> <dependency> - <groupId>org.jboss.weld</groupId> - <artifactId>weld-core-impl</artifactId> + <groupId>org.jboss.weld.module</groupId> + <artifactId>weld-web</artifactId> + </dependency> + <dependency> + <groupId>org.jboss.weld.se</groupId> + <artifactId>weld-se-core</artifactId> + <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> + <dependency> + <groupId>org.jglue.cdi-unit</groupId> + <artifactId>cdi-unit</artifactId> + <exclusions> + <exclusion> + <artifactId>org.jboss.spec.javax.annotation</artifactId> + <groupId>jboss-annotations-api_1.2_spec</groupId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-enforcer-plugin</artifactId> + <configuration> + <skip>true</skip> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> </project> http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AbstractInjector.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/AbstractInjector.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AbstractInjector.java index b77aa6e..cf8d67f 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/AbstractInjector.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AbstractInjector.java @@ -16,8 +16,6 @@ */ package org.apache.wicket.cdi; -import org.apache.wicket.util.lang.Args; - /** * Base class for injectors * @@ -25,21 +23,17 @@ import org.apache.wicket.util.lang.Args; */ class AbstractInjector { - private final CdiContainer container; - - public AbstractInjector(CdiContainer container) + public AbstractInjector() { - Args.notNull(container, "container"); - this.container = container; } protected <T> void postConstruct(T instance) { - container.getNonContextualManager().postConstruct(instance); + NonContextual.of(instance).postConstruct(instance); } protected <T> void inject(T instance) { - container.getNonContextualManager().inject(instance); + NonContextual.of(instance).inject(instance); } } http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversation.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversation.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversation.java index 0193a7d..90f5e19 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversation.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversation.java @@ -21,15 +21,16 @@ import javax.enterprise.context.ConversationScoped; import org.apache.wicket.util.io.IClusterable; /** - * A bean that can be used to override whether the lifecycle of the conversation should be managed - * automatically or not. See {@link CdiConfiguration#setAutoConversationManagement(boolean)} for - * details. + * A bean that can be used to override whether the lifecycle of the conversation + * should be managed automatically or not. * * @author igor */ @ConversationScoped public class AutoConversation implements IClusterable { + private static final long serialVersionUID = 1L; + private boolean automatic; public AutoConversation() http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversationManager.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversationManager.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversationManager.java new file mode 100644 index 0000000..4aedb48 --- /dev/null +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/AutoConversationManager.java @@ -0,0 +1,121 @@ +/* + * 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.cdi; + +import javax.enterprise.context.Conversation; +import javax.inject.Inject; + +import org.apache.wicket.Component; +import org.apache.wicket.Page; +import org.apache.wicket.application.IComponentOnBeforeRenderListener; +import org.apache.wicket.request.IRequestHandler; +import org.apache.wicket.request.cycle.RequestCycle; +import org.apache.wicket.util.visit.IVisit; +import org.apache.wicket.util.visit.IVisitor; +import org.apache.wicket.util.visit.Visits; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Automatically starts and ends conversations for pages with a + * {@link ConversationalComponent}. + * + * @author papegaaij + */ +public class AutoConversationManager implements IComponentOnBeforeRenderListener +{ + private static final Logger logger = LoggerFactory.getLogger(AutoConversationManager.class); + + @Inject + private Conversation conversation; + + @Inject + private AutoConversation autoConversation; + + private IConversationPropagation propagation; + + public AutoConversationManager(IConversationPropagation propagation) + { + NonContextual.of(AutoConversationManager.class).inject(this); + this.propagation = propagation; + } + + @Override + public void onBeforeRender(Component component) + { + if (component instanceof Page) + { + Page page = (Page)component; + IRequestHandler activeRequestHandler = page.getRequestCycle().getActiveRequestHandler(); + autoEndIfNecessary(page, activeRequestHandler); + autoBeginIfNecessary(page, activeRequestHandler); + } + } + + protected void autoBeginIfNecessary(Page page, IRequestHandler handler) + { + if (conversation == null || !conversation.isTransient() || page == null + || !hasConversationalComponent(page) || !propagation.propagatesVia(handler, page)) + { + return; + } + + // auto activate conversation + + conversation.begin(); + autoConversation.setAutomatic(true); + + logger.debug("Auto-began conversation '{}' for page '{}'", conversation.getId(), page); + } + + protected void autoEndIfNecessary(Page page, IRequestHandler handler) + { + if (conversation == null || conversation.isTransient() || page == null + || hasConversationalComponent(page) || !propagation.propagatesVia(handler, page) + || autoConversation.isAutomatic() == false) + { + return; + } + + // auto de-activate conversation + + String cid = conversation.getId(); + + autoConversation.setAutomatic(false); + conversation.end(); + ConversationPropagator.removeConversationIdFromPage(page); + + logger.debug("Auto-ended conversation '{}' for page '{}'", cid, page); + } + + protected boolean hasConversationalComponent(Page page) + { + Boolean hasConversational = Visits.visit(page, new IVisitor<Component, Boolean>() + { + @Override + public void component(Component object, IVisit<Boolean> visit) + { + if (object instanceof ConversationalComponent) + { + visit.stop(true); + } + } + }); + + return hasConversational == null ? false : hasConversational; + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/BeanManagerLookup.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/BeanManagerLookup.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/BeanManagerLookup.java new file mode 100644 index 0000000..f44e513 --- /dev/null +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/BeanManagerLookup.java @@ -0,0 +1,128 @@ +/* + * 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.cdi; + +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.CDI; +import javax.naming.InitialContext; +import javax.naming.NamingException; + +import org.apache.wicket.Application; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Defines several strategies for looking up a CDI BeanManager in a portable + * way. The following strategies are tried (in order): + * <ul> + * <li>JNDI under java:comp/BeanManager (default location)</li> + * <li>JNDI under java:comp/env/BeanManager (for servlet containers like Tomcat + * and Jetty)</li> + * <li>CDI.current().getBeanManager() (portable lookup)</li> + * <li>{@linkplain CdiConfiguration#getFallbackBeanManager() Fallback}</li> + * </ul> + * + * The last successful lookup strategy is saved and tried first next time. + * + * @author papegaaij + */ +public final class BeanManagerLookup +{ + private static final Logger log = LoggerFactory.getLogger(BeanManagerLookup.class); + + private enum BeanManagerLookupStrategy { + JNDI { + @Override + public BeanManager lookup() + { + try + { + return InitialContext.doLookup("java:comp/BeanManager"); + } + catch (NamingException e) + { + return null; + } + } + }, + JNDI_ENV { + @Override + public BeanManager lookup() + { + try + { + return InitialContext.doLookup("java:comp/env/BeanManager"); + } + catch (NamingException e) + { + return null; + } + } + }, + CDI_PROVIDER { + @Override + public BeanManager lookup() + { + try + { + return CDI.current().getBeanManager(); + } + catch (Exception e) + { + log.debug(e.getMessage(), e); + return null; + } + } + }, + FALLBACK { + @Override + public BeanManager lookup() + { + return CdiConfiguration.get(Application.get()).getFallbackBeanManager(); + } + }; + + public abstract BeanManager lookup(); + } + + private static BeanManagerLookupStrategy lastSuccessful = BeanManagerLookupStrategy.JNDI; + + private BeanManagerLookup() + { + } + + public static BeanManager lookup() + { + BeanManager ret = lastSuccessful.lookup(); + if (ret != null) + return ret; + + for (BeanManagerLookupStrategy curStrategy : BeanManagerLookupStrategy.values()) + { + ret = curStrategy.lookup(); + if (ret != null) + { + lastSuccessful = curStrategy; + return ret; + } + } + + throw new IllegalStateException( + "No BeanManager found via the CDI provider and no fallback specified. Check your " + + "CDI setup or specify a fallback BeanManager in the CdiConfiguration."); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/BehaviorInjector.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/BehaviorInjector.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/BehaviorInjector.java index 0ba6219..15979f6 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/BehaviorInjector.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/BehaviorInjector.java @@ -25,16 +25,13 @@ import org.apache.wicket.behavior.Behavior; * @author igor * */ -class BehaviorInjector extends AbstractInjector implements IBehaviorInstantiationListener +public class BehaviorInjector extends AbstractInjector implements IBehaviorInstantiationListener { /** * Constructor - * - * @param container */ - public BehaviorInjector(CdiContainer container) + public BehaviorInjector() { - super(container); } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiConfiguration.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiConfiguration.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiConfiguration.java index ad369a1..30778aa 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiConfiguration.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiConfiguration.java @@ -19,8 +19,8 @@ package org.apache.wicket.cdi; import javax.enterprise.inject.spi.BeanManager; import org.apache.wicket.Application; +import org.apache.wicket.MetaDataKey; import org.apache.wicket.request.cycle.RequestCycleListenerCollection; -import org.apache.wicket.util.lang.Args; /** * Configures CDI integration @@ -30,37 +30,20 @@ import org.apache.wicket.util.lang.Args; */ public class CdiConfiguration { - private BeanManager beanManager; + private static final MetaDataKey<CdiConfiguration> CDI_CONFIGURATION_KEY = new MetaDataKey<CdiConfiguration>() + { + private static final long serialVersionUID = 1L; + }; + private IConversationPropagation propagation = ConversationPropagation.NONBOOKMARKABLE; - private INonContextualManager nonContextualManager; - private boolean injectComponents = true; - private boolean injectApplication = true; - private boolean injectSession = true; - private boolean injectBehaviors = true; - private boolean autoConversationManagement = false; + private BeanManager fallbackBeanManager; /** * Constructor - * - * @param beanManager - */ - public CdiConfiguration(BeanManager beanManager) - { - Args.notNull(beanManager, "beanManager"); - - this.beanManager = beanManager; - nonContextualManager = new NonContextualManager(beanManager); - } - - /** - * Gets the configured bean manager - * - * @return bean manager or {@code null} if none */ - public BeanManager getBeanManager() + public CdiConfiguration() { - return beanManager; } public IConversationPropagation getPropagation() @@ -68,96 +51,31 @@ public class CdiConfiguration return propagation; } - /** - * Checks if auto conversation management is enabled. See - * {@link #setAutoConversationManagement(boolean)} for details. - */ - public boolean isAutoConversationManagement() - { - return autoConversationManagement; - } - - /** - * Toggles automatic conversation management feature. - * - * Automatic conversation management controls the lifecycle of the conversation based on - * presence of components implementing the {@link ConversationalComponent} interface. If such - * components are found in the page a conversation is marked persistent, and if they are not the - * conversation is marked transient. This greatly simplifies the management of conversation - * lifecycle. - * - * Sometimes it is necessary to manually control the application. For these cases, once a - * conversation is started {@link AutoConversation} bean can be used to mark the conversation as - * manually-managed. - * - * @param enabled - * - * @return {@code this} for easy chaining - */ - public CdiConfiguration setAutoConversationManagement(boolean enabled) - { - autoConversationManagement = enabled; - return this; - } - public CdiConfiguration setPropagation(IConversationPropagation propagation) { this.propagation = propagation; return this; } - public INonContextualManager getNonContextualManager() - { - return nonContextualManager; - } - - public CdiConfiguration setNonContextualManager(INonContextualManager nonContextualManager) - { - this.nonContextualManager = nonContextualManager; - return this; - } - - public boolean isInjectComponents() - { - return injectComponents; - } - - public CdiConfiguration setInjectComponents(boolean injectComponents) - { - this.injectComponents = injectComponents; - return this; - } - - public boolean isInjectApplication() - { - return injectApplication; - } - - public CdiConfiguration setInjectApplication(boolean injectApplication) - { - this.injectApplication = injectApplication; - return this; - } - - public boolean isInjectSession() + public BeanManager getFallbackBeanManager() { - return injectSession; + return fallbackBeanManager; } - public CdiConfiguration setInjectSession(boolean injectSession) - { - this.injectSession = injectSession; - return this; - } - - public boolean isInjectBehaviors() - { - return injectBehaviors; - } - - public CdiConfiguration setInjectBehaviors(boolean injectBehaviors) + /** + * Sets a BeanManager that should be used if all strategies to lookup a + * BeanManager fail. This can be used in scenarios where you do not have + * JNDI available and do not want to bootstrap the CDI provider. It should + * be noted that the fallback BeanManager can only be used within the + * context of a Wicket application (ie. Application.get() should return the + * application that was configured with this CdiConfiguration). + * + * @param fallbackBeanManager + * @return this instance + */ + public CdiConfiguration setFallbackBeanManager(BeanManager fallbackBeanManager) { - this.injectBehaviors = injectBehaviors; + this.fallbackBeanManager = fallbackBeanManager; return this; } @@ -165,18 +83,14 @@ public class CdiConfiguration * Configures the specified application * * @param application - * @return The CdiContainer */ - public CdiContainer configure(Application application) + public void configure(Application application) { - if (beanManager == null) + if (application.getMetaData(CDI_CONFIGURATION_KEY) != null) { - throw new IllegalStateException( - "Configuration does not have a BeanManager instance configured"); + throw new IllegalStateException("Cdi already configured for this application"); } - - CdiContainer container = new CdiContainer(beanManager, nonContextualManager); - container.bind(application); + application.setMetaData(CDI_CONFIGURATION_KEY, this); RequestCycleListenerCollection listeners = new RequestCycleListenerCollection(); application.getRequestCycleListeners().add(listeners); @@ -184,45 +98,29 @@ public class CdiConfiguration // enable conversation propagation if (getPropagation() != ConversationPropagation.NONE) { - listeners.add(new ConversationPropagator(application, container, getPropagation(), - autoConversationManagement)); + listeners.add(new ConversationPropagator(application, getPropagation())); + application.getComponentPreOnBeforeRenderListeners().add( + new AutoConversationManager(getPropagation())); application.getComponentPreOnBeforeRenderListeners().add( - new ConversationExpiryChecker(container)); + new ConversationExpiryChecker()); } // enable detach event - listeners.add(new DetachEventEmitter(container)); - + listeners.add(new DetachEventEmitter()); - // inject application instance - if (isInjectApplication()) - { - container.getNonContextualManager().postConstruct(application); - } + NonContextual.of(application).postConstruct(application); // enable injection of various framework components - - if (isInjectSession()) - { - application.getSessionListeners().add(new SessionInjector(container)); - } - - if (isInjectComponents()) - { - application.getComponentInstantiationListeners().add(new ComponentInjector(container)); - } - - if (isInjectBehaviors()) - { - application.getBehaviorInstantiationListeners().add(new BehaviorInjector(container)); - } + application.getSessionListeners().add(new SessionInjector()); + application.getComponentInstantiationListeners().add(new ComponentInjector()); + application.getBehaviorInstantiationListeners().add(new BehaviorInjector()); // enable cleanup - - application.getApplicationListeners().add( - new CdiShutdownCleaner(beanManager, isInjectApplication())); - - return container; + application.getApplicationListeners().add(new CdiShutdownCleaner()); } + public static CdiConfiguration get(Application application) + { + return application.getMetaData(CDI_CONFIGURATION_KEY); + } } http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiContainer.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiContainer.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiContainer.java deleted file mode 100644 index 168588d..0000000 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiContainer.java +++ /dev/null @@ -1,167 +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.cdi; - -import javax.enterprise.inject.spi.BeanManager; -import javax.servlet.http.HttpServletRequest; - -import org.apache.wicket.Application; -import org.apache.wicket.MetaDataKey; -import org.apache.wicket.Page; -import org.apache.wicket.request.cycle.RequestCycle; -import org.apache.wicket.util.lang.Args; -import org.jboss.weld.Container; -import org.jboss.weld.context.http.HttpConversationContext; - -/** - * Provides access to CDI features from inside a Wicket request - * - * @author igor - * - */ -public class CdiContainer -{ - private static final MetaDataKey<CdiContainer> CONTEXT_KEY = new MetaDataKey<CdiContainer>() - { - private static final long serialVersionUID = 1L; - }; - - protected final BeanManager beanManager; - private final HttpConversationContext conversationContext; - private final INonContextualManager nonContextualManager; - - /** - * Constructor - * - * @param beanManager - * bean manager - */ - public CdiContainer(BeanManager beanManager, INonContextualManager nonContextualManager) - { - Args.notNull(beanManager, "beanManager"); - Args.notNull(nonContextualManager, "nonContextualManager"); - - this.beanManager = beanManager; - this.nonContextualManager = nonContextualManager; - - conversationContext = Container.instance().deploymentManager().instance().select(HttpConversationContext.class).get(); - if (conversationContext == null) - { - throw new IllegalStateException( - "Could not resolve conversation context manager. Make sure a Seam-Conversation module for your CDI container implementation is included in your dependencies."); - } - } - - public INonContextualManager getNonContextualManager() - { - return nonContextualManager; - } - - /** - * Deactivates conversational context - * - * @param cycle - */ - public void deactivateConversationalContext(RequestCycle cycle) - { - conversationContext.deactivate(); - conversationContext.dissociate(getRequest(cycle)); - } - - /** - * Activates the conversational context and starts the conversation with the specified cid - * - * @param cycle - * @param cid - */ - public void activateConversationalContext(RequestCycle cycle, String cid) - { - conversationContext.associate(getRequest(cycle)); - conversationContext.activate(cid); - } - - private HttpServletRequest getRequest(RequestCycle cycle) - { - return (HttpServletRequest)cycle.getRequest().getContainerRequest(); - } - - /** - * Retrieves a conversation id, if any, that is associated with a {@link Page} instance - * - * @param page - * page instance - * @return conversation id, if any - */ - public String getConversationMarker(Page page) - { - return page.getMetaData(ConversationIdMetaKey.INSTANCE); - } - - /** - * Removes conversation marker from the page instance which prevents the conversation from - * propagating to the page. This method should usually be called from page's {@code onDetach()} - * method. - * - * @param page - */ - public void removeConversationMarker(Page page) - { - Args.notNull(page, "page"); - - page.setMetaData(ConversationIdMetaKey.INSTANCE, null); - page.getPageParameters().remove(ConversationPropagator.CID); - } - - /** - * Binds this container instance to the {@link Application}, making it possible to retrieve it - * later - * - * @param application - */ - protected void bind(Application application) - { - application.setMetaData(CONTEXT_KEY, this); - } - - /** - * Retrieves container instance stored in the application - * - * @param application - * @return container instance or {@code null} if none - */ - public static final CdiContainer get(Application application) - { - CdiContainer ctx = application.getMetaData(CONTEXT_KEY); - if (ctx == null) - { - throw new IllegalStateException("No CDI Context bound to application"); - } - return ctx; - } - - /** - * Retrieves container instance stored in the current thread's application - * - * @return container instance or {@code null} if none - */ - public static final CdiContainer get() - { - return get(Application.get()); - } - - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiShutdownCleaner.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiShutdownCleaner.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiShutdownCleaner.java index aa219da..25c29dd 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiShutdownCleaner.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/CdiShutdownCleaner.java @@ -16,11 +16,8 @@ */ package org.apache.wicket.cdi; -import javax.enterprise.inject.spi.BeanManager; - import org.apache.wicket.Application; import org.apache.wicket.IApplicationListener; -import org.apache.wicket.util.lang.Args; /** * Listens to application shutdown and cleans up @@ -29,25 +26,14 @@ import org.apache.wicket.util.lang.Args; */ class CdiShutdownCleaner implements IApplicationListener { - private final BeanManager beanManager; - private final boolean preDestroyApplication; - - public CdiShutdownCleaner(BeanManager beanManager, boolean preDestroyApplication) + public CdiShutdownCleaner() { - Args.notNull(beanManager, "beanManager"); - - this.beanManager = beanManager; - this.preDestroyApplication = preDestroyApplication; } @Override public void onBeforeDestroyed(Application application) { - if (preDestroyApplication) - { - NonContextual.of(application, beanManager).preDestroy(application); - } - NonContextual.undeploy(beanManager); + NonContextual.of(application).preDestroy(application); + NonContextual.undeploy(); } - } http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ComponentInjector.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ComponentInjector.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ComponentInjector.java index bc302ef..65a4879 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ComponentInjector.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ComponentInjector.java @@ -29,12 +29,9 @@ class ComponentInjector extends AbstractInjector implements IComponentInstantiat { /** * Constructor - * - * @param container */ - public ComponentInjector(CdiContainer container) + public ComponentInjector() { - super(container); } @Override http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiredException.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiredException.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiredException.java index 7993ae4..16df7b1 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiredException.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiredException.java @@ -21,12 +21,13 @@ import org.apache.wicket.request.IRequestHandler; public class ConversationExpiredException extends RuntimeException { + private static final long serialVersionUID = 1L; private String cid; private Page page; private IRequestHandler handler; public ConversationExpiredException(Throwable cause, String cid, Page page, - IRequestHandler handler) + IRequestHandler handler) { super(cause); this.cid = cid; http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiryChecker.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiryChecker.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiryChecker.java index 8881485..3e2bc94 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiryChecker.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationExpiryChecker.java @@ -30,10 +30,12 @@ import org.slf4j.LoggerFactory; /** * Checks for conversation expiration during page render and throws a - * {@link ConversationExpiredException} when an expired conversation is detected. + * {@link ConversationExpiredException} when an expired conversation is + * detected. * - * For example a link that calls {@link Conversation#end()} but does not redirect to a - * non-conversation-dependent page will be caught by this listener. + * For example a link that calls {@link Conversation#end()} but does not + * redirect to a non-conversation-dependent page will be caught by this + * listener. * * @author igor * @@ -41,17 +43,13 @@ import org.slf4j.LoggerFactory; public class ConversationExpiryChecker implements IComponentOnBeforeRenderListener { private static final Logger logger = LoggerFactory.getLogger(ConversationExpiryChecker.class); - + @Inject private Conversation conversation; - private final CdiContainer container; - - public ConversationExpiryChecker(CdiContainer container) + public ConversationExpiryChecker() { - this.container = container; - - container.getNonContextualManager().inject(this); + NonContextual.of(ConversationExpiryChecker.class).inject(this); } @Override @@ -60,12 +58,12 @@ public class ConversationExpiryChecker implements IComponentOnBeforeRenderListen if (component instanceof Page || RequestCycle.get().find(IPartialPageRequestHandler.class).isPresent()) { Page page = component.getPage(); - String cid = container.getConversationMarker(page); + String cid = ConversationPropagator.getConversationIdFromPage(page); if (cid != null && !Objects.isEqual(conversation.getId(), cid)) { logger.info("Conversation {} has expired for {}", cid, page); throw new ConversationExpiredException(null, cid, page, RequestCycle.get() - .getActiveRequestHandler()); + .getActiveRequestHandler()); } } } http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationIdMetaKey.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationIdMetaKey.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationIdMetaKey.java deleted file mode 100644 index 94cc70f..0000000 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationIdMetaKey.java +++ /dev/null @@ -1,24 +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.cdi; - -import org.apache.wicket.MetaDataKey; - -final class ConversationIdMetaKey extends MetaDataKey<String> -{ - static final ConversationIdMetaKey INSTANCE = new ConversationIdMetaKey(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagation.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagation.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagation.java index e70ff9c..3c1eb89 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagation.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagation.java @@ -32,45 +32,29 @@ public enum ConversationPropagation implements IConversationPropagation { /** No conversational propagation takes place */ NONE { @Override - public boolean propagatesViaPage(Page page, IRequestHandler handler) - { - return false; - } - - @Override - public boolean propagatesViaParameters(IRequestHandler handler) + public boolean propagatesVia(IRequestHandler handler, Page page) { return false; } }, /** - * Pesistent conversations are propagated between non-bookmarkable pages only + * Pesistent conversations are propagated between non-bookmarkable pages + * only */ NONBOOKMARKABLE { @Override - public boolean propagatesViaPage(Page page, IRequestHandler handler) - { - return true; - } - - @Override - public boolean propagatesViaParameters(IRequestHandler handler) + public boolean propagatesVia(IRequestHandler handler, Page page) { - return false; + return page != null; } }, /** - * Persistent conversations are propagated between bookmarkable and non-bookmarkable pages + * Persistent conversations are propagated between bookmarkable and + * non-bookmarkable pages */ ALL { @Override - public boolean propagatesViaPage(Page page, IRequestHandler handler) - { - return true; - } - - @Override - public boolean propagatesViaParameters(IRequestHandler handler) + public boolean propagatesVia(IRequestHandler handler, Page page) { return true; } http://git-wip-us.apache.org/repos/asf/wicket/blob/057c402b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagator.java ---------------------------------------------------------------------- diff --git a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagator.java b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagator.java index 92f261c..613f6a5 100644 --- a/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagator.java +++ b/wicket-cdi/src/main/java/org/apache/wicket/cdi/ConversationPropagator.java @@ -16,38 +16,33 @@ */ package org.apache.wicket.cdi; +import javax.enterprise.context.ContextNotActiveException; import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; -import javax.enterprise.context.NonexistentConversationException; import javax.inject.Inject; import org.apache.wicket.Application; -import org.apache.wicket.Component; import org.apache.wicket.MetaDataKey; import org.apache.wicket.Page; import org.apache.wicket.core.request.handler.BufferedResponseRequestHandler; import org.apache.wicket.core.request.handler.IPageClassRequestHandler; import org.apache.wicket.core.request.handler.IPageRequestHandler; -import org.apache.wicket.core.request.mapper.StalePageException; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.IRequestHandlerDelegate; import org.apache.wicket.request.Url; -import org.apache.wicket.request.component.IRequestablePage; import org.apache.wicket.request.cycle.IRequestCycleListener; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.PackageResourceReference; import org.apache.wicket.util.lang.Args; -import org.apache.wicket.util.lang.Objects; -import org.apache.wicket.util.visit.IVisit; -import org.apache.wicket.util.visit.IVisitor; -import org.apache.wicket.util.visit.Visits; +import org.apache.wicket.util.lang.Classes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * A request cycle listener that takes care of propagating persistent conversations. + * A request cycle listener that takes care of propagating persistent + * conversations. * * @see ConversationScoped * @@ -57,158 +52,67 @@ public class ConversationPropagator implements IRequestCycleListener { private static final Logger logger = LoggerFactory.getLogger(ConversationPropagator.class); - private static final MetaDataKey<String> CID_KEY = ConversationIdMetaKey.INSTANCE; - private static final MetaDataKey<Boolean> CONVERSATION_STARTED_KEY = new MetaDataKey<Boolean>() { + private static final long serialVersionUID = 1L; }; + private static final MetaDataKey<String> CONVERSATION_ID_KEY = new MetaDataKey<String>() + { + private static final long serialVersionUID = 1L; + }; public static final String CID = "cid"; - private final CdiContainer container; - /** propagation mode to use */ private final IConversationPropagation propagation; private final Application application; - private final boolean auto; - - @Inject - Conversation conversation_; - @Inject - AutoConversation autoConversation; - - /** - * Constructor - * - * @param container - * @param propagation - */ - public ConversationPropagator(Application application, CdiContainer container, - IConversationPropagation propagation) - { - this(application, container, propagation, false); - } - + private Conversation conversation; /** * Constructor * - * @param container + * @param application * @param propagation */ - public ConversationPropagator(Application application, CdiContainer container, - IConversationPropagation propagation, boolean auto) + public ConversationPropagator(Application application, IConversationPropagation propagation) { Args.notNull(application, "application"); - Args.notNull(container, "container"); Args.notNull(propagation, "propagation"); if (propagation == ConversationPropagation.NONE) { throw new IllegalArgumentException( - "If propagation is NONE do not set up the propagator"); + "If propagation is NONE do not set up the propagator"); } this.application = application; - this.container = container; this.propagation = propagation; - this.auto = auto; - container.getNonContextualManager().postConstruct(this); + NonContextual.of(ConversationPropagator.class).postConstruct(this); } - private Conversation getConversation(RequestCycle cycle) + public IConversationPropagation getPropagation() { - return Boolean.TRUE.equals(cycle.getMetaData(CONVERSATION_STARTED_KEY)) ? conversation_ - : null; + return propagation; } @Override public void onRequestHandlerResolved(RequestCycle cycle, IRequestHandler handler) { - String cid = cycle.getRequest().getRequestParameters().getParameterValue(CID).toString(); - Page page = getPage(handler); - - if (cid == null && page != null) - { - cid = page.getMetaData(CID_KEY); - } - - Conversation current = getConversation(cycle); - if (current != null && !Objects.isEqual(current.getId(), cid)) - { - logger.info("Conversation {} has expired for {}", cid, page); - throw new ConversationExpiredException(null, cid, page, handler); - } - - activateConversationIfNeeded(cycle, handler, cid); - } - - @Override - public IRequestHandler onException(RequestCycle cycle, Exception ex) - { - // if we are handling a stale page exception then use its conversation since we are most - // likely about to rerender it. - - if (ex instanceof StalePageException) - { - IRequestablePage requestable = ((StalePageException)ex).getPage(); - if (requestable instanceof Page) - { - String cid = container.getConversationMarker((Page)requestable); - if (cid != null) - { - try - { - activateConversationIfNeeded(cycle, null, cid); - return null; - } - catch (ConversationExpiredException e) - { - // ignore, we will start a new one below - } - } - } - } - - activateConversationIfNeeded(cycle, null, null); - return null; - } - - private void activateConversationIfNeeded(RequestCycle cycle, IRequestHandler handler, - String cid) - { - Conversation current = getConversation(cycle); - - if (current != null || !activateForHandler(handler)) + if (activateForHandler(handler)) { - return; - } - - logger.debug("Activating conversation {}", cid); - - try - { - container.activateConversationalContext(cycle, cid); + logger.debug("Activating conversation {}", conversation.getId()); fireOnAfterConversationStarted(cycle); } - catch (NonexistentConversationException e) - { - logger.info("Unable to restore conversation with id {}", cid, e.getMessage()); - logger.debug("Unable to restore conversation", e); - fireOnAfterConversationStarted(cycle); - throw new ConversationExpiredException(e, cid, getPage(handler), handler); - } - - cycle.setMetaData(CONVERSATION_STARTED_KEY, true); } private void fireOnAfterConversationStarted(RequestCycle cycle) { + cycle.setMetaData(CONVERSATION_STARTED_KEY, true); for (IRequestCycleListener listener : application.getRequestCycleListeners()) { if (listener instanceof ICdiAwareRequestCycleListener) @@ -221,93 +125,41 @@ public class ConversationPropagator implements IRequestCycleListener @Override public void onRequestHandlerExecuted(RequestCycle cycle, IRequestHandler handler) { - Conversation conversation = getConversation(cycle); - - if (conversation == null) - { - return; - } - - Page page = getPage(handler); - - if (page == null) - { - return; - } - - // apply auto semantics - - autoEndIfNecessary(page, handler, conversation); - autoBeginIfNecessary(page, handler, conversation); - - if (propagation.propagatesViaPage(page, handler)) - { - // propagate a conversation across non-bookmarkable page instances - setConversationOnPage(conversation, page); - } - } - - @Override - public void onRequestHandlerScheduled(RequestCycle cycle, IRequestHandler handler) - { - // propagate current non-transient conversation to the newly scheduled page - - Conversation conversation = getConversation(cycle); - - if (conversation == null || conversation.isTransient()) - { - return; - } - - Page page = getPage(handler); - if (page != null) + // propagate current non-transient conversation to the newly scheduled + // page + try { - if (propagation.propagatesViaPage(page, handler)) + if (conversation.isTransient()) { - // propagate a conversation across non-bookmarkable page instances - setConversationOnPage(conversation, page); + return; } + } catch (ContextNotActiveException cnax) + { + logger.debug("There is no active context for the requested scope!", cnax); + return; } - if (propagation.propagatesViaParameters(handler)) + if (propagation.propagatesVia(handler, getPage(handler))) { - // propagate cid to a scheduled bookmarkable page - logger.debug( - "Propagating non-transient conversation {} via page parameters of handler {}", - conversation.getId(), handler); + "Propagating non-transient conversation {} via page parameters of handler {}", + conversation.getId(), handler); PageParameters parameters = getPageParameters(handler); if (parameters != null) { parameters.set(CID, conversation.getId()); + markPageWithConversationId(handler, conversation.getId()); } } } - protected void setConversationOnPage(Conversation conversation, Page page) - { - if (conversation == null || conversation.isTransient()) - { - logger.debug("Detaching transient conversation {} via meta of page instance {}", - (conversation == null ? "null" : conversation.getId()), page); - - page.setMetaData(CID_KEY, null); - } - else - { - - logger.debug("Propagating non-transient conversation {} via meta of page instance {}", - conversation.getId(), page); - - page.setMetaData(CID_KEY, conversation.getId()); - } - } @Override public void onUrlMapped(RequestCycle cycle, IRequestHandler handler, Url url) { - // no need to propagate the conversation to packaged resources, they should never change + // no need to propagate the conversation to packaged resources, they + // should never change if (handler instanceof ResourceReferenceRequestHandler) { if (((ResourceReferenceRequestHandler)handler).getResourceReference() instanceof PackageResourceReference) @@ -316,47 +168,41 @@ public class ConversationPropagator implements IRequestCycleListener } } - Conversation conversation = getConversation(cycle); - - if (conversation == null || conversation.isTransient()) + if (conversation.isTransient()) { return; } - if (propagation.propagatesViaParameters(handler)) + if (propagation.propagatesVia(handler, getPage(handler))) { - // propagate cid to bookmarkable pages via urls - logger.debug("Propagating non-transient conversation {} via url", conversation.getId()); - url.setQueryParameter(CID, conversation.getId()); + markPageWithConversationId(handler, conversation.getId()); } } @Override public void onDetach(RequestCycle cycle) { - Conversation conversation = getConversation(cycle); - if (conversation != null) + if (!Boolean.TRUE.equals(cycle.getMetaData(CONVERSATION_STARTED_KEY))) { - logger.debug("Deactivating conversation {}", conversation.getId()); + return; + } - for (IRequestCycleListener listener : application.getRequestCycleListeners()) + logger.debug("Deactivating conversation {}", conversation.getId()); + for (IRequestCycleListener listener : application.getRequestCycleListeners()) + { + if (listener instanceof ICdiAwareRequestCycleListener) { - if (listener instanceof ICdiAwareRequestCycleListener) - { - ((ICdiAwareRequestCycleListener)listener).onBeforeConversationDeactivated(cycle); - } + ((ICdiAwareRequestCycleListener)listener).onBeforeConversationDeactivated(cycle); } - container.deactivateConversationalContext(cycle); - - cycle.setMetaData(CONVERSATION_STARTED_KEY, null); } } /** - * Determines whether or not a conversation should be activated fro the specified handler. This - * method is used to filter out conversation activation for utility handlers such as the + * Determines whether or not a conversation should be activated fro the + * specified handler. This method is used to filter out conversation + * activation for utility handlers such as the * {@link BufferedResponseRequestHandler} * * @param handler @@ -366,71 +212,45 @@ public class ConversationPropagator implements IRequestCycleListener { if (handler != null) { + String handlerClassName = Classes.name(handler.getClass()); + if (handler instanceof BufferedResponseRequestHandler) { // we do not care about pages that are being rendered from a buffer return false; + } else if ("org.apache.wicket.protocol.ws.api.WebSocketMessageBroadcastHandler".equals(handlerClassName)) + { + return false; + } else if ("org.apache.wicket.protocol.ws.api.WebSocketRequestHandler".equals(handlerClassName)) { + // injection is not supported in web sockets communication + return false; } } return true; } - protected void autoBeginIfNecessary(Page page, IRequestHandler handler, - Conversation conversation) + public static void markPageWithConversationId(IRequestHandler handler, String cid) { - if (!auto || conversation == null || !conversation.isTransient() || page == null || - !propagation.propagatesViaPage(page, handler) || !hasConversationalComponent(page)) + Page page = getPage(handler); + if (page != null) { - return; + page.setMetaData(CONVERSATION_ID_KEY, cid); } - - // auto activate conversation - - conversation.begin(); - autoConversation.setAutomatic(true); - - logger.debug("Auto-began conversation {} for page {}", conversation.getId(), page); } - protected void autoEndIfNecessary(Page page, IRequestHandler handler, Conversation conversation) + public static String getConversationIdFromPage(Page page) { - if (!auto || conversation == null || conversation.isTransient() || page == null || - !propagation.propagatesViaPage(page, handler) || hasConversationalComponent(page) || - autoConversation.isAutomatic() == false) - { - return; - } - - // auto de-activate conversation - - String cid = conversation.getId(); - - autoConversation.setAutomatic(false); - conversation.end(); - - logger.debug("Auto-ended conversation {} for page {}", cid, page); + return page.getMetaData(CONVERSATION_ID_KEY); } - - protected boolean hasConversationalComponent(Page page) + public static void removeConversationIdFromPage(Page page) { - Boolean hasConversational = Visits.visit(page, new IVisitor<Component, Boolean>() - { - @Override - public void component(Component object, IVisit<Boolean> visit) - { - if (object instanceof ConversationalComponent) - { - visit.stop(true); - } - } - }); - - return hasConversational == null ? false : hasConversational; + page.setMetaData(CONVERSATION_ID_KEY, null); } /** - * Resolves a page instance from the request handler iff the page instance is already created + * Resolves a page instance from the request handler iff the page instance + * is already created * * @param handler * @return page or {@code null} if none
