From ecc08daa2dd48f1b9c5bb229e82f3dd7747740a6 Mon Sep 17 00:00:00 2001 From: Andreas Kohn Date: Mon, 30 Dec 2013 17:57:38 +0100 Subject: [PATCH] Call #deregisterServiceProvider() outside of the iteration over the existing service providers --- .../servlet/image/IIOProviderContextListener.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/servlet/src/main/java/com/twelvemonkeys/servlet/image/IIOProviderContextListener.java b/servlet/src/main/java/com/twelvemonkeys/servlet/image/IIOProviderContextListener.java index 8a30e8ba..f3032d3e 100644 --- a/servlet/src/main/java/com/twelvemonkeys/servlet/image/IIOProviderContextListener.java +++ b/servlet/src/main/java/com/twelvemonkeys/servlet/image/IIOProviderContextListener.java @@ -28,12 +28,15 @@ package com.twelvemonkeys.servlet.image; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + import javax.imageio.ImageIO; import javax.imageio.spi.IIORegistry; import javax.imageio.spi.ServiceRegistry; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; -import java.util.Iterator; /** * Takes care of registering and de-registering local ImageIO plugins (service providers) for the servlet context. @@ -66,8 +69,13 @@ public final class IIOProviderContextListener implements ServletContextListener Class category = categories.next(); Iterator providers = registry.getServiceProviders(category, localFilter, false); + // Copy the providers, deregistering while iterating over providers can lead to ConcurrentModificationExceptions. + List providerObjects = new ArrayList(); while (providers.hasNext()) { - Object provider = providers.next(); + providerObjects.add(providers.next()); + } + + for (Object provider : providerObjects) { registry.deregisterServiceProvider(provider); event.getServletContext().log(String.format("Unregistered locally installed provider class: %s", provider.getClass())); }