private void visitFeatureHierarchy( fr.familiar.attributedfm.Feature ffeatroot, FeatureHierarchy fh) { EList<FeatureDefinition> fhchildren = fh.getChildren(); for (FeatureDefinition fd : fhchildren) { fr.familiar.attributedfm.Relation frel = new fr.familiar.attributedfm.Relation(); if (fd instanceof Feature) { fr.inria.lang.vM.Feature f = (fr.inria.lang.vM.Feature) fd; if (f.isOptional()) { frel.addCardinality(new Cardinality(0, 1)); } else if (!f.isOptional()) { // isMandatory frel.addCardinality(new Cardinality(1, 1)); } frel.addDestination(new fr.familiar.attributedfm.Feature(f.getName())); ffeatroot.addRelation(frel); } else if (fd instanceof FeaturesGroup) { frel.addCardinality(new Cardinality(1, 1)); FeaturesGroup group = (FeaturesGroup) fd; EList<FeatureDefinition> groupedFeatures = group.getGroupedFeatures(); int maxCard = 0; for (FeatureDefinition fdef : groupedFeatures) { maxCard++; if (fdef instanceof Feature) { Feature vmfeature = (Feature) fdef; fr.familiar.attributedfm.Feature feat = new fr.familiar.attributedfm.Feature(vmfeature.getName()); // Adding translation info feat.nonTranstalable = vmfeature.isNotTranslatable(); feat.runTime = vmfeature.isRunTime(); feat.nonDecision = vmfeature.isNotDecidable(); // addding range (if not specified =1,1) if (vmfeature.getMin() != null && vmfeature.getMax() != null) { IntegerRange r = new IntegerRange(); r.add(vmfeature.getMin()); r.add(vmfeature.getMax()); feat.clone.add(r); } else { IntegerRange r = new IntegerRange(); r.getItems().add(1); feat.clone.add(r); } frel.addDestination(feat); } else if (fdef instanceof FeatureHierarchy) { Feature vmfeature = ((FeatureHierarchy) fdef).getParent(); fr.familiar.attributedfm.Feature feat = new fr.familiar.attributedfm.Feature(vmfeature.getName()); // adding translation info feat.nonTranstalable = vmfeature.isNotTranslatable(); feat.runTime = vmfeature.isRunTime(); if (vmfeature.getMin() != null && vmfeature.getMax() != null) { IntegerRange r = new IntegerRange(); r.add(vmfeature.getMin()); r.add(vmfeature.getMax()); feat.clone.add(r); } else { IntegerRange r = new IntegerRange(); r.getItems().add(1); feat.clone.add(r); } frel.addDestination(feat); visitFeatureHierarchy(feat, (FeatureHierarchy) fdef); } } if (fd instanceof Xorgroup) { frel.addCardinality(new Cardinality(1, 1)); } else if (fd instanceof Orgroup) { frel.addCardinality(new Cardinality(1, maxCard)); } ffeatroot.addRelation(frel); } else if (fd instanceof FeatureHierarchy) { String dest = ((FeatureHierarchy) fd).getParent().getName(); fr.familiar.attributedfm.Feature fdest = new fr.familiar.attributedfm.Feature(dest); frel.addDestination(fdest); ffeatroot.addRelation(frel); if (((FeatureHierarchy) fd).getParent().isOptional()) { frel.addCardinality(new Cardinality(0, 1)); } else if (!((FeatureHierarchy) fd).getParent().isOptional()) { frel.addCardinality(new Cardinality(1, 1)); } visitFeatureHierarchy(fdest, (FeatureHierarchy) fd); } } }