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())); }