You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pa...@apache.org on 2020/01/16 08:20:11 UTC

[wicket] branch master updated (364c89b -> 10774e6)

This is an automated email from the ASF dual-hosted git repository.

papegaaij pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git.


    from 364c89b  Start next development version
     new 7546cb1  WICKET-6723: move to Jakarta APIs, keep servlet at 3.1.0 for now
     new 10774e6  WICKET-6729: Add a new API for managing IHeaderResponseDecorators

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 pom.xml                                            | 60 ++++++++-----
 wicket-bean-validation/pom.xml                     |  8 +-
 wicket-cdi/pom.xml                                 | 38 ++-------
 .../main/java/org/apache/wicket/Application.java   | 37 +++++---
 .../html/HeaderResponseDecoratorCollection.java    | 98 ++++++++++++++++++++++
 .../head/filter/FilteringHeaderResponseTest.java   | 28 +++----
 .../markup/html/DecoratingHeaderResponseTest.java  | 32 ++++---
 wicket-examples/pom.xml                            | 29 +++----
 .../apache/wicket/examples/csp/CspApplication.java |  2 +-
 .../ResourceDecorationApplication.java             | 12 ++-
 .../apache/wicket/examples/sri/SriApplication.java |  2 +-
 .../wicket-native-websocket-javax/pom.xml          |  8 +-
 12 files changed, 222 insertions(+), 132 deletions(-)
 create mode 100644 wicket-core/src/main/java/org/apache/wicket/markup/html/HeaderResponseDecoratorCollection.java


[wicket] 01/02: WICKET-6723: move to Jakarta APIs, keep servlet at 3.1.0 for now

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

papegaaij pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit 7546cb114d2bedffdecb8929d5fcc5d54f732929
Author: Emond Papegaaij <em...@topicus.nl>
AuthorDate: Fri Jan 10 14:21:30 2020 +0100

    WICKET-6723: move to Jakarta APIs, keep servlet at 3.1.0 for now
---
 pom.xml                                            | 60 +++++++++++++---------
 wicket-bean-validation/pom.xml                     |  8 +--
 wicket-cdi/pom.xml                                 | 38 +++-----------
 wicket-examples/pom.xml                            | 29 +++++------
 .../wicket-native-websocket-javax/pom.xml          |  8 +--
 5 files changed, 64 insertions(+), 79 deletions(-)

diff --git a/pom.xml b/pom.xml
index c7cfa63..9c010b9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,10 +146,14 @@
 		<forbiddenapis.version>2.6</forbiddenapis.version>
 		<jacoco.version>0.8.2</jacoco.version>
 		<jackson.version>2.9.10.1</jackson.version>
-		<javax.el.version>3.0.1-b11</javax.el.version>
-		<javax.el-api.version>3.0.1-b06</javax.el-api.version>
-		<javax.servlet.jsp-api.version>2.3.3</javax.servlet.jsp-api.version>
-		<javax.websocket-api.version>1.1</javax.websocket-api.version>
+		<jakarta.annotation-api.version>1.3.5</jakarta.annotation-api.version>
+		<jakarta.el.version>3.0.3</jakarta.el.version>
+		<jakarta.el-api.version>3.0.3</jakarta.el-api.version>
+		<jakarta.enterprise.cdi-api.version>2.0.2</jakarta.enterprise.cdi-api.version>
+		<jakarta.servlet.jsp-api.version>2.3.6</jakarta.servlet.jsp-api.version>
+		<jakarta.validation-api.version>2.0.2</jakarta.validation-api.version>
+		<jakarta.websocket-api.version>1.1.2</jakarta.websocket-api.version>
+		<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
 		<jdk-serializable-functional.version>1.9.0</jdk-serializable-functional.version>
 		<jetty.version>9.4.21.v20190926</jetty.version>
 		<junit.version>5.5.2</junit.version>
