WICKET-5415 Do not initialize pages which were not rendered WICKET-5387 Page#onInitialize called after an exception in the constructor of Page
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/86a34bfc Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/86a34bfc Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/86a34bfc Branch: refs/heads/wicket-cdi-1.1-rewrite Commit: 86a34bfc03c3ae6bb56e1e23453fdead603ec7ab Parents: 4b43ba6 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Fri Nov 15 11:11:11 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Fri Nov 15 11:11:51 2013 +0200 ---------------------------------------------------------------------- .../src/main/java/org/apache/wicket/Page.java | 15 +++- .../wicket/dontstoreunrendered/BasePage.html | 15 ++++ .../wicket/dontstoreunrendered/BasePage.java | 40 ++++++++++ .../DontStoreNotRenderedPageTest.java | 84 ++++++++++++++++++++ .../wicket/dontstoreunrendered/PageA.html | 15 ++++ .../wicket/dontstoreunrendered/PageA.java | 28 +++++++ .../wicket/dontstoreunrendered/PageB.java | 50 ++++++++++++ .../wicket/dontstoreunrendered/PageC.java | 24 ++++++ 8 files changed, 270 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/main/java/org/apache/wicket/Page.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/Page.java b/wicket-core/src/main/java/org/apache/wicket/Page.java index 1c811aa..87d32bc 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Page.java +++ b/wicket-core/src/main/java/org/apache/wicket/Page.java @@ -284,10 +284,23 @@ public abstract class Page extends MarkupContainer implements IRedirectListener, { setFlag(FLAG_IS_DIRTY, true); setNextAvailableId(); - pageManager.touchPage(this); + + if (isInitialization == false) + { + pageManager.touchPage(this); + } } } + @Override + protected void onInitialize() + { + super.onInitialize(); + + final IPageManager pageManager = getSession().getPageManager(); + pageManager.touchPage(this); + } + /** * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT CALL. * http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.html b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.html new file mode 100644 index 0000000..1ce3521 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html xmlns:wicket="http://wicket.apache.org"> + <head> + <meta charset="utf-8" /> + <title>Apache Wicket Quickstart</title> + <link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' /> + <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" /> + </head> + <body> + <div id="bd"> + Class name: <span wicket:id="className"></span> + <wicket:child/> + </div> + </body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.java b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.java new file mode 100644 index 0000000..23d16b5 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/BasePage.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.dontstoreunrendered; + +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.model.AbstractReadOnlyModel; + +/** + * A base page that provides the markup for PageA, PageB and PageC + */ +class BasePage extends WebPage { + private static final long serialVersionUID = 1L; + + public BasePage() { + + add(new Label("className", new AbstractReadOnlyModel<String>() { + + @Override + public String getObject() + { + return getPageClass().getSimpleName(); + } + })); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTest.java b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTest.java new file mode 100644 index 0000000..e1adb12 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/DontStoreNotRenderedPageTest.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.dontstoreunrendered; + +import org.apache.wicket.IPageManagerProvider; +import org.apache.wicket.WicketTestCase; +import org.apache.wicket.mock.MockPageManager; +import org.apache.wicket.page.IManageablePage; +import org.apache.wicket.page.IPageManager; +import org.apache.wicket.page.IPageManagerContext; +import org.apache.wicket.protocol.http.WebApplication; +import org.apache.wicket.util.tester.WicketTester; +import org.junit.Assert; +import org.junit.Test; + +/** + * https://issues.apache.org/jira/browse/WICKET-5415 + */ +public class DontStoreNotRenderedPageTest extends WicketTestCase +{ + @Override + protected WicketTester newWicketTester(WebApplication app) + { + return new WicketTester(app) + { + @Override + protected IPageManagerProvider newTestPageManagerProvider() + { + return new IPageManagerProvider() + { + @Override + public IPageManager get(IPageManagerContext context) + { + return new MockPageManager() + { + @Override + public void touchPage(IManageablePage page) + { + Assert.assertFalse("PageB should not be touched!", page instanceof PageB); + super.touchPage(page); + } + }; + } + }; + } + }; + } + + /** + * Start with PageA. + * Then click a link to go to PageB. + * PageB throws a RestartResponseException(PageC) in its constructor, so + * it shouldn't be neither initialized nor rendered. + * PageC is rendered. + * + * Verifies that PageB is not initialized, rendered and stored by PageManager + */ + @Test + public void dontStoreNotRenderedPage() + { + tester.startPage(PageA.class); + tester.clickLink("goToB"); + + tester.assertRenderedPage(PageC.class); + + assertFalse(PageB.PAGE_B_RENDERED.get()); + assertFalse(PageB.PAGE_B_INITIALIZED.get()); + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.html ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.html b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.html new file mode 100644 index 0000000..c18127f --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html xmlns:wicket="http://wicket.apache.org"> + <head> + <meta charset="utf-8" /> + <title>Apache Wicket Quickstart</title> + <link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' /> + <link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" /> + </head> + <body> + <wicket:extend> + <br/> + <a wicket:id="goToB">Go to PageB</a> + </wicket:extend> + </body> +</html> http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.java b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.java new file mode 100644 index 0000000..86184b7 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageA.java @@ -0,0 +1,28 @@ +/* + * 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.dontstoreunrendered; + +import org.apache.wicket.markup.html.link.BookmarkablePageLink; + +public class PageA extends BasePage { + + public PageA() { + super(); + + add(new BookmarkablePageLink<Void>("goToB", PageB.class)); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageB.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageB.java b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageB.java new file mode 100644 index 0000000..f4eb63c --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageB.java @@ -0,0 +1,50 @@ +/* + * 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.dontstoreunrendered; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.wicket.RestartResponseException; + +/** + * + */ +public class PageB extends BasePage { + + static final AtomicBoolean PAGE_B_INITIALIZED = new AtomicBoolean(false); + static final AtomicBoolean PAGE_B_RENDERED = new AtomicBoolean(false); + + public PageB() { + super(); + + throw new RestartResponseException(PageC.class); + } + + @Override + protected void onInitialize() + { + super.onInitialize(); + PAGE_B_INITIALIZED.set(true); + } + + @Override + public void renderPage() + { + super.renderPage(); + PAGE_B_RENDERED.set(true); + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/86a34bfc/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageC.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageC.java b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageC.java new file mode 100644 index 0000000..ec60816 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/dontstoreunrendered/PageC.java @@ -0,0 +1,24 @@ +/* + * 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.dontstoreunrendered; + +public class PageC extends BasePage { + + public PageC() { + super(); + } +}
