J'ai un modèle basé sur la fem. Dans le modèle j'ai une classe d'entités et aux fonctionnalités je peux ajouter une contrainte. par exemple Feature A "IMPLIES" fonctionnalité B. J'essaie d'ajouter une contrainte à une fonctionnalité en utilisant la pile de commande emf. Il ajoute la contrainte à l'entité mais avec des attributs manquants. Mon code est le suivantAjout à un modèle emf
public static Object doExecute(Feature contextFeature, FeatureModel featureModel, ComposedAdapterFactory adapterFactory) {
CreateConstraintDialog dlg = new CreateConstraintDialog(Display.getCurrent().getActiveShell(), contextFeature, featureModel, adapterFactory);
dlg.open();
// check if dialog was cancelled:
if (dlg.getReturnCode() == Window.CANCEL)
return null;
Feature selectedFeature = dlg.getSelectedFeature();
if (selectedFeature == null)
return null;
ConstraintType selectedConstraintType = dlg.getSelectedConstraintType();
Constraint constraint = FmFactory.eINSTANCE.createConstraint();
constraint.setType(selectedConstraintType);
constraint.setConstrainedFeature(selectedFeature);
constraint.setContext(contextFeature);
EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(contextFeature);
Command cmd = AddCommand.create(editingDomain, contextFeature, FmPackage.FEATURE__CONSTRAINTS, constraint);
editingDomain.getCommandStack().execute(cmd);
return null;
}
EDIT
Lorsque je supprime constraint.setContext (contextFeature); à partir du code ci-dessus, l'éditeur est informé de la modification (i-e une nouvelle contrainte est ajoutée à l'entité) mais l'attribut de contexte est manquant car il n'est pas défini.
La méthode est la suivante setContext
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setContext(Feature newContext) {
if (newContext != eInternalContainer() || (eContainerFeatureID() != FmPackage.CONSTRAINT__CONTEXT && newContext != null)) {
if (EcoreUtil.isAncestor(this, newContext))
throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
NotificationChain msgs = null;
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
if (newContext != null)
msgs = ((InternalEObject)newContext).eInverseAdd(this, FmPackage.FEATURE__CONSTRAINTS, Feature.class, msgs);
msgs = basicSetContext(newContext, msgs);
if (msgs != null) msgs.dispatch();
}
else if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, FmPackage.CONSTRAINT__CONTEXT, newContext, newContext));
}
Le code ci-dessus Ajouter une contrainte à la fonction, mais le contexte est manquant. Toute idée
Merci
quand je viens de définir les setters de la contrainte après que dois-je exécuter la commande? vérifier le code mis à jour – wearybands
Le problème avec ce code est qu'il ne détecte pas l'ajout de contrainte ie changement dans le modèle et donc mon éditeur ne va pas dans l'état sale car sur save j'écris l'objet modèle à xmi – wearybands
comme si tout allait bien dans le bon ordre. La commande AddCommand génère des notifications au niveau de l'objet, pas au niveau de la contrainte. Comment votre éditeur est-il configuré pour écouter les changements? –