aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/src/main/java/com/vaadin/server/DependencyFilter.java2
-rw-r--r--server/src/main/java/com/vaadin/server/ServiceInitEvent.java28
-rw-r--r--server/src/main/java/com/vaadin/server/VaadinService.java32
3 files changed, 47 insertions, 15 deletions
diff --git a/server/src/main/java/com/vaadin/server/DependencyFilter.java b/server/src/main/java/com/vaadin/server/DependencyFilter.java
index 3f82647063..eeccb5528c 100644
--- a/server/src/main/java/com/vaadin/server/DependencyFilter.java
+++ b/server/src/main/java/com/vaadin/server/DependencyFilter.java
@@ -27,6 +27,8 @@ import com.vaadin.ui.Dependency;
* Filter for dependencies loaded using {@link StyleSheet @StyleSheet},
* {@link JavaScript @JavaScript} and {@link HtmlImport @HtmlImport}.
*
+ * @see ServiceInitEvent#addDependencyFilter(DependencyFilter)
+ *
* @since 8.1
*/
@FunctionalInterface
diff --git a/server/src/main/java/com/vaadin/server/ServiceInitEvent.java b/server/src/main/java/com/vaadin/server/ServiceInitEvent.java
index 0eb5b18cff..482c23dd23 100644
--- a/server/src/main/java/com/vaadin/server/ServiceInitEvent.java
+++ b/server/src/main/java/com/vaadin/server/ServiceInitEvent.java
@@ -34,6 +34,7 @@ import java.util.Objects;
public class ServiceInitEvent extends EventObject {
private List<RequestHandler> addedRequestHandlers = new ArrayList<>();
+ private List<DependencyFilter> addedDependencyFilters = new ArrayList<>();
/**
* Creates a new service init event for a given {@link VaadinService} and
@@ -71,6 +72,33 @@ public class ServiceInitEvent extends EventObject {
return Collections.unmodifiableList(addedRequestHandlers);
}
+ /**
+ * Adds a new dependency filter that will be used by this service.
+ *
+ * @param dependencyFilter
+ * the dependency filter to add, not <code>null</code>
+ *
+ * @since 8.1
+ */
+ public void addDependencyFilter(DependencyFilter dependencyFilter) {
+ Objects.requireNonNull(dependencyFilter,
+ "Dependency filter cannot be null");
+
+ addedDependencyFilters.add(dependencyFilter);
+ }
+
+ /**
+ * Gets an unmodifiable list of all dependency filters that have been added
+ * for the service.
+ *
+ * @return the current list of added dependency filters.
+ *
+ * @since 8.1
+ */
+ public List<DependencyFilter> getAddedDependencyFilters() {
+ return Collections.unmodifiableList(addedDependencyFilters);
+ }
+
@Override
public VaadinService getSource() {
return (VaadinService) super.getSource();
diff --git a/server/src/main/java/com/vaadin/server/VaadinService.java b/server/src/main/java/com/vaadin/server/VaadinService.java
index e05b935929..649826a5d6 100644
--- a/server/src/main/java/com/vaadin/server/VaadinService.java
+++ b/server/src/main/java/com/vaadin/server/VaadinService.java
@@ -207,8 +207,8 @@ public abstract class VaadinService implements Serializable {
requestHandlers = Collections.unmodifiableCollection(handlers);
- dependencyFilters = Collections
- .unmodifiableCollection(createDependencyFilters());
+ dependencyFilters = Collections.unmodifiableCollection(
+ initDependencyFilters(event.getAddedDependencyFilters()));
initialized = true;
}
@@ -1444,41 +1444,43 @@ public abstract class VaadinService implements Serializable {
}
/**
- * Constructs the list of resource dependency filters to use for the
+ * Updates the list of resource dependency filters to use for the
* application.
* <p>
* The filters can freely update the dependencies in any way they see fit
* (bundle, rewrite, merge).
* <p>
- * By default all filters found using the service loader are added to the
- * list.
+ * The framework collects filters from the {@link SessionInitEvent} where
+ * session init listeners can add them. This method is called with the
+ * combined list to optionally modify it, and the result is then stored
+ * by the caller as the final list to use.
* <p>
- * The filters are called in the order the service loader returns the
- * filters, which is undefined. If you need a specific order, you can
+ * The filters are called in the order the session init listeners are
+ * called, which is undefined. If you need a specific order, you can
* override this method and alter the order.
*
* @since 8.1
+ * @param sessionInitFilters
+ * a list of dependency filters collected from the session init
+ * event
* @return the list of dependency filters to use for filtering resources,
* not null
* @throws ServiceException
* if something went wrong while determining the filters
*
*/
- protected List<DependencyFilter> createDependencyFilters()
- throws ServiceException {
- ArrayList<DependencyFilter> filters = new ArrayList<>();
- ServiceLoader<DependencyFilter> loader = ServiceLoader
- .load(DependencyFilter.class, getClassLoader());
- loader.iterator().forEachRemaining(filters::add);
+ protected List<DependencyFilter> initDependencyFilters(
+ List<DependencyFilter> sessionInitFilters) throws ServiceException {
+ assert sessionInitFilters != null;
- return filters;
+ return sessionInitFilters;
}
/**
* Gets the filters which all resource dependencies are passed through
* before being sent to the client for loading.
*
- * @see #createDependencyFilters()
+ * @see #initDependencyFilters()
*
* @since 8.1
* @return the dependency filters to pass resources dependencies through