001 package com.hammurapi.config.runtime;
002
003 import java.io.File;
004 import java.util.Iterator;
005 import java.util.ServiceLoader;
006 import java.util.logging.Logger;
007
008 import org.eclipse.emf.common.util.URI;
009 import org.eclipse.emf.ecore.EPackage.Registry;
010 import org.eclipse.emf.ecore.resource.Resource;
011 import org.eclipse.emf.ecore.resource.ResourceSet;
012 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
013 import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
014
015 /**
016 * Helper class to load models.
017 * @author Pavel Vlasov
018 *
019 */
020 public class ResourceLoader {
021 private static final Logger logger = Logger.getLogger(ResourceLoader.class.getName());
022
023 public static Resource load(String resourceStr) {
024 return load(resourceStr, ResourceLoader.class.getClassLoader());
025 }
026
027 /**
028 * Loads resource from URL.
029 * @param resourceStr
030 * @return
031 */
032 public static Resource load(String resourceStr, ClassLoader classLoader) {
033 logger.fine("Loading "+resourceStr);
034 // Create a resource set to hold the resources.
035 ResourceSet resourceSet = new ResourceSetImpl();
036
037 // Register the appropriate resource factory to handle all file extensions.
038 resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
039 Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());
040
041 // Register the package to ensure it is available during loading.
042 Registry registry = resourceSet.getPackageRegistry();
043 ServiceLoader<PackageProvider> loader = ServiceLoader.load(PackageProvider.class, classLoader);
044 Iterator<PackageProvider> ppit = loader.iterator();
045 while (ppit.hasNext()) {
046 PackageProvider pp = ppit.next();
047 logger.fine("Package provider "+pp);
048 pp.registerPackages(registry);
049 }
050
051 File file = new File(resourceStr);
052 URI uri = file.isFile() ? URI.createFileURI(file.getAbsolutePath()): URI.createURI(resourceStr);
053 return resourceSet.getResource(uri, true);
054 }
055
056 public static Resource load(URI resourceUri) {
057 return load(resourceUri, ResourceLoader.class.getClassLoader());
058 }
059
060 /**
061 * Loads resource from URL.
062 * @param resourceStr
063 * @return
064 */
065 public static Resource load(URI resourceUri, ClassLoader classLoader) {
066 logger.fine("Loading "+resourceUri);
067 // Create a resource set to hold the resources.
068 ResourceSet resourceSet = new ResourceSetImpl();
069
070 // Register the appropriate resource factory to handle all file extensions.
071 resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
072 Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());
073
074 // Register the package to ensure it is available during loading.
075 Registry registry = resourceSet.getPackageRegistry();
076 ServiceLoader<PackageProvider> loader = ServiceLoader.load(PackageProvider.class, classLoader);
077 Iterator<PackageProvider> ppit = loader.iterator();
078 while (ppit.hasNext()) {
079 PackageProvider pp = ppit.next();
080 logger.fine("Registering package provider "+pp);
081 pp.registerPackages(registry);
082 }
083
084 return resourceSet.getResource(resourceUri, true);
085 }
086 }