package org.objectstyle.wolips.eomodeler.core.model;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
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.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.objectstyle.wolips.eomodeler.core.Activator;
/**
* Implemented by an extension point that can load EOModels within an
* EOModelGroup.
*
* @author mschrag
*/
public interface IEOModelGroupFactory {
/**
* Loads models into the specified EOModelGroup based on the
* modelGroupResource provided.
*
* @param modelGroupResource
* the IProject, Folder, etc to load the model group from
* @param modelGroup
* the model group to load into
* @param failures
* the set of failures during load
* @param skipOnDuplicates
* whether or not to skip duplicate models
* @return true if this model group factory believes it has found everything
* @throws EOModelException
* if there is a problem loading models
*/
public boolean loadModelGroup(Object modelGroupResource, EOModelGroup modelGroup, Set<EOModelVerificationFailure> failures, boolean skipOnDuplicates, IProgressMonitor progressMonitor) throws EOModelException;
public class Utility {
public static EOModelGroup loadModelGroup(Object modelGroupResource, Set<EOModelVerificationFailure> failures, boolean skipOnDuplicates, IProgressMonitor progressMonitor) throws EOModelException {
EOModelGroup modelGroup = new EOModelGroup();
IEOModelGroupFactory.Utility.loadModelGroup(modelGroupResource, modelGroup, failures, skipOnDuplicates, null, progressMonitor);
return modelGroup;
}
public static EOModelGroup loadModelGroup(Object modelGroupResource, Set<EOModelVerificationFailure> failures, boolean skipOnDuplicates, URL editingModelURL, IProgressMonitor progressMonitor) throws EOModelException {
EOModelGroup modelGroup = new EOModelGroup();
IEOModelGroupFactory.Utility.loadModelGroup(modelGroupResource, modelGroup, failures, skipOnDuplicates, editingModelURL, progressMonitor);
return modelGroup;
}
public static void loadModelGroup(Object modelGroupResource, EOModelGroup modelGroup, Set<EOModelVerificationFailure> failures, boolean skipOnDuplicates, URL editingModelURL, IProgressMonitor progressMonitor) throws EOModelException {
modelGroup.setEditingModelURL(editingModelURL);
List<IEOModelGroupFactory> modelGroupFactories = IEOModelGroupFactory.Utility.modelGroupFactories();
for (IEOModelGroupFactory modelGroupFactory : modelGroupFactories) {
boolean modelsLoaded = modelGroupFactory.loadModelGroup(modelGroupResource, modelGroup, failures, skipOnDuplicates, progressMonitor);
// MS: This COOOouuullldd cause a problem, but only if you're loading models in MULTIPLE ways, which seems unlikely to me ... This
// saves a lot of time if you have IDEA and Eclipse project files. We can just load models using the first one we find.
if (modelsLoaded) {
break;
}
}
progressMonitor.setTaskName("Resolving model dependencies ...");
modelGroup.resolve(failures);
progressMonitor.setTaskName("Verifying model ...");
modelGroup.verify(failures);
}
public static List<IEOModelGroupFactory> modelGroupFactories() {
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint("org.objectstyle.wolips.eomodeler.eomodelGroupFactory");
IExtension[] extensions = extensionPoint.getExtensions();
List<IEOModelGroupFactory> modelGroupFactories = new LinkedList<IEOModelGroupFactory>();
for (IExtension extension : extensions) {
IConfigurationElement[] configurationElements = extension.getConfigurationElements();
for (IConfigurationElement configurationElement : configurationElements) {
try {
IEOModelGroupFactory modelGroupFactory = (IEOModelGroupFactory) configurationElement.createExecutableExtension("class");
modelGroupFactories.add(modelGroupFactory);
} catch (CoreException e) {
e.printStackTrace();
Activator.getDefault().log("Could not create EOModelGroup factory from configuration element: " + configurationElement, e);
}
}
}
return modelGroupFactories;
}
}
}