/*
 * Copyright (c) 1997, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0, which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package com.sun.tools.xjc.servlet;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;

import javax.servlet.ServletContext;

/**
 * Modified version of the {@link URLClassLoader} that tries
 * to load classes from itself before delegating to the parent.
 * 
 * This class loader is used to workaround the bug in JWSDP1.2.
 * 
 * @author
 *     Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
 */
public class XJCClassLoader extends URLClassLoader {
    
    private XJCClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
    }

//    private XJCClassLoader(URL[] urls) {
//        super(urls);
//    }
//
//    private XJCClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) {
//        super(urls, parent, factory);
//    }
    
    private static XJCClassLoader theInstance;
    
    public static ClassLoader getInstance( ServletContext context ) throws IOException {
        if( theInstance==null ) {
            theInstance = new XJCClassLoader( new URL[] {
                context.getResource("/WEB-INF/lib/boxed.jar"),
                context.getResource("/WEB-INF/lib/jaxb-xjc.jar"),
                context.getResource("/WEB-INF/lib/jaxb-impl.jar") },
                Thread.currentThread().getContextClassLoader() );
        }
        
        return theInstance;
    }
    
    

    public URL getResource(String name) {
        // try this class loader first
        URL url = findResource(name);
        
        if( url==null ) {
            // if fails, delegate to the parent
            url = getParent().getResource(name);
        }
        return url;
    }

    protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
        // First, check if the class has already been loaded
        Class c = findLoadedClass(name);
        if (c == null) {
            
            if( shouldDelegate(name) )
                c = getParent().loadClass(name);
            else {
                try {
                    // try this class loader first.
                    c = findClass(name);
//                    System.out.println("found "+name);
                } catch( ClassNotFoundException e ) {
                    // if fail, delegate to the parent
                    c = getParent().loadClass(name);
                }
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }

    private boolean shouldDelegate(String name) {
        if( name.startsWith("org.xml")
        ||  name.startsWith("org.w3c")
        ||  name.startsWith("javax.xml.parsers")
        ||  name.startsWith("javax.xml.transform") )
            return true;
        else
            return false;
    }
}
