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    }