Feature

{
  "features" : [
    {
      "title" : "<string>",
      "fqn" : "<fully qualified name>",
      "alt" : "<if defined in xml>",
      "desc" : "<if defined in xml>",
      "info" : "<if defined in xml>",
      "tooltip" : "<if defined in xml>",
      "unitName" : "<if defined in xml, its without '-' like unit-name as in XML >",
      "sorting" : "<integer, if defined in xml>",
      "extId" : "<if defined in xml, its without '-' like ext-id in XML >",
      "parentFeature" : "<fqn of parent feature>",
      "isGroupMember" : "<boolean, check whether feature belongs to a group>",
      "isSingleton" : "<boolean, checker, see below>",
      "isSelected" : "<boolean, checker, see below>",
      "isSelectable" : "<boolean, checker, see below>",
      "isFinallyDeleted": "<boolean, checker, see below>",
      "isConsequence" : "<boolean, consequences cant be changed by user decision>",
      "isFinal" : "<boolean, checker, see below>",
      "isFinalAll" : "<boolean, checker, see below>",
      "int/enum/bool" : "[json array of attribute]",
      "features" : "[json array of features]",
      "groups" : "[json array of grouped features]"
    }
  ]
}

Status Checker

Ein Feature wird repräsentiert als Array von drei möglichen Werten: Selected, Restorable, Deleted. Es kann dabei während der Konfiguration einen oder mehrere dieser Werte gleichzeit annehmen, das definiert seinen Status. Wird das Feature nur durch einen dieser Werte repräsentiert, ist es Singleton.

  • isSelected ist true, wenn es Singleton ist und Value Selected.
  • canChange ist true, wenn es kein Singleton ist und den Value Restorable enhält (entweder select oder delete).
  • isSelectable ist true, wenn es kein Singleton ist und den Value Restorable sowie selected enhält.
  • isDeletable ist true, wenn es kein Singleton ist und den Value Restorable sowie deleted enhält.
  • isFinallyDeleted ist true, wenn es Singleton ist und SingletonValue == Deleted. (gegenstück zu isSelected)
  • Es gibt nur vier mögliche Value-Kombinationen: S, D, RD, SRD
  • Die Value Kombinationen SR, SD sowie R allein sind ausgeschlossen.

isSelectable bedeutet, das Feature kann mittels POST /decision/{fqn} oder PUT /decision/{fqn} selektiert oder gelöscht werden (Body contains State=’SELECT’ oder ‘DELETE’). isSelectable ist identisch zu canDecide. Die Bezeichnung ist historisch etwas unglücklich, bedeutet isSelectable lediglich, dass eine Auswahl getroffen werden darf. Diese Auswahl kann dann ‘Select’ oder ‘Delete’ sein.

  • POST Decision State=’Select’ kann auf den Zustand SRD wirken (Ergebnis: S), jedoch nicht auf RD.
  • POST Decision State=’Delete’ kann auf beide Zustände SRD und RD wirken (Ergebnis jeweils: D).

Die Feststellung, ob SRD oder RD vorliegt, ist von außen nicht ohne weiteres möglich, da hier der Kontextbezug der XML Sprachelemente ausgewertet werden muss (zB innerhalb der OneOf Gruppe wurde ein anderes Feature gewählt -> RD).

Daher sollte grundsätzlich ein PUT /decision/{fqn} für das Selektieren von Features verwendet werden, diese Funktion löst die möglicherweise vorab getroffene Nutzerentscheidung im Sprachkontext auf (zB innerhalb der OneOf Gruppe wurde ein anderes Feature gewählt). Intern wird dann zunächst die alte Nutzerentscheidung zur OneOf Gruppe zurückgenommen und die neue Selektion durchgeführt.

Diese asymmetrische Behandlung von POST /decision/{fqn} bzgl. State=’Select’ und State=’Delete’ resultiert daraus, dass wir davon ausgehen, dass in der Praxis der Fall ‘Etwas auswählen’ und via Nutzungskontext/Sprachconstraint andere Dinge damit abzuwählen weit häufiger Auftritt der umgekehrte Fall, die Auswahl dadurch herzustellen, dass der Nutzer alle anderen Optionen ausschließt bis das gewünschte Option als einzig verbleibendes Feature im Nutzungskontext übrig bleibt. Letzteres würde trotzdem funktionieren.

Weitere Konsequenzen für die möglichen Kombinationen der Checker:

  • isSelected und isSelectable sind niemals gleichzeitig true, sie können aber gleichzeitig false sein.
  • isDeleted und isSelectable sind niemals gleichzeitig true, sie können aber gleichzeitig false sein.
  • isSelected und isDeleted sind niemals gleichzeitig true, sie können aber gleichzeitig false sein.
  • ist isSingleton true, is entweder isSelected oder isDeleted true
  • ist etwas Singleton, kann keine Auswahl getroffen werden (isSelectable ist dann stets false)

isConsequence

Ist wahr, wenn der Status durch ein Model-Contraint infolge einer Nutzerentscheidung auf einem Anderen Sprachelement festgelegt wurde.

Ist falsch, wenn der Status nicht festgelegt ist oder durch eine direkte Nutzerentscheidung in Kombination mit einem Sprach-Constraint festgelegt wurde.

siehe auch Konzepte Typen von Constraints

isFinal / isFinalAll

Checker, ob das Feature und dessen Unter-Features sowie Attribute festgelegt sind. Verwendung ist ursprünglich gedacht für Schritt-Konfiguratoren, um festzustellen, ob der aktuelle Schritt fertig konfiguriert ist und man zum nächsten Schritt übergehen kann.

isFinal

prüft das Feature auf ‘selected’ oder ‘deleted’ sowie dessen ChildFeature (aber nicht Enkel) sowie Attribute auf ‘isSingleton’. Ist false, sobald ein ‘undecided’ oder ‘isSingleton == false’ vorkommt.

isFinalAll

wie isFinal, allerdings wird der komplette Baum traversiert (inkl Enkel, UrEnkel usw)