Uso un motore di trasformazione per creare un meta-modello Ecore in fase di esecuzione e mi chiedo come possiamo registrare quel meta-modello con EMF in modo che possa riconoscere il meta-modello?Registra meta-modello Ecore programmaticamente
risposta
Se avete il codice generato dal tuo metamodel:
resourceSet.getPackageRegistry()
.put(org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE.getNsURI()
, org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE);
(qui per la metamodello "genmodel")
se avete solo il file .ecore
:
// register globally the Ecore Resource Factory to the ".ecore" extension
// weird that we need to do this, but well...
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
"ecore", new EcoreResourceFactoryImpl());
ResourceSet rs = new ResourceSetImpl();
// enable extended metadata
final ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(rs.getPackageRegistry());
rs.getLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA,
extendedMetaData);
Resource r = rs.getResource(uriOfYourModel, true);
EObject eObject = r.getContents().get(0);
if (eObject instanceof EPackage) {
EPackage p = (EPackage)eObject;
rs.getPackageRegistry().put(p.getNsURI(), p);
}
Puoi trovare ulteriori informazioni su questo codice here con il metodo registerEcorePackages()
, u sed per registrare il file .ecore
nello spazio di lavoro (con il relativo percorso completo dell'area di lavoro) nel nostro registro dei pacchetti personalizzato. Se si desidera registrare il proprio metamodello nel registro globale dei pacchetti EMF, sostituire resourceSet.getPackageRegistry()
entro il EPackage.Registry.INSTANCE
.
ho dovuto modificare il codice da @sbegaudeau un po 'per farlo funzionare:
Sostituire
rs.getPackageRegistry().put(p.getNsURI(), p);
con
EPackage.Registry.INSTANCE.put(p.getNsURI(), p);
Inoltre, in qualche modo non riesco a registrare il tipo .ecore. Ho dovuto usare "*": Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());
Grazie mille per la tua risposta Stephane :) – capint
RISPOSTA SUPERBILE !!!!!! Grazie mille Stephane! Non posso ringraziarti abbastanza ..... La tecnica del "file ecore" è ciò che sto cercando! –
Ciao, fantastico grazie! Ho dovuto modificare il codice un po 'per farlo funzionare. Si prega di vedere la mia risposta per i dettagli. – Andrei