Index: src/main/java/javax/imageio/spi/IIOServiceProvider.java =================================================================== --- src/main/java/javax/imageio/spi/IIOServiceProvider.java (revision 953344) +++ src/main/java/javax/imageio/spi/IIOServiceProvider.java (working copy) @@ -49,9 +49,8 @@ // the default impl. does nothing } - public void onDeregistration(ServiceRegistry registry, Class category) throws NotImplementedException { - // TODO: implement - throw new NotImplementedException(); + public void onDeregistration(ServiceRegistry registry, Class category) { + // the default impl. does nothing } public String getVendorName() { Index: src/main/java/javax/imageio/spi/ServiceRegistry.java =================================================================== --- src/main/java/javax/imageio/spi/ServiceRegistry.java (revision 953344) +++ src/main/java/javax/imageio/spi/ServiceRegistry.java (working copy) @@ -65,9 +65,8 @@ categories.addProvider(provider, null); } - public boolean deregisterServiceProvider(T provider, Class category) throws NotImplementedException { - // TODO: implement - throw new NotImplementedException(); + public boolean deregisterServiceProvider(T provider, Class category) { + return categories.removeProvider(provider, category); } public void deregisterServiceProvider(Object provider) throws NotImplementedException { @@ -201,6 +200,24 @@ } return rt; } + + boolean removeProvider(Object provider, Class category) { + if (provider == null) { + throw new IllegalArgumentException(Messages.getString("imageio.5E")); + } + + if (!category.isAssignableFrom(provider.getClass())) { + throw new ClassCastException(); + } + + Object obj = categories.get(category); + + if (null == obj) { + throw new IllegalArgumentException(Messages.getString("imageio.92", category)); + } + + return ((ProvidersMap) obj).removeProvider(provider, registry, category); + } } private static class ProvidersMap { @@ -212,6 +229,22 @@ return providers.put(provider.getClass(), provider) == null; } + boolean removeProvider(Object provider, + ServiceRegistry registry, Class category) { + + //TODO remove provider from nodeMap after task HARMONY-6507 has been resolved + Object obj = providers.remove(provider.getClass()); + if ((obj == null) || (obj != provider)) { + return false; + } + + if (provider instanceof RegisterableService) { + ((RegisterableService) provider).onDeregistration(registry, category); + } + + return (obj == null ? false : true); + } + Iterator> getProviderClasses() { return providers.keySet().iterator(); } Index: src/test/java/javax/imageio/spi/ServiceRegistryTest.java =================================================================== --- src/test/java/javax/imageio/spi/ServiceRegistryTest.java (revision 953341) +++ src/test/java/javax/imageio/spi/ServiceRegistryTest.java (working copy) @@ -43,6 +43,24 @@ assertFalse("registerServiceProvider() returns incorrect value if a provider of the same class was previously registered", registry.registerServiceProvider(spiB, CATEGORIES[1])); } + + @SuppressWarnings("unchecked") + public void testDeregisterServiceProvider() { + Class[] CATEGORIES = new Class[] { + javax.imageio.spi.ImageReaderSpi.class}; + + ServiceRegistry registry = new ServiceRegistry(Arrays.> asList(CATEGORIES).iterator()); + + SampleImageReaderSpi spi = new SampleImageReaderSpi(); + + registry.registerServiceProvider(spi, CATEGORIES[0]); + + assertTrue("deregisterServiceProvider() returns incorrect value for a registered provider ", + registry.deregisterServiceProvider(spi, CATEGORIES[0])); + + assertFalse("deregisterServiceProvider() returns incorrect value for a unregistered provider", + registry.deregisterServiceProvider(spi, CATEGORIES[0])); + } } class SampleImageReaderSpi extends ImageReaderSpi {