blob: 41987741f823c872a9c5afe4ba79fc92c9886f30 [file] [log] [blame]
/**
* Copyright (c) 2012, 2014 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Obeo - initial API and implementation
*/
package org.eclipse.emf.compare.tests.framework;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
/**
* Implementations of this class can be used to load models from the class' class loader.
*
* @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a>
*/
public abstract class AbstractInputData {
/**
* Tries and locate a model in the current class' classpath.
*
* @param string
* Relative path to the model we seek (relative to this class).
* @return The loaded resource.
* @throws IOException
* Thrown if we could not access either this class' resource, or the file towards which
* <code>string</code> points.
*/
protected Resource loadFromClassLoader(String string) throws IOException {
final URL fileURL = getClass().getResource(string);
final InputStream str = fileURL.openStream();
final URI uri = URI.createURI(fileURL.toString());
Resource.Factory resourceFactory = Resource.Factory.Registry.INSTANCE.getFactory(uri);
if (resourceFactory == null) {
// Most likely a standalone run. Try with a plain XMI resource
resourceFactory = new XMIResourceFactoryImpl();
}
// resourceFactory cannot be null
Resource res = resourceFactory.createResource(uri);
res.load(str, Collections.emptyMap());
str.close();
return res;
}
/**
* Tries and locate a model in the current class' classpath.
*
* @param string
* Relative path to the model we seek (relative to this class).
* @param resourceSet
* the resource set in which to load the resource.
* @return The loaded resource.
* @throws IOException
* Thrown if we could not access either this class' resource, or the file towards which
* <code>path</code> points.
*/
protected Resource loadFromClassLoader(String path, ResourceSet resourceSet) throws IOException {
final URL fileURL = getClass().getResource(path);
final URI uri = URI.createURI(fileURL.toString());
final Resource existing = resourceSet.getResource(uri, false);
if (existing != null) {
return existing;
}
InputStream stream = null;
Resource resource = null;
try {
resource = resourceSet.createResource(uri);
stream = fileURL.openStream();
resource.load(stream, Collections.emptyMap());
} catch (IOException e) {
// return null
} catch (WrappedException e) {
// return null
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// Should have been caught by the outer try
}
}
}
return resource;
}
public ResourceSet loadFromClassLoader(List<String> paths, ResourceSet resourceSet) throws IOException {
for (String path : paths) {
loadFromClassLoader(path, resourceSet);
EcoreUtil.resolveAll(resourceSet);
}
return resourceSet;
}
}