blob: 8004b64603be839449111ea8a60aa589c81d5ab8 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}