@@ -162,12 +166,10 @@
 		<mockito.version>3.1.0</mockito.version>
 		<objenesis.version>3.0.1</objenesis.version>
 		<openjson.version>1.0.11</openjson.version>
-		<servlet-api.version>3.1.0</servlet-api.version>
 		<slf4j.version>1.7.25</slf4j.version>
 		<spring.version>5.2.0.RELEASE</spring.version>
 		<wagon-ssh-external.version>3.3.2</wagon-ssh-external.version>
 		<weld.version>3.1.1.Final</weld.version>
-		<validation-api.version>2.0.1.Final</validation-api.version>
 		<velocity.version>2.1</velocity.version>
 
 		<!-- Maven plugins -->
@@ -205,33 +207,45 @@
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
-				<groupId>javax.el</groupId>
-				<artifactId>javax.el-api</artifactId>
-				<version>${javax.el-api.version}</version>
+				<groupId>jakarta.annotation</groupId>
+				<artifactId>jakarta.annotation-api</artifactId>
+				<version>${jakarta.annotation-api.version}</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
-				<groupId>javax.servlet</groupId>
-				<artifactId>javax.servlet-api</artifactId>
-				<version>${servlet-api.version}</version>
+				<groupId>jakarta.el</groupId>
+				<artifactId>jakarta.el-api</artifactId>
+				<version>${jakarta.el-api.version}</version>
+				<scope>provided</scope>
+			</dependency>
+			<dependency>
+				<groupId>jakarta.enterprise</groupId>
+				<artifactId>jakarta.enterprise.cdi-api</artifactId>
+				<version>${jakarta.enterprise.cdi-api.version}</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
-				<groupId>javax.servlet.jsp</groupId>
-				<artifactId>javax.servlet.jsp-api</artifactId>
-				<version>${javax.servlet.jsp-api.version}</version>
+				<groupId>jakarta.servlet.jsp</groupId>
+				<artifactId>jakarta.servlet.jsp-api</artifactId>
+				<version>${jakarta.servlet.jsp-api.version}</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
-				<groupId>javax.validation</groupId>
-				<artifactId>validation-api</artifactId>
-				<version>${validation-api.version}</version>
+				<groupId>jakarta.validation</groupId>
+				<artifactId>jakarta.validation-api</artifactId>
+				<version>${jakarta.validation-api.version}</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
-				<groupId>javax.websocket</groupId>
-				<artifactId>javax.websocket-api</artifactId>
-				<version>${javax.websocket-api.version}</version>
+				<groupId>jakarta.websocket</groupId>
+				<artifactId>jakarta.websocket-api</artifactId>
+				<version>${jakarta.websocket-api.version}</version>
+				<scope>provided</scope>
+			</dependency>
+			<dependency>
+				<groupId>javax.servlet</groupId>
+				<artifactId>javax.servlet-api</artifactId>
+				<version>${javax.servlet-api.version}</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
@@ -590,8 +604,8 @@
 			</dependency>
 			<dependency>
 				<groupId>org.glassfish</groupId>
-				<artifactId>javax.el</artifactId>
-				<version>${javax.el.version}</version>
+				<artifactId>jakarta.el</artifactId>
+				<version>${jakarta.el.version}</version>
 				<scope>test</scope>
 			</dependency>
 			<dependency>
diff --git a/wicket-bean-validation/pom.xml b/wicket-bean-validation/pom.xml
index 0e1d64b..35d490a 100644
--- a/wicket-bean-validation/pom.xml
+++ b/wicket-bean-validation/pom.xml
@@ -17,12 +17,12 @@
 
 	<dependencies>
 		<dependency>
