/** * */ package org.feature.multi.perspective.model.editor.zest.model; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.common.util.EList; import org.eclipse.zest.core.widgets.Graph; import org.feature.multi.perspective.mapping.viewmapping.Mapping; import org.feature.multi.perspective.mapping.viewmapping.MappingModel; import org.feature.multi.perspective.model.viewmodel.AbstractGroup; import org.feature.multi.perspective.model.viewmodel.CoreGroup; import org.feature.multi.perspective.model.viewmodel.Group; import org.feature.multi.perspective.model.viewmodel.GroupModel; import org.feature.multi.perspective.model.viewmodel.ViewPoint; import org.feature.multi.perspective.model.viewmodel.ViewPointContainer; import org.js.model.feature.Feature; import org.js.model.feature.FeatureModel; import org.js.model.feature.edit.FeatureModelHelper; /** * Transforms the {@link MappingModel} into a {@link Graph}. * * @author Tim Winkelmann * */ public class NodeModelContentProvider { private CoreGroupNode coreGroupNode; private Map<ViewPoint, ViewPointNode> viewPointNodes = new HashMap<ViewPoint, ViewPointNode>(); private Map<Group, GroupNode> groupdNodes = new HashMap<Group, GroupNode>(); private Map<Feature, FeatureNode> featureNodes = new HashMap<Feature, FeatureNode>(); private List<Connection> connections = new LinkedList<Connection>(); /** * * @param featureMappingModel * @param groupModel */ public NodeModelContentProvider(MappingModel featureMappingModel, GroupModel groupModel) { if (featureMappingModel != null && groupModel != null && groupModel.getCoreGroup() != null) { createGroupModelNodes(groupModel); createFeatureNodes(featureMappingModel.getFeatureModel()); EList<Mapping> mappings = featureMappingModel.getMappings(); for (Mapping mapping : mappings) { EList<Feature> features = mapping.getFeatures(); AbstractGroup viewgroup = mapping.getViewgroup(); if (viewgroup instanceof Group) { Group group = (Group) viewgroup; createConnections(group, features); } else if (viewgroup instanceof CoreGroup) { createConnections(features); } } } Collection<FeatureNode> values = featureNodes.values(); for (FeatureNode featureNode : values) { if (featureNode.getConnectedTo().isEmpty()) { Connection connection = new Connection(coreGroupNode, featureNode); coreGroupNode.getConnectedTo().add(featureNode); featureNode.getConnectedTo().add(coreGroupNode); connections.add(connection); } } System.out.println("#featureNodes:" + featureNodes.size()); } /** * create all connections between the group and the features * * @param group the group * @param features mapped to the group */ private void createConnections(Group group, EList<Feature> features) { GroupNode groupNode = groupdNodes.get(group); for (Feature feature : features) { FeatureNode featureNode = featureNodes.get(feature); Connection connection = new Connection(groupNode, featureNode); groupNode.getConnectedTo().add(featureNode); featureNode.getConnectedTo().add(groupNode); connections.add(connection); } } // // /** // * create all connections between the {@link ViewPoint} and the {@link Feature} // * // * @param viewPoint the {@link ViewPoint} // * @param elementMapping the mapping containing one or more features // */ // private void createConnections(ViewPoint viewPoint, ElementMapping elementMapping) { // if (elementMapping.getTerm() instanceof FeatureRef) { // FeatureRef featureRef = (FeatureRef) elementMapping.getTerm(); // ViewPointNode viewPointNode = viewPointNodes.get(viewPoint); // FeatureNode featureNode = featureNodes.get(featureRef.getFeature()); // Connection connection = new Connection(viewPointNode, featureNode); // viewPointNode.getConnectedTo().add(featureNode); // featureNode.getConnectedTo().add(viewPointNode); // connections.add(connection); // } else if (elementMapping.getTerm() instanceof And) { // And and = (And) elementMapping.getTerm(); // EList<Term> terms = and.getTerms(); // for (Term term : terms) { // if (term instanceof FeatureRef) { // FeatureRef featureRef = (FeatureRef) term; // ViewPointNode viewPointNode = viewPointNodes.get(viewPoint); // FeatureNode featureNode = featureNodes.get(featureRef.getFeature()); // Connection connection = new Connection(viewPointNode, featureNode); // viewPointNode.getConnectedTo().add(featureNode); // featureNode.getConnectedTo().add(viewPointNode); // connections.add(connection); // } // } // } // } /** * create all connections between the core group and the features * * @param elementMapping the mapping containing one or more features */ private void createConnections(EList<Feature> features) { for (Feature feature : features) { FeatureNode featureNode = featureNodes.get(feature); Connection connection = new Connection(coreGroupNode, featureNode); coreGroupNode.getConnectedTo().add(featureNode); featureNode.getConnectedTo().add(coreGroupNode); connections.add(connection); } } /** * creates feature nodes from the feature model * * @param featureModel the feature model */ private void createFeatureNodes(FeatureModel featureModel) { FeatureModelHelper helper = new FeatureModelHelper(featureModel); Set<Feature> children = helper.getAllFeatures(); for (Feature feature : children) { FeatureNode featureNode = new FeatureNode(feature); featureNodes.put(feature, featureNode); createFeatureNodes(feature.getGroups()); } } /** * creates feature nodes from a feature group * * @param groups group of features */ private void createFeatureNodes(EList<org.js.model.feature.Group> groups) { for (org.js.model.feature.Group group : groups) { EList<Feature> childFeatures = group.getChildFeatures(); for (Feature childFeature : childFeatures) { FeatureNode featureNode = new FeatureNode(childFeature); featureNodes.put(childFeature, featureNode); createFeatureNodes(childFeature.getGroups()); } } } /** * * @param defaultGroup */ private void createGroupModelNodes(GroupModel groupModel) { this.coreGroupNode = new CoreGroupNode(groupModel.getCoreGroup()); // create group nodes createGroupNodes(groupModel.getCoreGroup().getGroups()); // create viewPoint nodes ViewPointContainer viewPointContainer = groupModel.getViewPointContainer(); if (viewPointContainer != null) { createViewPointNodes(viewPointContainer.getViewPoints()); for (GroupNode groupNode : groupdNodes.values()) { EList<ViewPoint> viewPointReference = groupNode.getGroup().getViewPointReference(); for (ViewPoint viewPoint : viewPointReference) { ViewPointNode cn = viewPointNodes.get(viewPoint); Connection connection = new Connection(cn, groupNode); cn.getConnectedTo().add(groupNode); // groupNode.getConnectedTo().add(cn); connections.add(connection); } } } } /** * * @param viewPoints */ private void createViewPointNodes(EList<ViewPoint> viewPoints) { for (ViewPoint viewPoint : viewPoints) { ViewPointNode cn = new ViewPointNode(viewPoint); viewPointNodes.put(viewPoint, cn); Connection connection = new Connection(cn, coreGroupNode); cn.getConnectedTo().add(coreGroupNode); // defaultGroupNode.getConnectedTo().add(cn); connections.add(connection); } } /** * Creates {@link GroupNode} from the sub {@link Group} of the {@link CoreGroup}. * * @param groups list of {@link Group} from the {@link CoreGroup}. */ private void createGroupNodes(EList<Group> groups) { for (Group group : groups) { GroupNode groupNode = new GroupNode(group); groupdNodes.put(group, groupNode); Connection connection = new Connection(groupNode, coreGroupNode); groupNode.getConnectedTo().add(coreGroupNode); // defaultGroupNode.getConnectedTo().add(groupNode); connections.add(connection); if (!group.getGroups().isEmpty()) { createGroupNodes(group.getGroups(), groupNode); } } } /** * Creates group nodes from the sub nodes of a group. * * @param groups sub groups of a group * @param parentNode the parent group node */ private void createGroupNodes(EList<Group> groups, GroupNode parentNode) { for (Group group : groups) { GroupNode groupNode = new GroupNode(group); groupdNodes.put(group, groupNode); Connection connection = new Connection(groupNode, parentNode); groupNode.getConnectedTo().add(parentNode); // parentNode.getConnectedTo().add(groupNode); connections.add(connection); if (!group.getGroups().isEmpty()) { createGroupNodes(group.getGroups(), groupNode); } } } /** * returns all nodes. * * @return all nodes. */ public Collection<Node> getNodes() { Collection<Node> nodes = new LinkedList<Node>(); nodes.add(coreGroupNode); nodes.addAll(groupdNodes.values()); nodes.addAll(viewPointNodes.values()); nodes.addAll(featureNodes.values()); return nodes; } /** * @return the connections */ public List<Connection> getConnections() { return connections; } }