2015-03-26 4 views
1

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

Répondre

0

Comme vous venez de créer l'instance constraint il n'y a pas besoin d'utiliser des commandes pour définir ses attributs comme il est pas encore attaché à un modèle EMF. Vous pouvez simplement appeler les méthodes setter. L'endroit où vous souhaitez utiliser une commande est simplement d'ajouter constraint à votre fonctionnalité existante.

ne sont pas liés, mais vous devez également toujours appeler la méthode canExecute sur la commande avant de l'exécuter:

CompoundCommand cmd = ....; 
if (cmd.canExecute()) { 
    editingDomain.getCommandStack().execute(cmd); 
} 
+0

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

+0

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

+0

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? –