-			<groupId>javax.el</groupId>
-			<artifactId>javax.el-api</artifactId>
+			<groupId>jakarta.el</groupId>
+			<artifactId>jakarta.el-api</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>javax.validation</groupId>
-			<artifactId>validation-api</artifactId>
+			<groupId>jakarta.validation</groupId>
+			<artifactId>jakarta.validation-api</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
diff --git a/wicket-cdi/pom.xml b/wicket-cdi/pom.xml
index 959fd65..f05a762 100644
--- a/wicket-cdi/pom.xml
+++ b/wicket-cdi/pom.xml
@@ -37,21 +37,14 @@
 		<automatic-module-name>org.apache.wicket.cdi</automatic-module-name>
 	</properties>
 
-	<dependencyManagement>
-		<dependencies>
-			<!-- local management because we can only define one GAV in the parent -->
-			<dependency>
-				<groupId>javax.enterprise</groupId>
-				<artifactId>cdi-api</artifactId>
-				<version>2.0.SP1</version>
-				<scope>provided</scope>
-			</dependency>
-		</dependencies>
-	</dependencyManagement>
 	<dependencies>
 		<dependency>
-			<groupId>javax.enterprise</groupId>
-			<artifactId>cdi-api</artifactId>
+			<groupId>jakarta.annotation</groupId>
+			<artifactId>jakarta.annotation-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>jakarta.enterprise</groupId>
+			<artifactId>jakarta.enterprise.cdi-api</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
@@ -60,25 +53,8 @@
 		<dependency>
 			<groupId>org.jboss.weld.module</groupId>
 			<artifactId>weld-web</artifactId>
+			<scope>test</scope>
 		</dependency>
-		<!-- SUPPORT FOR JAVA 12 BUILD START -->
-		<dependency>
-			<groupId>org.jboss.weld</groupId>
-			<artifactId>weld-core-impl</artifactId>
-			<version>${weld.version}</version>
-			<exclusions>
-				<exclusion>
-					<groupId>org.jboss.classfilewriter</groupId>
-					<artifactId>jboss-classfilewriter</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>org.jboss.classfilewriter</groupId>
-			<artifactId>jboss-classfilewriter</artifactId>
-			<version>1.2.4.Final</version>
-		</dependency>
-		<!-- SUPPORT FOR JAVA 12 BUILD END -->
 		<dependency>
 			<groupId>org.jboss.weld.se</groupId>
 			<artifactId>weld-se-core</artifactId>
diff --git a/wicket-examples/pom.xml b/wicket-examples/pom.xml
index f8fc208..ac66c9a 100644
--- a/wicket-examples/pom.xml
+++ b/wicket-examples/pom.xml
@@ -48,11 +48,6 @@
 				<version>1.0</version>
 			</dependency>
 			<dependency>
-				<groupId>javax.validation</groupId>
-				<artifactId>validation-api</artifactId>
-				<version>2.0.0.Final</version>
-			</dependency>
-			<dependency>
 				<groupId>org.codelibs</groupId>
 				<artifactId>jhighlight</artifactId>
 				<version>1.0.3</version>
@@ -61,16 +56,16 @@
 	</dependencyManagement>
 	<dependencies>
 		<dependency>
-			<groupId>javax.el</groupId>
-			<artifactId>javax.el-api</artifactId>
+			<groupId>jakarta.el</groupId>
+			<artifactId>jakarta.el-api</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>javax.servlet-api</artifactId>
+			<groupId>jakarta.servlet.jsp</groupId>
+			<artifactId>jakarta.servlet.jsp-api</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>javax.servlet.jsp</groupId>
-			<artifactId>javax.servlet.jsp-api</artifactId>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>com.github.axet</groupId>
@@ -81,8 +76,8 @@
 			<artifactId>cage</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>javax.validation</groupId>
-			<artifactId>validation-api</artifactId>
+			<groupId>jakarta.validation</groupId>
+			<artifactId>jakarta.validation-api</artifactId>
 			<scope>compile</scope>
 		</dependency>
 		<dependency>
@@ -178,7 +173,7 @@
 		</dependency>
 		<dependency>
 			<groupId>org.glassfish</groupId>
