blob: 29878dfcd6956b1c54c8c1514f2cbacba4b1734a [file] [log] [blame]
package org.eclipse.emf.henshin.variability.configuration.ui.providers;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.henshin.model.Rule;
import org.eclipse.emf.henshin.variability.wrapper.TransactionalVariabilityFactory;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityRule;
import configuration.Configuration;
import configuration.ConfigurationFactory;
import configuration.Favorite;
import configuration.Feature;
import configuration.impl.ConfigurationFactoryImpl;
/**
* This class helps managing configurations.
*
* @author Stefan Schulz
*
*/
public class ConfigurationProvider {
private final static String REGEX = "def\\((.*?)\\)";
private Map<Rule, Configuration> currentConfigurations = new HashMap<Rule, Configuration>();
private Map<Rule, Set<Favorite>> favoriteConfigurations = new HashMap<Rule, Set<Favorite>>();
private static ConfigurationProvider vpProvider = new ConfigurationProvider();
ConfigurationFactory fac = ConfigurationFactory.eINSTANCE;
public static ConfigurationProvider getInstance() {
return vpProvider;
}
public Configuration getConfiguration(Rule rule) {
Configuration result = null;
if (currentConfigurations.containsKey(rule)) {
result = currentConfigurations.get(rule);
} else {
result = createConfiguration(rule);
}
return result;
}
public Configuration getConfiguration(Favorite favorite) {
Configuration result = null;
result = fac.createConfiguration(favorite);
result.setRule(favorite.getRule());
currentConfigurations.put(result.getRule(), result);
return result;
}
public Favorite addConfigurationToFavorites(Rule rule, String name, Configuration configuration) {
if (favoriteConfigurations.get(rule) == null) {
favoriteConfigurations.put(rule, new LinkedHashSet<Favorite>());
}
Favorite favorite = fac.createFavorite(configuration);
favorite.setRule(rule);
favorite.setName(name);
favoriteConfigurations.get(rule).add(favorite);
return favorite;
}
private Favorite findMatchingFavorite(Configuration configuration) {
Favorite result = null;
Set<Favorite> ruleFavorites = favoriteConfigurations.get(configuration.getRule());
if (ruleFavorites != null) {
for (Favorite favorite : ruleFavorites) {
if (favorite.getFeatures().size() == configuration.getFeatures().size()) {
int matches = 0;
/*
* TODO: This needs to be improved
*/
for (int i = favorite.getFeatures().size() - 1; i >= 0; i--) {
Feature favVP = favorite.getFeatures().get(i);
Feature conVP = configuration.getFeatures().get(i);
if (conVP.getName().equals(favVP.getName()) && conVP.getBinding() == favVP.getBinding()) {
matches++;
}
}
if (matches == configuration.getFeatures().size()) {
result = favorite;
break;
}
}
}
}
return result;
}
public void clearFavorites(Configuration configuration) {
Set<Favorite> favorites = favoriteConfigurations.get(configuration.getRule());
if (favorites != null) {
favorites.clear();
}
}
public void removeConfigurationFromFavorites(Configuration configuration) {
Favorite favorite = findMatchingFavorite(configuration);
if(favorite != null) {
favoriteConfigurations.get(configuration.getRule()).remove(favorite);
}
}
public boolean isFavorite(Configuration configuration) {
return findMatchingFavorite(configuration) != null;
}
public Favorite findFavorite(Configuration configuration) {
return findMatchingFavorite(configuration);
}
public void addFavorites(Rule rule, Set<Favorite> favoritesSet) {
favoriteConfigurations.put(rule, favoritesSet);
}
public Set<Favorite> getFavorites(Rule rule) {
return favoriteConfigurations.get(rule);
}
private Configuration createConfiguration(Rule rule) {
Configuration result = null;
if (rule != null) {
VariabilityRule varRule = TransactionalVariabilityFactory.INSTANCE.createVariabilityRule(rule);
ConfigurationFactory fac = ConfigurationFactoryImpl.init();
result = fac.createConfiguration();
result.setRule(varRule);
String featureModel = varRule.getFeatureModel();
EList<Feature> variabilityPoints = result.getFeatures();
if(varRule.getFeatures() != null) {
for(String variabilityPointName : varRule.getFeatures()) {
Feature vp = fac.createFeature();
vp.setName(variabilityPointName);
variabilityPoints.add(vp);
}
} else if (featureModel != null && !featureModel.isEmpty()) {
Matcher match = Pattern.compile(REGEX).matcher(featureModel);
while (match.find()) {
for (int i = 1; i <= match.groupCount(); i++) {
Feature vp = fac.createFeature();
vp.setName(match.group(i));
variabilityPoints.add(vp);
}
}
}
currentConfigurations.put(rule, result);
}
return result;
}
}