package de.ovgu.cide.features;
import java.util.List;
import java.util.WeakHashMap;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import de.ovgu.cide.CIDECorePlugin;
import de.ovgu.cide.ExtensionPointManager;
import de.ovgu.cide.preferences.PreferenceConstants;
public class FeatureModelManager extends
ExtensionPointManager<FeatureModelProviderProxy> {
private static FeatureModelManager instance;
private FeatureModelManager() {
super(CIDECorePlugin.ID, "featureModelProvider");
}
public static FeatureModelManager getInstance() {
if (instance == null)
instance = new FeatureModelManager();
return instance;
}
protected FeatureModelProviderProxy parseExtension(
IConfigurationElement configurationElement) {
if (!configurationElement.getName().equals("featureModelProvider"))
return null;
return new FeatureModelProviderProxy(configurationElement);
}
/**
* only one feature model provider may be active at at time (can be
* configured in preferences). this returns the active one.
*
* @return feature model provider or null if there is no active FMP
* configured or the active FMP is not available
*/
public FeatureModelProviderProxy getActiveFeatureModelProvider() {
String featureModelProviderId = CIDECorePlugin.getDefault()
.getPreferenceStore().getString(
PreferenceConstants.P_FEATUREMODELPROVIDER);
List<FeatureModelProviderProxy> providers = getProviders();
for (FeatureModelProviderProxy provider : providers)
if (provider.getId().equals(featureModelProviderId))
return provider;
return null;
}
private final WeakHashMap<IProject, IFeatureModel> featureModelCache = new WeakHashMap<IProject, IFeatureModel>();
public IFeatureModel getFeatureModel(IProject project)
throws FeatureModelNotFoundException {
// assert project != null && project.exists() && project.isOpen();
IFeatureModel featureModel = featureModelCache.get(project);
if (featureModel == null) {
FeatureModelProviderProxy provider = getActiveFeatureModelProvider();
if (provider == null)
throw new FeatureModelNotFoundException(
"No feature model found.");
featureModel = provider.getFeatureModel(project);
featureModelCache.put(project, featureModel);
}
return featureModel;
}
/**
* same as getFeatureModel, but throws a coreException in case of an error.
* to be used in jobs
*
* @param sourceProject
* @return
* @throws CoreException
*/
public IFeatureModel getFeatureModelCore(IProject sourceProject)
throws CoreException {
try {
return FeatureModelManager.getInstance().getFeatureModel(
sourceProject);
} catch (FeatureModelNotFoundException e) {
e.printStackTrace();
throw new CoreException(new Status(IStatus.ERROR,
CIDECorePlugin.ID, "Feature Model cannot be created", e));
}
}
public List<FeatureModelProviderProxy> getFeatureModelProviders() {
return getProviders();
}
}