/**
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 *
 * Copyright (C)
 * <a href="http://www.inab.org">Spanish National Institute of Bioinformatics (INB)</a>
 * <a href="http://www.bsc.es">Barcelona Supercomputing Center (BSC)</a>
 * <a href="http://inb.bsc.es">Computational Node 6</a>
 */

package org.inb.biomoby;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Custom classloader which is used to intercept JAXBContext loading.
 * Allows to ignore the absence of generated datatype classes.
 * 
 * @author Dmitry Repchevsky
 */

public class MobyClassLoader extends ClassLoader
{    
    public MobyClassLoader(ClassLoader classloader)
    {
        super(classloader);
    }
    
    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException
    {
        Class<?> clazz = findLoadedClass(name);
        
        if (clazz == null)
        { // load the class only if it wasn't loaded before
            try
            {
                clazz = super.loadClass(name);
            }
            catch (ClassNotFoundException ex)
            {
                throw ex;
            }
        }
                
        return clazz;
    }
        
    @Override
    public URL getResource(String name)
    {
        URL url = super.getResource(name);
        
        // if JAXB can not find ontology files - return a dummy location
        if (url == null && "org/inb/biomoby/shared/ontology/jaxb.index".equals(name))
        {
            try
            {
                url = new URL("location://org/inb/biomoby/shared/ontology/jaxb.index");
            }
            catch (MalformedURLException ex) {}
        }
        return url;
    }
    
    @Override
    public InputStream getResourceAsStream(String name)
    {
        InputStream in = super.getResourceAsStream(name);
        
        // if JAXB is looking and can't find ontology files - return an empty one.
        if (in == null && "org/inb/biomoby/shared/ontology/jaxb.index".equals(name))
        {
            return new ByteArrayInputStream(new byte[] {});
        }
        
        return in;
    } 
}
