/*
 *  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
 * @version $Revision: 1.3 $
 */

package javax.imageio.spi;

import java.util.Arrays;

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;

/*
 * @author Rustem V. Rafikov, Viskov Nikolay
 * @version $Revision: 1.3 $
 */

/**
 * The IIORegistry class registers service provider instances (SPI). Service
 * provider instances are recognized by specific meta-information in the JAR
 * files containing them. The JAR files with SPI classes are loaded from the
 * application class path.
 * 
 * @since Android 1.0
 */
public final class IIORegistry extends ServiceRegistry {

    /**
     * The instance.
     */
    private static IIORegistry instance;

    /**
     * The Constant CATEGORIES.
     */
    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
    };

    /**
     * Instantiates a new IIO registry.
     */
    private IIORegistry() {
        super(Arrays.<Class<?>> asList(CATEGORIES).iterator());
        registerBuiltinSpis();
        registerApplicationClasspathSpis();
    }

    /**
     * Register built-in SPIs.
     */
    private void registerBuiltinSpis() {
        registerServiceProvider(new JPEGImageWriterSpi());
        registerServiceProvider(new JPEGImageReaderSpi());
        registerServiceProvider(new PNGImageReaderSpi());
        registerServiceProvider(new PNGImageWriterSpi());
        registerServiceProvider(new FileIOSSpi());
        registerServiceProvider(new FileIISSpi());
        registerServiceProvider(new RAFIOSSpi());
        registerServiceProvider(new RAFIISSpi());
        registerServiceProvider(new OutputStreamIOSSpi());
        registerServiceProvider(new InputStreamIISSpi());
        // -- TODO implement
    }

    /**
     * Gets the default IIORegistry instance.
     * 
     * @return the default IIORegistry instance.
     */
    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;
        }
    }

    /**
     * Registers all service providers from the application class path.
     */
    public void registerApplicationClasspathSpis() {
        // -- TODO implement for non-builtin plugins
    }
}