/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.model.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;

import org.eclipse.bpel.model.BPELPlugin;
import org.eclipse.bpel.model.Import;
import org.eclipse.bpel.model.resource.BPELResourceSetImpl;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.util.XSDConstants;


/**
 * XSD Import resolver.
 * 
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Apr 17, 2007
 *
 */

@SuppressWarnings("nls")

public class XSDImportResolver implements ImportResolver {
    
	/**
	 * Report what kind of import handle.
	 * @return the schema for schema URI.
	 */
	
    public String getImportType() {
        return XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001;
    }
    
    /**
     * Find and load the schema based on the import statement
     * 
     * @param imp the import statement from the BPEL source
     * @return the schema that it references
     */
    
    
	protected <T extends EObject> T findAndLoad ( Import imp , String kind, Class<T> clazz ) 
    {
    	Resource baseResource = imp.eResource();
        String location = imp.getLocation();
        
    	// Bug 120110 - just bulletproofing :)
        if (baseResource==null)
        	return null;
        
        if (!baseResource.getURI().isRelative()) {
            location = URI.createURI(location).resolve(baseResource.getURI()).toString();
        }
        
        URI locationURI = URI.createURI(location);        
       
        BPELResourceSetImpl hackedResourceSet = BPELUtils.slightlyHackedResourceSet ( imp );
        
        Resource result = null;
        try {
        	result = hackedResourceSet.getResource(locationURI, true, kind);
        } catch (Throwable t) {
        	BPELPlugin.log("Resource " + locationURI + " cannot be read.",t,IStatus.WARNING);
        	return null;
        }
        
        // There is something here
        if (result.getContents().size() == 0) {
        	BPELPlugin.log("Resource " + locationURI + " is empty.",null,IStatus.WARNING) ;
        	return null;
        }
                
        try {
        	return clazz.cast(result.getContents().get(0));
        } catch (Throwable t) {
           	BPELPlugin.log("Resource " + locationURI + " is not of the expected kind.",t,IStatus.WARNING) ;        	
        }                
        return null;
    }

    
    /**
     * Resolve an object from the import.
     * @param imp to resolve from.
     * @param qname of the object.
     * @param name ?
     * @param refType the type of resolution that we are doing.
     * @return the resolved object.
     */
    
    public EObject resolve(Import imp, QName qname, String name, String refType) {
        EObject result = null;
        
        if (getImportType().equals(imp.getImportType()) == false) {
        	return result; 
        }
        
        if (XSDUtil.isSchemaType(refType) == false && TOP.equals(refType) == false) {
        	return result;            
        }        
        
        if (imp.getLocation() == null) { 
        	return result ; 
        }
        
        XSDSchema schema = findAndLoad( imp , "xsd", XSDSchema.class);   
        
        if (TOP.equals(refType)) {
        	return schema;
        }
        
        result = XSDUtil.resolve(schema, qname, name, refType);
        
        return result;
    }

    
	/** 
	 * Each XSDImport currently contributes only 1 schema.
	 * @param imp the import location
	 * @param what what to resolve
	 * @return the list of resolved items.
	 *  
	 * @see org.eclipse.bpel.model.util.ImportResolver#resolveSchemas(org.eclipse.bpel.model.Import)
	 */
    
	public List<Object> resolve (Import imp, int what) {
				
		if (getImportType().equals(imp.getImportType()) == false) {
			return Collections.emptyList();
		}
		if (what == RESOLVE_DEFINITION) {
			return Collections.emptyList();
		}
		
		List<Object> list = new ArrayList<Object>(1);
		XSDSchema schema = findAndLoad(imp,"xsd", XSDSchema.class);
		if (schema != null) {
			list.add ( schema );
		}
		return list;
	}    
    
}
