/**
 * 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.
 */
package javax.xml.soap;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

/**
 * This class is used to locate factory classes for javax.xml.soap. It has package scope since it is
 * not part of JAXM and should not be accessed from other packages.
 */
class FactoryFinder {
    /**
     * instantiates an object go the given classname.
     *
     * @param factoryClassName
     * @return a factory object
     * @throws SOAPException
     */
    private static Object newInstance(String factoryClassName) throws SOAPException {
        ClassLoader classloader = null;
        try {
            classloader = Thread.currentThread().getContextClassLoader();
        } catch (Exception exception) {
            throw new SOAPException(exception.toString(), exception);
        }

        try {
            Class factory = null;
            if (classloader == null) {
                factory = Class.forName(factoryClassName);
            } else {
                try {
                    factory = classloader.loadClass(factoryClassName);
                } catch (ClassNotFoundException cnfe) {
                }
            }
            if (factory == null) {
                classloader = FactoryFinder.class.getClassLoader();
                factory = classloader.loadClass(factoryClassName);
            }
            return factory.newInstance();
        } catch (ClassNotFoundException classnotfoundexception) {
            throw new SOAPException(
                    "Provider " + factoryClassName + " not found",
                    classnotfoundexception);
        } catch (Exception exception) {
            throw new SOAPException(
                    "Provider " + factoryClassName +
                            " could not be instantiated: " +
                            exception,
                    exception);
        }
    }

    /**
     * Instantiates a factory object given the factory's property name and the default class name.
     *
     * @param factoryPropertyName
     * @param defaultFactoryClassName
     * @return a factory object
     * @throws SOAPException
     */
    static Object find(String factoryPropertyName,
                       String defaultFactoryClassName) throws SOAPException {
        try {
            // If we are deployed into an OSGi environment, leverage it
            String factoryClassName = factoryPropertyName;
            if (factoryPropertyName.equals("javax.xml.soap.MetaFactory")) {
                //this is an exception that the factoryPropertyName isn't
                //the actual factory class name, there is no class
                //javax.xml.soap.MetaFactory at all
                factoryClassName = "javax.xml.soap.SAAJMetaFactory";
            }
            Class factoryClass = FactoryFinder.class.getClassLoader().loadClass(factoryClassName);
            Class spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryPropertyName);
            if (spiClass != null) {
                return spiClass.newInstance();
            }
        } catch (Throwable e) {
        }

        try {
            String factoryClassName = System.getProperty(factoryPropertyName);
            if (factoryClassName != null) {
                return newInstance(factoryClassName);
            }
        } catch (SecurityException securityexception) {
        }

        try {
            String propertiesFileName = System.getProperty("java.home")
                    + File.separator + "lib"
                    + File.separator + "jaxm.properties";
            File file = new File(propertiesFileName);
            if (file.exists()) {
                FileInputStream fileInput = new FileInputStream(file);
                Properties properties = new Properties();
                properties.load(fileInput);
                fileInput.close();
                String factoryClassName = properties.getProperty(
                        factoryPropertyName);
                return newInstance(factoryClassName);
            }
        } catch (Exception exception1) {
        }

        String factoryResource = "META-INF/services/" + factoryPropertyName;

        try {
            InputStream inputstream = getResource(factoryResource);
            if (inputstream != null) {
                BufferedReader bufferedreader = new BufferedReader(
                        new InputStreamReader(inputstream, "UTF-8"));
                String factoryClassName = bufferedreader.readLine();
                bufferedreader.close();
                if ((factoryClassName != null) && !"".equals(factoryClassName)) {
                    try {
                        return newInstance(factoryClassName);
                    } catch (Exception e) {
                        throw new SOAPException(
                                "Provider for " + factoryPropertyName + " cannot be found",
                                null);
                    }
                }
            }
        } catch (Exception exception2) {
        }

        if (defaultFactoryClassName == null) {
            throw new SOAPException(
                    "Provider for " + factoryPropertyName + " cannot be found",
                    null);
        } else {
            return newInstance(defaultFactoryClassName);
        }
    }

    /**
     * Returns an input stream for the specified resource.
     * <p/>
     * <p>This method will firstly try <code>ClassLoader.getSystemResourceAsStream()</code> then the
     * class loader of the current thread with <code>getResourceAsStream()</code> and finally
     * attempt <code>getResourceAsStream()</code> on <code>FactoryFinder.class.getClassLoader()</code>.
     *
     * @param factoryResource the resource name
     * @return an InputStream that can be used to read that resource, or <code>null</code> if the
     *         resource could not be resolved
     */
    private static InputStream getResource(String factoryResource) {
        ClassLoader classloader = null;
        try {
            classloader = Thread.currentThread().getContextClassLoader();
        } catch (SecurityException securityexception) {
        }

        InputStream inputstream;
        if (classloader == null) {
            inputstream =
                    ClassLoader.getSystemResourceAsStream(factoryResource);
        } else {
            inputstream = classloader.getResourceAsStream(factoryResource);
        }

        if (inputstream == null) {
            inputstream =
                    FactoryFinder.class.getClassLoader().getResourceAsStream(
                            factoryResource);
        }
        return inputstream;
    }
}
