namespace feature.models; import datatypes; import feature.metamodel; FeatureModel(Example){ FeatureTree(Example_FT){ MandOpt(HomeAuto){ String(Name) -> "HomeAuto"; Feature.name(R_name,HomeAuto,Name); Or(Surveil){ String(Name) -> "Surveil"; Feature.name(R_name,Surveil,Name); MandOpt(MotionDet){ String(Name) -> "MotionDet"; Feature.name(R_name,MotionDet,Name); } Or.orFeature(R_o1,Surveil,MotionDet); MandOpt(AccidentDet){ String(Name) -> "AccidentDet"; Feature.name(R_name,AccidentDet,Name); } Or.orFeature(R_o2,Surveil,AccidentDet); } MandOpt.mandatory(R_m,HomeAuto,Surveil); MandOpt(AlarmAuto){ String(Name) -> "AlarmAuto"; Feature.name(R_name,AlarmAuto,Name); Or(Alarm){ String(Name) -> "Alarm"; Feature.name(R_name,Alarm,Name); MandOpt(Siren){ String(Name) -> "Siren"; Feature.name(R_name,Siren,Name); } Or.orFeature(R_o1,Alarm,Siren); MandOpt(Bell){ String(Name) -> "Bell"; Feature.name(R_name,Bell,Name); } Or.orFeature(R_o2,Alarm,Bell); } MandOpt.mandatory(R_m,AlarmAuto,Alarm); } MandOpt.optional(R_op1,HomeAuto,AlarmAuto); MandOpt(EnergySaving){ String(Name) -> "EnergySaving"; Feature.name(R_name,EnergySaving,Name); MandOpt(ClimateCtrl){ String(Name) -> "ClimateCtrl"; Feature.name(R_name,ClimateCtrl,Name); } MandOpt.optional(R_op,EnergySaving,ClimateCtrl); Xor(WhiteGoodsCtrl){ String(Name) -> "WhiteGoodsCtrl"; Feature.name(R_name,WhiteGoodsCtrl,Name); MandOpt(SmartCtrl){ String(Name) -> "SmartCtrl"; Feature.name(R_name,SmartCtrl,Name); } Xor.xor(R_x1,WhiteGoodsCtrl,SmartCtrl); MandOpt(Remote){ String(Name) -> "Remote"; Feature.name(R_name,Remote,Name); } Xor.xor(R_x2,WhiteGoodsCtrl,Remote); } MandOpt.mandatory(R_m,EnergySaving,WhiteGoodsCtrl); } MandOpt.optional(R_op2,HomeAuto,EnergySaving); } FeatureTree.root(R_root,Example_FT,HomeAuto); } FeatureModel.tree(R_tree,Example,Example_FT); Requires(Example_Req){ Constraint.feature(R_f1,Example_Req,Example_FT.HomeAuto.Surveil.AccidentDet); Constraint.feature(R_f2,Example_Req,Example_FT.HomeAuto.AlarmAuto); } FeatureModel.constraint(R_constraint,Example,Example_Req); }