-			<artifactId>javax.el</artifactId>
+			<artifactId>jakarta.el</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.httpunit</groupId>
@@ -272,9 +267,9 @@
 					<version>${jetty.version}</version>
 					<dependencies>
 						<dependency>
-							<groupId>javax.validation</groupId>
-							<artifactId>validation-api</artifactId>
-							<version>1.1.0.Final</version>
+							<groupId>jakarta.validation</groupId>
+							<artifactId>jakarta.validation-api</artifactId>
+							<version>${jakarta.validation-api.version}</version>
 						</dependency>
 					</dependencies>
 				</plugin>
diff --git a/wicket-native-websocket/wicket-native-websocket-javax/pom.xml b/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
index c2be9a8..babad18 100644
--- a/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
+++ b/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
@@ -34,12 +34,12 @@
 
 	<dependencies>
 		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>javax.servlet-api</artifactId>
+			<groupId>jakarta.websocket</groupId>
+			<artifactId>jakarta.websocket-api</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>javax.websocket</groupId>
-			<artifactId>javax.websocket-api</artifactId>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>


[wicket] 02/02: WICKET-6729: Add a new API for managing IHeaderResponseDecorators

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

papegaaij pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit 10774e6c71e16d8ef7bf2ce9ce9cdaf0b16d4625
Author: Emond Papegaaij <em...@topicus.nl>
AuthorDate: Wed Jan 15 21:26:55 2020 +0100

    WICKET-6729: Add a new API for managing IHeaderResponseDecorators
---
 .../main/java/org/apache/wicket/Application.java   | 37 +++++---
 .../html/HeaderResponseDecoratorCollection.java    | 98 ++++++++++++++++++++++
 .../head/filter/FilteringHeaderResponseTest.java   | 28 +++----
 .../markup/html/DecoratingHeaderResponseTest.java  | 32 ++++---
 .../apache/wicket/examples/csp/CspApplication.java |  2 +-
 .../ResourceDecorationApplication.java             | 12 ++-
 .../apache/wicket/examples/sri/SriApplication.java |  2 +-
 7 files changed, 158 insertions(+), 53 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java b/wicket-core/src/main/java/org/apache/wicket/Application.java
index d9b726a..af2632d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Application.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
@@ -44,6 +44,7 @@ import org.apache.wicket.markup.MarkupFactory;
 import org.apache.wicket.markup.head.HeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.ResourceAggregator;
+import org.apache.wicket.markup.html.HeaderResponseDecoratorCollection;
 import org.apache.wicket.markup.html.IHeaderContributor;
 import org.apache.wicket.markup.html.IHeaderResponseDecorator;
 import org.apache.wicket.markup.html.image.resource.DefaultButtonImageResourceFactory;
@@ -184,9 +185,8 @@ public abstract class Application implements UnboundListener, IEventSink, IMetad
 	/**
 	 * The decorator this application uses to decorate any header responses created by Wicket
 	 */
-	private IHeaderResponseDecorator headerResponseDecorator = (headerresponse) -> {
-		return new ResourceAggregator(headerresponse);
-	};
+	private HeaderResponseDecoratorCollection headerResponseDecorators =
+		new HeaderResponseDecoratorCollection();
 
 	/**
 	 * Checks if the <code>Application</code> threadlocal is set in this thread
@@ -1585,22 +1585,37 @@ public abstract class Application implements UnboundListener, IEventSink, IMetad
 	 * Sets an {@link IHeaderResponseDecorator} that you want your application to use to decorate
 	 * header responses.
 	 * <p>
-	 * Calling this method replaces the default decorator, which utilizes a {@link ResourceAggregator}:
-	 * The given implementation should make sure, that it too wraps responses in a {@link ResourceAggregator},
-	 * otherwise no dependencies for {@link HeaderItem}s will be resolved.   
+	 * Calling this method replaces the default decorator, which utilizes a
+	 * {@link ResourceAggregator}: The given implementation should make sure, that it too wraps
+	 * responses in a {@link ResourceAggregator}, otherwise no dependencies for {@link HeaderItem}s
+	 * will be resolved.
 	 * 
 	 * @param headerResponseDecorator
 	 *            your custom decorator, must not be null
+	 * @deprecated use {@code add(...)} on {@link #getHeaderResponseDecorators()}. This method
+	 *             removes the {@link ResourceAggregator}, which is needed to resolve resource
+	 *             dependencies.
 	 */
