Esempio n. 1
0
  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);
      }
    }
  }