blob: 3d452f651b06a960b939d4b90957f6be9e76d262 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Oracle 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.common;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
/**
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Aug 3, 2007
*
*/
@SuppressWarnings("nls")
public class BPELResourceSet extends ResourceSetImpl {
/**
* Used to force loading using the right resource loaders.
*/
static public final String SLIGHTLY_HACKED_KEY = "slightly.hacked.resource.set";
/**
* Load the resource from the resource set, assuming that it is the kind
* indicated by the last argument. The "kind" parameter is the extension
* without the . of the resource.
*
* This forces the right resource to be loaded even if the URI of the resource
* is "wrong".
*
* @param uri the URI of the resource.
* @param loadOnDemand load on demand
* @param kind the resource kind. It has to be of the form "*.wsdl", or "*.xsd", or "*.bpel"
* @return the loaded resource.
*/
@SuppressWarnings("nls")
public Resource getResource(URI uri, boolean loadOnDemand, String kind) {
Map<URI, Resource> map = getURIResourceMap();
if (map != null) {
Resource resource = map.get(uri);
if (resource != null) {
if (loadOnDemand && !resource.isLoaded()) {
demandLoadHelper(resource);
}
return resource;
}
}
URIConverter theURIConverter = getURIConverter();
URI normalizedURI = theURIConverter.normalize(uri);
Iterator<Resource> it = getResources().iterator();
while (it.hasNext()) {
Resource resource = it.next();
if (theURIConverter.normalize(resource.getURI()).equals(
normalizedURI)) {
if (loadOnDemand && !resource.isLoaded()) {
demandLoadHelper(resource);
}
if (map != null) {
map.put(uri, resource);
}
return resource;
}
}
if (loadOnDemand) {
Resource resource = demandCreateResource(uri,kind);
if (resource == null) {
throw new RuntimeException("Cannot create a resource for '"
+ uri + "'; a registered resource factory is needed");
}
demandLoadHelper(resource);
if (map != null) {
map.put(uri, resource);
}
return resource;
}
return null;
}
protected Resource demandCreateResource ( URI uri, String kind ) {
return createResource ( uri, kind );
}
/**
* Create the resource based on the kind.
* @param uri
* @param kind
* @return the created resource
*/
@SuppressWarnings("nls")
public Resource createResource ( URI uri, String kind ) {
if (kind == null) {
return super.createResource(uri, null);
}
Resource resource = createResource(URI.createURI("*." + kind));
if (resource != null) {
resource.setURI(uri);
}
return resource;
}
}