juillet
2009
Dans le billet précédant [step2] nous avons géré les références EMF entre actions et states pour pouvoir utiliser le nom (name) des states pour les référencer dans les actions via les attributs fromState et toState. Nous souhaitons ajouter une page Source dans l’éditeur de workflow qui sera composée d’un editeur de Texte ou il sera possible de saisir le contenu XML du workflow. Une problématique complexe apparaît : comment synchroniser le contenu XML saisi dans l’éditeur texte avec l’instance EMF WorkflowType? Dans notre cas nous allons utiliser les Translator WST et je tenterai d’énumérer leur avantages/inconvéniants. Plus précisement dans ce billet nous allons initialiser les Translator WST pour synchroniser les élements EMF WorkflowType, ActionType, StateType et leur attribut name avec un éditeur de texte. Le cas des attributs fromState et toState (références à des StateType) ne sera pas traité dans ce billet.
Vous pouvez télécharger le projet org.example.workflow_step3.zip présenté dans ce billet.
Test synchronisation Text Editor – Instance EMF
Avant de commencer le billet, étudions le problème de la synchronisation éditeur de texte et l’instance EMF dans le projet du billet précédant [step2]. Pour effectuer ce test, ouvrez le fichier My.workflow dans l’editor Workflow Model Editor puis ouvrez ce même fichier dans l’éditor de text (Open With Text Editor) et mettez ces 2 éditors côte à côte. Dans l’éditor de texte, modifiez le nom de l’action name a1 par a2.
On peut remarquer que Workflow Model Editor n’est pas synchronisé avec la nouvelle valeur name de l’action, autrement dit l’éditeur de texte ne met pas à jour l’instance EMF.
Effectuons le test inverse, autrement dit modifiez le nom de l’action via le Workflow Model Editor :
On peut remarquer que le Text Editor n’est pas synchronisé avec la nouvelle valeur name de l’action, autrement dit la mise à jour de l’instance EMF (via Workflow Model Editor) n’est pas synchronisé avec le Text Editor.
Synchronisation editeur texte/EMF
De ce que j’ai pu étudier il existe 3 type de solutions pour synchroniser une page Source (constitué d’un éditeur texte) avec EMF :
- synchronisation par onglet : cette solution ne synchronise pas l’instance EMF avec la page Source lorsque l’utilisateur saisi du texte dans l’éditeur texte. La synchronisation d’une page A avec le contenu de la page Source s’effectue lorsque l’on clique sur l’onglet de la page A et inversement (notre test ci dessus avec un éditeur texte NON inclu dans l’éditor ne marcherait pas non plus).
- synchronisation globale de l’instance EMF : cette approche consiste a recharger totalement l’instance EMF à chaque fois que l’utilisateur saisi du texte. Un listener est branché sur la l’éditeur texte de la page source et recharge l’instance EMF. C’est l’approche utilisée à ce jour dans PDE Incubator.
- synchronisation partielle de l’instance EMF : cette approche consiste à synchroniser le contenu XML de l’editeur texte de la page Source avec l’instance EMF. Lorsque l’utilisateur saisi du texte, l’instance EMF est mise a jour (elle n’est pas re-créée à chaque fois) avec le nouveau contenu XML. C’est l’approche utilisée à ce jour dans JSF Webtools qui utilise les Translator WST et c’est celle-ci que nous allons utilisé.
Translator WST
Le projet WST est capable de gérér des documents structurés (DOM, CSS…) appelé SSE. Si vous souhaitez avoir plus d’information sur ce sujet, veuillez consulter le billet Tutorial WST- DOM SSE [Step 0].
Avec SSE, a partir d’un contenu XML d’un org.eclipse.core.resources.IFile (fichier Eclipse du workspace, qui sont utilisés dans les éditors), il est possible de charger au mieux un Document DOM (appelé DOM-SSE) même si le contenu XML n’est pas valide. L’instance IFile et le DOM-SSE sont totalement synchronisé, autrement dit si le contenu du IFile se modifie, le DOM-SSE se modifie et inversement sans être obligé de sauvegarder le IFile. Lorsque le contenu d’un IFile se rafraîchit (alors qu’il n’est pas sauvegardé), n’importe quel éditeur qui a édité cet IFile se rafraichit aussi avec le nouveau contenu.
Il reste donc à synchroniser le DOM-SSE à l’instance EMF pour que la modification de l’instance EMF rafraîchisse le DOM-SSE qui rafraîchisse le IFile associé et inversement. La synchronisation entre le DOM-SSE et l’instance EMF s’effectue à l’aide de la classe org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer qui utilise les Translator WST.
Les Translator WST définissent un mapping entre le nom d’un noeud XML (ex : workflow) et un meta object EMF (ex : le EClass de WorkflowType). Dans notre cas nous allons implémenter les Translator WST qui permettent de lier les élements XML (workflow, state, action) et les attributs (name) aux différents méta object EMF (Eclass de WorkflowType, EReference de StateType, EReference de ActionType….). Les attributs fromState, toState ne seront pas traités dans ce billet et seront traités dans le billet suivant.
Workflow – Translator WST
Pour utiliser les Translator, il faut tout d’abord ajouter 2 dépendances :
- org.eclipse.wst.common.emf : ce plugin contient les classes Translator WST.
- org.eclipse.wst.xml.core : ce plugin contient la classe org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer.
Add Dependency
Ajouter une dépendance dans un plugin s’effectue en ajoutant celle-ci dans le fichier MANIFEST.MF de votre plugin. PDE propose une vue qui permet de gérér ces dépendances. Pour cela ouvrez le fichier MANIFEST.MF avec l’éditeur « Plug-in Manfest Editor » (double cliquez sur le fichier). Pour ajouter la dépendance org.eclipse.wst.common.emf à votre plugin Eclipse, cliquez sur le lien Dependencies puis sur le bouton Add. Une fenêtre de dialogue s’ouvre et vous pouvez tappez la dépendance (plugin) à ajouter. Dans notre cas tappez org.eclipse.wst.common.emf :
Après avoir validé, si vous cliquez sur l’onglet MANIFEST.MF, vous pouvez constater que la dépendance org.eclipse.wst.common.emf;bundle-version= »1.1.203″ a été ajouté avec le numéro de version du plugin 1.1.203.
Ce numéro de version permet de spécifier le numéro de version minimum à avoir pour executer son plugin. Dans notre cas nous utilisons les fonctionnalités basiques de WST, nous pouvons enlever la version, autrement dit supprimer la chaîne de caratère ;bundle-version= »1.1.203″ :
WorkflowTranslator
Nous pouvons commencer à développer le translator WorkflowTranslator qui est le mapping entre nos méta object EMF de Workflow et le nom des élements XML du DOM. Nos méta objets en EMF sont obtenus à l’aide de l’interface org.example.workflow.model.WorkflowPackage généré par EMF. Pour récupérer le méta objet WorkflowType par exemple, il suffit d’appeler le code suivant :
EClass eClass = WorkflowPackage.eINSTANCE.getWorkflowType();
Dans ce billet nous allons crééer les mappings XML/EMF (Meta Object) suivants :
Nom element XML | Nom attribut XML | EMF (Meta Objet) | Type EMF |
---|---|---|---|
workflow | WorkflowPackage.eINSTANCE.getWorkflowType() | EClass | |
state | WorkflowPackage.eINSTANCE.getWorkflowType_State() | EReference | |
state | name | WorkflowPackage.eINSTANCE.getStateType_Name() | EAttribute |
action | WorkflowPackage.eINSTANCE.getWorkflowType_Action() | EReference | |
action | name | WorkflowPackage.eINSTANCE.getAction_Name() | EAttribute |
Pour cela créer dans le projet org.example.workflow la classe org.example.workflow.model.util.WorkflowTranslator qui étend org.eclipse.wst.common.internal.emf.resource.RootTranslator comme suit :
import org.eclipse.wst.common.internal.emf.resource.GenericTranslator;
import org.eclipse.wst.common.internal.emf.resource.RootTranslator;
import org.eclipse.wst.common.internal.emf.resource.Translator;
import org.example.workflow.model.WorkflowPackage;
public class WorkflowTranslator extends RootTranslator {
public static RootTranslator INSTANCE = new WorkflowTranslator();
public WorkflowTranslator() {
super("workflow", WorkflowPackage.eINSTANCE.getWorkflowType());
}
protected Translator[] getChildren() {
return new Translator[] { createStateTranslator(),
createActionTranslator() };
}
private Translator createStateTranslator() {
GenericTranslator translator = new GenericTranslator("state",
WorkflowPackage.eINSTANCE.getWorkflowType_State());
translator.setChildren(new Translator[] { new Translator("name",
WorkflowPackage.eINSTANCE.getStateType_Name(),
Translator.DOM_ATTRIBUTE), });
return translator;
}
private Translator createActionTranslator() {
GenericTranslator translator = new GenericTranslator("action",
WorkflowPackage.eINSTANCE.getWorkflowType_Action());
translator.setChildren(new Translator[] {
new Translator("name", WorkflowPackage.eINSTANCE
.getActionType_Name(), Translator.DOM_ATTRIBUTE), });
return translator;
}
}
Le constructeur de WorkflowTranslator indique que l’élément XML workflow est mappé avec le meta object EClass EMF WorkflowType :
super("workflow", WorkflowPackage.eINSTANCE.getWorkflowType());
}
Un workflow est constitué d’une liste de StateType puis d’une liste de ActionType. Pour indiquer que l’élément XML workflow attend des noeuds XML enfants (state et action), la méthode Translator#getChildren() est implémentée comme suit :
return new Translator[] { createStateTranslator(),createActionTranslator() };
}
La méthode createStateTranslator géré le mapping d’un élement StateType.
GenericTranslator translator = new GenericTranslator("state", WorkflowPackage.eINSTANCE.getWorkflowType_State());
translator.setChildren(new Translator[] { new Translator("name", WorkflowPackage.eINSTANCE.getStateType_Name(), Translator.DOM_ATTRIBUTE), });
return translator;
}
GenericTranslator est une implementation de Translator qui gère un mapping simple entre un element XML et un meta object EClass. Le code :
GenericTranslator("state", WorkflowPackage.eINSTANCE.getWorkflowType_State());
permet de mapper l’element XML state avec le meta object EClass StateType. L’attribut XML name est mappé avec le meta object EAttribute getStateType_Name. Ceci s’effectue à l’aide du code :
new Translator("name", WorkflowPackage.eINSTANCE.getStateType_Name(), Translator.DOM_ATTRIBUTE)
ATTENTION a la casse des noms des noeud XML mis dans les Translator!!!
WorkflowResourceImpl
La classe WorkflowResourceImpl doit être modifiée pour utiliser notre Translator WorkflowTranslator. Pour cela, la classe WorkflowResourceImpl doit étendre l’implémentation WST de EMF Resource org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl.
Modifier la classe WorkflowResourceImpl comme suit :
import org.eclipse.emf.common.util.URI;
import org.eclipse.wst.common.internal.emf.resource.Renderer;
import org.eclipse.wst.common.internal.emf.resource.Translator;
import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl;
/**
* <!-- begin-user-doc -->
* The <b>Resource </b> associated with the package.
* <!-- end-user-doc -->
* @see org.example.workflow.model.util.WorkflowResourceFactoryImpl
* @generated NOT
*/
public class WorkflowResourceImpl extends TranslatorResourceImpl {
/**
* Creates an instance of the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @param uri the URI of the new resource.
* @generated NOT
*/
// public WorkflowResourceImpl(URI uri) {
// super(uri);
// }
public WorkflowResourceImpl(URI uri, Renderer renderer) {
super(uri, renderer);
}
public Translator getRootTranslator() {
return WorkflowTranslator.INSTANCE;
}
protected String getDefaultPublicId() {
return null;
}
protected String getDefaultSystemId() {
return null;
}
protected int getDefaultVersionID() {
return 0;
}
public String getDoctype() {
return null;
}
} //WorkflowResourceImpl
Le constructeur WorkflowResourceImpl attend un nouveau paramètre renderer de type org.eclipse.wst.common.internal.emf.resource.Renderer
qui est une interface qui définit l’API pour rendre un objet EMF en XML et inversement.
super(uri, renderer);
}
Dans notre cas, le paramètre sera une instance de org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer.
La méthode TranslatorResource#getRootTranslator() retourne le Translator racine à utiliser. Dans notre cas on retourne une instance de WorkflowTranslator, plus exactement un singleton :
return WorkflowTranslator.INSTANCE;
}
ATTENTION a bien mettre les @generated NOT pour ne pas écraser les modifications effectuées lors de la prochaine re-génération.
WorkflowResourceFactoryImpl
La classe WorkflowResourceFactoryImpl qui est la factory de WorkflowResourceImpl doit étendre org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory.
Modifier la classe WorkflowResourceFactoryImpl comme suit :
* <copyright>
* </copyright>
*
* $Id$
*/
package org.example.workflow.model.util;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.wst.common.internal.emf.resource.Renderer;
import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory;
import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERendererFactory;
/**
* <!-- begin-user-doc --> The <b>Resource Factory</b> associated with the
* package. <!-- end-user-doc -->
*
* @see org.example.workflow.model.util.WorkflowResourceImpl
* @generated NOT
*/
public class WorkflowResourceFactoryImpl extends TranslatorResourceFactory {
/**
* Creates an instance of the resource factory. <!-- begin-user-doc --> <!--
* end-user-doc -->
*
* @generated NOT
*/
public WorkflowResourceFactoryImpl() {
// super();
super(EMF2DOMSSERendererFactory.INSTANCE.getDefaultRendererFactory());
}
/**
* Creates an instance of the resource. <!-- begin-user-doc --> <!--
* end-user-doc -->
*
* @generated NOT
*/
@Override
// public Resource createResource(URI uri) {
protected TranslatorResource createResource(URI uri, Renderer renderer) {
TranslatorResource result = new WorkflowResourceImpl(uri, renderer);
result.getDefaultSaveOptions().put(
XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
result.getDefaultLoadOptions().put(
XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
result.getDefaultSaveOptions().put(XMLResource.OPTION_SCHEMA_LOCATION,
Boolean.TRUE);
// result.getDefaultLoadOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE,
// Boolean.TRUE);
// result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE,
// Boolean.TRUE);
result.getDefaultLoadOptions().put(
XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
return result;
}
} // WorkflowResourceFactoryImpl
Le constructeur de WorkflowResourceFactoryImpl renseigne la factory de Renderer attendu, dans notre cas la factory utilisée retournera des instances de org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer :
super(EMF2DOMSSERendererFactory.INSTANCE.getDefaultRendererFactory());
}
La classe abstraite TranslatorResourceFactory impose d’implémenter la méthode createResource(URI uri, Renderer renderer) qui est implémentée dans notre cas comme ceci :
TranslatorResource result = new WorkflowResourceImpl(uri, renderer);
...
return result ;
}
ATTENTION a bien mettre les @generated NOT pour ne pas écraser les modifications effectuées lors de la prochaine re-génération.
Content Type
Relancez le plugin, et lorque vous ouvrez le fichier My.workflow vous aurrez cette erreur :
J’ai passé un temps fou à débugger les sources de WST, et cette erreur vient du fait que l’extension *.workflow de notre fichier n’est pas reconnu comme un content type XML. Le DOM-SSE dans ce cas-ci ne peut pas se charger. Dans la suite de nos billets ceci ne posera pas de problèmes car nous utiliserons l’extension *.xml, mais à notre stade pour gérér correctement l’extension *.workflow, la solution que j’ai trouvé est d’ajouter l’extension *.workflow au content type DOM-SSE org.eclipse.wst.xml.core.xmlsource. Voici le code qui permet d’ajouter l’extension *.workflow aux content type org.eclipse.wst.xml.core.xmlsource :
getContentType("org.eclipse.wst.xml.core.xmlsource").addFileSpec("workflow", IContentTypeSettings.FILE_EXTENSION_SPEC);
Et voici le même code mais avec l’utilisation de la constante WST org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML.ContentTypeID_SSEXML:
ContentTypeIdForXML.ContentTypeID_SSEXML).addFileSpec("workflow", IContentTypeSettings.FILE_EXTENSION_SPEC);
Voici le code pour supprimer l’extension workflow aux content type org.eclipse.wst.xml.core.xmlsource :
ContentTypeIdForXML.ContentTypeID_SSEXML).removeFileSpec("workflow", IContentTypeSettings.FILE_EXTENSION_SPEC);
L’ajout de l’extension workflow s’effectue lorsque notre plugin Workflow Editor sera lancé dans la méthode start de la classe Implementation de la classe org.example.workflow.presentation.WorkflowEditorPlugin et la suppression dans la méthode stop. Pour cela ajouter la dépendance org.eclipse.wst.xml.core dans le projet org.example.workflow.editor pour pouvoir utiliser la constante ContentTypeIdForXML.ContentTypeID_SSEXML. Puis ajouter le code suivant dans la classe Implementation de org.example.workflow.presentation.WorkflowEditorPlugin:
...
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
Platform.getContentTypeManager().getContentType(
ContentTypeIdForXML.ContentTypeID_SSEXML).addFileSpec(
"workflow", IContentTypeSettings.FILE_EXTENSION_SPEC);
}
@Override
public void stop(BundleContext context) throws Exception {
super.stop(context);
Platform.getContentTypeManager().getContentType(
ContentTypeIdForXML.ContentTypeID_SSEXML).removeFileSpec(
"workflow", IContentTypeSettings.FILE_EXTENSION_SPEC);
}
}
Relancez le plugin, l’editeur de Workflow n’a plus d’erreur mais son instance EMF est vide :
Ce problème est du au fait de l’utilisation du prefix workflow: devant chaque elements XML :
<workflow:workflow xmlns:workflow="http://www.example.org/workflow">
<workflow:state name="s1"/>
<workflow:state name="s2"/>
<workflow:action name="a1" fromState="s1" toState="s2"/>
</workflow:workflow>
Enlevez le préfix workflow: du fichier My.workflow:
<workflow xmlns:workflow="http://www.example.org/workflow">
<state name="s1"/>
<state name="s2"/>
<action name="a1" fromState="s1" toState="s2"/>
</workflow>
Fermer et ré-ouvrez l’éditeur de Workflow et vous pourrez constater que l’instance EMF est bien chargée. Je n’ai pas creusé sur ce point et je ne sais pas gérer le cas ou le élements sont préfixés par un namespace, mais dans notre cas, notre XML n’utlisera pas de préfixe.
Test Translator WST
Test synchronisation Text Editor – Instance EMF avec Translator WST
Effectuons les test de synchronisation comme effectué au début de ce billet. Si vous modifiez dans l’éditeur de texte le nom name de l’action par a3, l’éditor de workflow se met à jour (sans sauvegarde) :
Par contre l’état dirty de l’éditor de workflow, représenté graphiquement par le charactère * dans l’onglet des éditeur n’est pas mis à jour. En effet l’instance EMF a changé mais l’éditor de workflow ne se met pas en dirty (pour être ensuite sauvegardé).
Si vous modifiez dans la vue Properties la nom name par a2, ceci modifie l’instance EMF qui modifie l’éditeur Texte :
Dans ce cas-ci l’état dirty de l’éditeur texte se met à jour correctement.
Sauvegarde Editeur Workflow
Lorsque vous modifiez l’instance EMF à partir de l’éditeur de workflow puis que vous sauvegardez l’éditeur, vous pouvez remarquer que la sauvegarde ne fonctionne plus. Si vous regardez dans la console Eclipse (qui contient les projets) vous pouvez visualiser l’exception suivante :
at org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer.doSave(EMF2DOMSSERenderer.java:250)
at org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl.doSave(TranslatorResourceImpl.java:180)
at org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl.save(TranslatorResourceImpl.java:160)
at org.example.workflow.presentation.WorkflowEditor$18.execute(WorkflowEditor.java:1489)
at org.eclipse.ui.actions.WorkspaceModifyOperation$1.run(WorkspaceModifyOperation.java:104)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1800)
at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:116)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
La ligne de code EMF2DOMSSERenderer.java:250 qui pose problème est la suivante :
ResourceSetWorkbenchEditSynchronizer synchronizer = (ResourceSetWorkbenchEditSynchronizer) ((ProjectResourceSet) resource.getResourceSet()).getSynchronizer();
Le ResourceSet de EMF Resource est casté en ProjectResourceSet alors que dans notre cas nous avons ResourceSet. Je n’ai pas pris le temps de décortiquer les sources de WST concernant ce sujet (ProjectResourceSet, c’est quoi?) car dans le billet suivant nous allons changer la stratégie de sauvegarde. En effet nous allons effectuer la même chose que JSF Webtools, autrement dit déléguer la sauvegarde de l’éditor à la page qui contient l’editeur de texte et plus comme aujourd’hui effectuer la sauvegarde via la Resource EMF. Ce sujet sera détaillé dans le prochain billet et je pense que je vais en faire hurler plus d’un avec ce choix de stratégie de sauvegarde, mais j’ai fais le choix de sauvegarder exactement ce que l’utilisateur saisit, même si le contenu saisit ne suit pas le schéma XML.
Conclusion sur les Translator WST
Avantage :
- Synchronise parfaitement une instance EMF avec un contenu XML provenant d’un IFile.
Inconvéniant :
- Aucune documentation. La seul documentation que j’ai pu trouvé est l’article Persisting EMF models with WTP
- n’utilise pas l’ECore. Le mapping XML <-> Ecore doit être effectué à la main.
- ne fonctionne pas dans une application RCP qui n’utilise pas les IFile.
- comment gérer les nom des élements XML avec prefix?.
4 Commentaires + Ajouter un commentaire
Articles récents
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step5]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step4]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step3]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step2]
- Conception d’un client Eclipse RCP et serveur OSGI avec Spring DM [step1]
Commentaires récents
- Conception d’un Editeur Eclipse de workflow XML [step 0] dans
- Conception d’un Editeur Eclipse de workflow XML [step 19] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
- Conception d’un Editeur Eclipse de workflow XML [step 7] dans
Je vous remercie infiniment pour ce tuto vous me sauvez la vie, Mr je n’arrive pas à modifier org.eclipse.wst.xml.core.xmlsource pour ajouter l’extension *.workflow au content type DOM-SSE svp je suis bloqué
Bonjour snatiz87,
Je suis ravi que mes tutos puissent t’aider. Pour les espaces de noms, je n’ai malheursement pas trouvé de solution à ce jour. Pour savoir utiliser les Translator WST je n’ai eu que la solution de debugguer pas à pas DOM-SSE car la documentation il n’y en a pas beaucoup. Je n’ai jamais utilisé NamespaceTranslator.
Bon courage.
Angelo
je ne sais pas comment utiliser cette classe
Bonjour Angelo,
Je te remercie infiniment pour ce bon tuto.
est ce que tu as trouvé une solution pour les espaces de noms??
j’ai effectuer une recherche sur le net,et j’ai trouvé qu’une seule classe qui répond apparemment à ce problème,mais je sais comment l’utiliser.
http://demo.spars.info/j/frameset.cgi?compo_id=205603&packagename=org.eclipse.wst.common.internal.emf.resource&componame=org.eclipse.wst.common.internal.emf.resource.NamespaceTranslator&mode=frameset&ref=5&start_class=30&location=1111111111111111111&CASE=0&MORPHO=1&LANG=1&q=getnavigationrule&hl=getnavigationrule&compo_id=205604
Merci d’avance