package org.objectstyle.wolips.eomodeler.core.model;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.objectstyle.wolips.eomodeler.core.Activator;
/**
* An EOClassLoaderFactory is responsible for constructing a ClassLoader that
* can be used to execute code from EOF.
*
* @author mschrag
*/
public interface IEOClassLoaderFactory {
/**
* Returns a ClassLoader that contains all the EOF classes in it.
*
* @param model
* the EOModel to use as the basis for the the ClassLoader
* @return an EOF ClassLoader
*/
public ClassLoader createClassLoaderForModel(EOModel model) throws EOModelException;
public class Utility {
public static ClassLoader createClassLoader(EOModel model) throws EOModelException {
List<IEOClassLoaderFactory> classLoaderFactories = new LinkedList<IEOClassLoaderFactory>();
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint("org.objectstyle.wolips.eomodeler.eoclassLoaderFactory");
IExtension[] extensions = extensionPoint.getExtensions();
ClassLoader finalClassLoader = null;
for (IExtension extension : extensions) {
IConfigurationElement[] configurationElements = extension.getConfigurationElements();
for (IConfigurationElement configurationElement : configurationElements) {
try {
IEOClassLoaderFactory classLoaderFactory = (IEOClassLoaderFactory) configurationElement.createExecutableExtension("class");
ClassLoader classLoader = classLoaderFactory.createClassLoaderForModel(model);
if (classLoader != null) {
if (finalClassLoader == null) {
finalClassLoader = classLoader;
}
else {
Activator.getDefault().log("There was more than one valid EOF ClassLoader factory defined. The ClassLoader generated by the first one will be used.");
}
}
classLoaderFactories.add(classLoaderFactory);
} catch (CoreException e) {
Activator.getDefault().log("Could not create EOClassLoader factory from configuration element: " + configurationElement, e);
}
}
}
if (finalClassLoader == null) {
throw new EOModelException("There was no valid EOF ClassLoader factory defined.");
}
return finalClassLoader;
}
}
}