/*
 *  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.
 */
/**
 * @author Rustem V. Rafikov
 */
package javax.imageio.spi;

import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Arrays;
import java.util.Iterator;

import org.apache.harmony.x.imageio.plugins.gif.GIFImageReaderSpi;
import org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageReaderSpi;
import org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageWriterSpi;
import org.apache.harmony.x.imageio.plugins.png.PNGImageReaderSpi;
import org.apache.harmony.x.imageio.plugins.png.PNGImageWriterSpi;
import org.apache.harmony.x.imageio.spi.FileIISSpi;
import org.apache.harmony.x.imageio.spi.FileIOSSpi;
import org.apache.harmony.x.imageio.spi.InputStreamIISSpi;
import org.apache.harmony.x.imageio.spi.OutputStreamIOSSpi;
import org.apache.harmony.x.imageio.spi.RAFIISSpi;
import org.apache.harmony.x.imageio.spi.RAFIOSSpi;

public final class IIORegistry extends ServiceRegistry {

    private static IIORegistry   instance;

    private static final Class[] CATEGORIES = new Class[] {
                    javax.imageio.spi.ImageWriterSpi.class,
                    javax.imageio.spi.ImageReaderSpi.class,
                    javax.imageio.spi.ImageInputStreamSpi.class,
                    // javax.imageio.spi.ImageTranscoderSpi.class,
                    javax.imageio.spi.ImageOutputStreamSpi.class };

    private IIORegistry() {
        super(Arrays.<Class<?>> asList(CATEGORIES).iterator());
        registerBuiltinSpis();
        registerApplicationClasspathSpis();
    }

    private void registerBuiltinSpis() {
        registerServiceProvider(new JPEGImageWriterSpi());
        registerServiceProvider(new JPEGImageReaderSpi());
        registerServiceProvider(new PNGImageReaderSpi());
        registerServiceProvider(new PNGImageWriterSpi());
        registerServiceProvider(new GIFImageReaderSpi());
        registerServiceProvider(new FileIOSSpi());
        registerServiceProvider(new FileIISSpi());
        registerServiceProvider(new RAFIOSSpi());
        registerServiceProvider(new RAFIISSpi());
        registerServiceProvider(new OutputStreamIOSSpi());
        registerServiceProvider(new InputStreamIISSpi());
    }

    public static IIORegistry getDefaultInstance() {
        // TODO implement own instance for each ThreadGroup (see also
        // ThreadLocal)
        synchronized (IIORegistry.class) {
            if (instance == null) {
                instance = new IIORegistry();
            }
            return instance;
        }
    }

    @SuppressWarnings("unchecked")
	public void registerApplicationClasspathSpis() {
        AccessController.doPrivileged(new PrivilegedAction() {
			public Object run() {
				Iterator<Class<?>> categories = getCategories();
				while (categories.hasNext()) {
					Iterator providers = lookupProviders(categories.next());
					registerServiceProviders(providers);
				}
				return this;
			}
        });
    }
}

@@ -991,24 +991,110 @@
 va.util.
-Iterator
+Collections;%0Aimport java.util.IdentityHashMap;%0Aimport java.util.Iterator;%0Aimport java.util.Map
 ;%0A%0Aimpor
@@ -1834,30 +1834,132 @@
 tic 
-IIORegistry   instance
+Map%3CThreadGroup, IIORegistry%3E instances = %0A    %09Collections.synchronizedMap(new IdentityHashMap%3CThreadGroup, IIORegistry%3E())
 ;%0A%0A 
@@ -3236,136 +3236,151 @@
     
-// TODO implement own instance for each ThreadGroup (see also%0A        // ThreadLocal)%0A        synchronized (IIORegistry.class) %7B
+ThreadGroup tg = Thread.currentThread().getThreadGroup();%0A        synchronized (instances) %7B%0A        %09IIORegistry instance = instances.get(tg);
 %0A   
@@ -3384,20 +3384,17 @@
         
-    
+%09
 if (inst
@@ -3417,24 +3417,63 @@
         
- 
+%09%09synchronized(IIORegistry.class) %7B%0A
        
+ %09%09%09
 instance
@@ -3506,26 +3506,74 @@
     
-    %7D
+%09%09%7D%0A            %09instances.put(tg, instance);
 %0A      
+  %09%7D%0A
       
+  %09
 retu
@@ -3594,16 +3594,20 @@
        %7D
+    
 %0A    %7D%0A%0A

Apply patch from "[#HARMONY-6612] Implement own instance for each ThreadGroup for class IIORegistry". First hunk needed to be applied manually.