-	public final Application setHeaderResponseDecorator(final IHeaderResponseDecorator headerResponseDecorator)
+	@Deprecated
+	public final Application
+			setHeaderResponseDecorator(final IHeaderResponseDecorator headerResponseDecorator)
 	{
-		Args.notNull(headerResponseDecorator, "headerResponseDecorator");
-		
-		this.headerResponseDecorator = headerResponseDecorator;
+		headerResponseDecorators.replaceAll(headerResponseDecorator);
 		return this;
 	}
 
 	/**
+	 * Returns the {@link HeaderResponseDecoratorCollection} used by this application. On this
+	 * collection you can add additional decorators, which will be nested in the order added.
+	 * 
+	 * @return The {@link HeaderResponseDecoratorCollection} used by this application.
+	 */
+	public HeaderResponseDecoratorCollection getHeaderResponseDecorators()
+	{
+		return headerResponseDecorators;
+	}
+	
+	/**
 	 * INTERNAL METHOD - You shouldn't need to call this. This is called every time Wicket creates
 	 * an IHeaderResponse. It gives you the ability to incrementally add features to an
 	 * IHeaderResponse implementation by wrapping it in another implementation.
@@ -1615,7 +1630,7 @@ public abstract class Application implements UnboundListener, IEventSink, IMetad
 	 */
 	public final IHeaderResponse decorateHeaderResponse(final IHeaderResponse response)
 	{
-		return headerResponseDecorator.decorate(response);
+		return headerResponseDecorators.decorate(response);
 	}
 
 	/**
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/HeaderResponseDecoratorCollection.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/HeaderResponseDecoratorCollection.java
new file mode 100644
index 0000000..ce71f8b
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/HeaderResponseDecoratorCollection.java
@@ -0,0 +1,98 @@
+/*
+ * 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.markup.html;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.ResourceAggregator;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A collection of {@link IHeaderResponseDecorator}s. The decorators will be nested oldest on the
+ * inside, newest on the outside. By default {@link ResourceAggregator} is already registered.
+ * 
+ * @author Emond Papegaaij
+ */
+public class HeaderResponseDecoratorCollection implements IHeaderResponseDecorator
+{
+	private final List<IHeaderResponseDecorator> decorators = new CopyOnWriteArrayList<>();
+
+	public HeaderResponseDecoratorCollection()
+	{
+		decorators.add(response -> new ResourceAggregator(response));
+	}
+
+	/**
+	 * Adds a new {@link IHeaderResponseDecorator} that will be invoked prior to all already
+	 * registered decorators. That means, the first to be added will be wrapped by a
+	 * {@link ResourceAggregator} like this: {@code new ResourceAggregator(first)}. The second will
+	 * be wrapped by the first and the aggregator: {@code new ResourceAggregator(first(second))}.
+	 * 
+	 * @param decorator
+	 *            The decorator to add, cannot be null.
+	 * @return {@code this} for chaining.
+	 */
+	public HeaderResponseDecoratorCollection add(IHeaderResponseDecorator decorator)
+	{
+		Args.notNull(decorator, "decorator");
+		decorators.add(0, decorator);
+		return this;
+	}
+
+	/**
+	 * Adds a new {@link IHeaderResponseDecorator} that will be invoked after all already registered
+	 * decorators.
+	 * 
+	 * @param decorator
+	 *            The decorator to add, cannot be null.
+	 * @return {@code this} for chaining.
+	 */
+	public HeaderResponseDecoratorCollection
+			addPostProcessingDecorator(IHeaderResponseDecorator decorator)
+	{
+		Args.notNull(decorator, "decorator");
+		decorators.add(decorator);
+		return this;
+	}
+
+	/**
+	 * Replaces all registered {@link IHeaderResponseDecorator}s with the given decorator. This also
+	 * removes the {@link ResourceAggregator}, which is required to render resource dependencies.
+	 * 
+	 * @param decorator
+	 *            The decorator to add, cannot be null.
+	 * @return {@code this} for chaining.
+	 */
+	public HeaderResponseDecoratorCollection replaceAll(IHeaderResponseDecorator decorator)
+	{
+		Args.notNull(decorator, "decorator");
+		decorators.clear();
+		decorators.add(decorator);
+		return this;
+	}
+
+	@Override
+	public IHeaderResponse decorate(IHeaderResponse response)
+	{
+		IHeaderResponse ret = response;
+		for (IHeaderResponseDecorator curDecorator : decorators)
+			ret = curDecorator.decorate(ret);
+		return ret;
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java
index 70ea9d8..63bbadf 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/FilteringHeaderResponseTest.java
@@ -41,17 +41,11 @@ class FilteringHeaderResponseTest extends WicketTestCase
 	@Test
 	void footerDependsOnHeadItem() throws Exception
 	{
-		tester.getApplication().setHeaderResponseDecorator(new IHeaderResponseDecorator()
-		{
-			@Override
-			public IHeaderResponse decorate(IHeaderResponse response)
-			{
-				// use this header resource decorator to load all JavaScript resources in the page
-				// footer (after </body>)
-				return new ResourceAggregator(
-					new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS"));
-			}
-		});
+		// use this header resource decorator to load all JavaScript resources in the page
+		// footer (after </body>)
+		tester.getApplication()
+			.getHeaderResponseDecorators()
+			.add(response -> new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS"));
 		executeTest(FilteredHeaderPage.class, "FilteredHeaderPageExpected.html");
 	}
 
@@ -90,19 +84,21 @@ class FilteringHeaderResponseTest extends WicketTestCase
 	@Test
 	void deferred() throws Exception
 	{
-		tester.getApplication().setHeaderResponseDecorator(
-			response -> new ResourceAggregator(new JavaScriptDeferHeaderResponse(response)));
+		tester.getApplication()
+			.getHeaderResponseDecorators()
+			.add(response -> new JavaScriptDeferHeaderResponse(response));
 		executeTest(DeferredPage.class, "DeferredPageExpected.html");
 	}
-	
+
 	/**
 	 * WICKET-6682
 	 */
 	@Test
 	void nonce() throws Exception
 	{
-		tester.getApplication().setHeaderResponseDecorator(
-			response -> new ResourceAggregator(new CspNonceHeaderResponse(response, "NONCE")));
+		tester.getApplication()
+			.getHeaderResponseDecorators()
+			.add(response -> new CspNonceHeaderResponse(response, "NONCE"));
 		executeTest(CspNoncePage.class, "CspNoncePageExpected.html");
 	}
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java
index 65eb1ca..f166d41 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/DecoratingHeaderResponseTest.java
@@ -55,27 +55,25 @@ class DecoratingHeaderResponseTest extends WicketTestCase
 	void decoratedStringPrepend() throws IOException, ResourceStreamNotFoundException,
 		ParseException
 	{
-		tester.getApplication().setHeaderResponseDecorator(new IHeaderResponseDecorator()
-		{
-			@Override
-			public IHeaderResponse decorate(IHeaderResponse response)
+		tester.getApplication()
+			.getHeaderResponseDecorators()
+			.add(response -> new DecoratingHeaderResponse(response)
 			{
-				return new ResourceAggregator(new DecoratingHeaderResponse(response)
+				@Override
+				public void render(HeaderItem item)
 				{
-					@Override
-					public void render(HeaderItem item)
+					if (item instanceof JavaScriptReferenceHeaderItem)
 					{
-						if (item instanceof JavaScriptReferenceHeaderItem)
-						{
-							JavaScriptReferenceHeaderItem original = (JavaScriptReferenceHeaderItem)item;
-							item = JavaScriptHeaderItem.forReference(new PackageResourceReference(
-								"DECORATED-" + original.getReference().getName()), original.getId());
-						}
-						super.render(item);
+						JavaScriptReferenceHeaderItem original =
+							(JavaScriptReferenceHeaderItem) item;
+						item = JavaScriptHeaderItem.forReference(
+							new PackageResourceReference(
+								"DECORATED-" + original.getReference().getName()),
+							original.getId());
 					}
-				});
-			}
-		});
+					super.render(item);
+				}
+			});
 		tester.startPage(TestPage.class);
 		XmlPullParser parser = new XmlPullParser();
 		parser.parse(tester.getLastResponseAsString());
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/CspApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/CspApplication.java
index b4b8341..e8eff7e 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/CspApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/CspApplication.java
@@ -45,7 +45,7 @@ public class CspApplication extends WicketExampleApplication
 	{
 		super.init();
 
-		setHeaderResponseDecorator(response -> new ResourceAggregator(new CspNonceHeaderResponse(response, getNonce())));
+		getHeaderResponseDecorators().add(response -> new CspNonceHeaderResponse(response, getNonce()));
 		
 		mountPage("noncedemo", NonceDemoPage.class);
 	}
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java
index b8b45e9..1fddce4 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/resourcedecoration/ResourceDecorationApplication.java
@@ -17,7 +17,6 @@
 package org.apache.wicket.examples.resourcedecoration;
 
 import org.apache.wicket.Application;
-import org.apache.wicket.markup.head.ResourceAggregator;
 import org.apache.wicket.markup.head.filter.JavaScriptFilteredIntoFooterHeaderResponse;
 import org.apache.wicket.markup.html.IHeaderResponseDecorator;
 import org.apache.wicket.protocol.http.WebApplication;
@@ -28,7 +27,7 @@ import org.apache.wicket.request.resource.CssResourceReference;
  * 
  * <p>
  * The key is to register a custom {@link IHeaderResponseDecorator} via
- * {@link Application#setHeaderResponseDecorator(IHeaderResponseDecorator)} that will intercept all
+ * {@link Application#getHeaderResponseDecorators()} that will intercept all
  * resource contributions.
  * 
  * @author jthomerson
@@ -44,11 +43,10 @@ public class ResourceDecorationApplication extends WebApplication
 			new CssResourceReference(HomePage.class, "footer.css"),
 			new CssResourceReference(HomePage.class, "header.css"));
 
-		setHeaderResponseDecorator(response -> {
-			// use this header resource decorator to load all JavaScript resources in the page
-			// footer (after </body>)
-			return new ResourceAggregator(new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS"));
-		});
+		// use this header resource decorator to load all JavaScript resources in the page
+		// footer (after </body>)
+		getHeaderResponseDecorators()
+				.add(response -> new JavaScriptFilteredIntoFooterHeaderResponse(response, "footerJS"));
 	}
 
 	@Override
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/sri/SriApplication.java b/wicket-examples/src/main/java/org/apache/wicket/examples/sri/SriApplication.java
index 8b9a4f4..6221e60 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/sri/SriApplication.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/sri/SriApplication.java
@@ -35,7 +35,7 @@ public class SriApplication extends WicketExampleApplication
 	{
 		super.init();
 
-		setHeaderResponseDecorator(response -> new ResourceAggregator(integrity.wrap(response)));
+		getHeaderResponseDecorators().add(integrity::wrap);
 
 		mountPage("integritydemo", IntegrityDemoPage.class);
 	}