package org.feature.multi.perspective.model.editor.editors;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.feature.multi.perspective.mapping.viewmapping.MappingModel;
import org.feature.multi.perspective.model.editor.editors.algorithms.BruteForceAlgorithm;
import org.feature.multi.perspective.model.viewmodel.GroupModel;
import org.feature.multi.perspective.model.viewmodel.ViewPoint;
import org.feature.multi.perspective.utilities.FeatureMappingUtil;
import org.js.model.feature.Feature;
import org.js.model.feature.FeatureModel;
import org.js.model.feature.FeatureState;
import org.js.model.feature.edit.FeatureLabelProvider;
import org.js.model.feature.edit.FeatureModelHelper;
/**
* create the filtered feature model and validates it. also validates all view points.
*
* @author Tim Winkelmann
*
*/
public class FilteredFeatureModel {
private static Logger log = Logger.getLogger(FilteredFeatureModel.class);
private ViewPoint viewPoint;
private MappingModel featureMappingModel;
private View viewpointView;
/**
*
* @param mappingResource
* @param viewPoint
*/
public FilteredFeatureModel(Resource mappingResource, ViewPoint viewPoint) {
this.viewPoint = viewPoint;
featureMappingModel = FeatureMappingUtil.getFeatureMapping(mappingResource);
}
/**
* create a view from the viewpoint, validate it, and persist the view as a new feature model refinement.
*/
public boolean createAndValidateView() {
long timeMillis = System.currentTimeMillis();
log.debug("time: " + (System.currentTimeMillis() - timeMillis));
timeMillis = System.currentTimeMillis();
View view = createView();
boolean consistent = false;
// Find specific ViewPoint
if (view != null && view.isConsistent()) {
viewpointView = view;
consistent = true;
}
log.debug("time: " + (System.currentTimeMillis() - timeMillis));
return consistent;
}
public FeatureModel deriveFilteredFeaturemodel() {
FeatureModel model = null;
if (viewpointView != null) {
model = createFilteredFeatureModelCopy(featureMappingModel.getFeatureModel(), viewPoint, viewpointView);
} else {
log.error("Could not create ViewPoint");
}
return model;
}
public FeatureModel deriveDeselectedFeaturemodel() {
FeatureModel model = null;
if (viewpointView != null) {
model = createDeselectedFeatureModelCopy(featureMappingModel.getFeatureModel(), viewPoint, viewpointView);
} else {
log.error("Could not create ViewPoint");
}
return model;
}
public String getViewPointName() {
String result = "";
if (viewPoint != null) {
result = viewPoint.getName();
}
return result;
}
private View createView() {
FeatureModel featureModel = featureMappingModel.getFeatureModel();
FeatureModelHelper helper = new FeatureModelHelper(featureModel);
Set<Feature> allFeatures = helper.getAllFeatures();
log.info("#allFeatures: " + allFeatures.size());
GroupModel groupModel = featureMappingModel.getViewModel();
// create views
ViewCreator viewCreater = new ViewCreator(featureMappingModel);
List<View> views = viewCreater.getViews();
BruteForceAlgorithm bruteForce = new BruteForceAlgorithm(groupModel, views, featureMappingModel.getFeatureModel());
View view = bruteForce.checkViewpoint(viewPoint);
if (view != null) {
log.info("#viewFeatures: " + view.getFeatures().size());
}
return view;
}
private FeatureModel createDeselectedFeatureModelCopy(FeatureModel origFeatureModel, ViewPoint viewPoint, View view) {
FeatureModel newFeatureModel = EcoreUtil.copy(origFeatureModel);
FeatureModelHelper helper = new FeatureModelHelper(newFeatureModel);
Set<Feature> allNewFeatures = helper.getAllFeatures();
FeatureLabelProvider labelProvider = new FeatureLabelProvider();
Set<Feature> origfeatures = getFeaturesNotContainedInView(view);
for (Feature origfeature : origfeatures) {
String origfeatureId = origfeature.getId();
for (Feature newFeature : allNewFeatures) {
String newFeatureId = newFeature.getId();
if (origfeatureId.equals(newFeatureId)) {
// deselect features not contained in view
log.info("deselected feature" + labelProvider.getText(newFeature));
newFeature.setConfigurationState(FeatureState.DESELECTED);
break;
}
}
}
return newFeatureModel;
}
private Set<Feature> getFeaturesNotContainedInView(View view) {
Set<Feature> notContained = new HashSet<Feature>();
FeatureModel featureModel = view.getFeatureModel();
FeatureModelHelper helper = new FeatureModelHelper(featureModel);
Set<Feature> allFeatures = helper.getAllFeatures();
Set<Feature> viewFeatures = view.getFeatures();
notContained.addAll(allFeatures);
notContained.removeAll(viewFeatures);
return notContained;
}
/**
* creates the feature model and persist it in a file.
*
* @param featureMappingModel the mapping
* @param viewPoint the viewpoint
* @param view the features to the viewpoint
*/
private FeatureModel createFilteredFeatureModelCopy(FeatureModel origFeatureModel, ViewPoint viewPoint, View view) {
log.info("#Features for a ViewPoint: " + view.getFeatures().size());
Map<String, Feature> featureMap = new HashMap<String, Feature>();
Set<Feature> features = view.getFeatures();
for (Feature feature : features) {
featureMap.put(feature.getId(), feature);
}
Filter filter = new Filter(origFeatureModel, featureMap);
FeatureModel newModel = filter.newFeatureModel;
return newModel;
}
}