Domanda

EMF = Eclipse Modeling Framework

devo usare campi elettromagnetici in uno dei miei progetti di classe. Sto cercando di capire come utilizzare EMF a effettuare le seguenti operazioni:

  1. Leggi XML,
  2. ottenere i valori in oggetti.
  3. Usa ORM a persistere i valori negli oggetti di database. - Fatto
  4. ottenere i dati dal database mediante ORM e generare XML.

ho bisogno di fare tutto questo utilizzando:. EMF (idea di cosa così mai) e JPA (FATTO)

Ho usato JAXB e so, questo può essere fatto utilizzando JAXB, ma come è (EMF == JAXB)?!

Ho creato molte classi Java utilizzando campi elettromagnetici, ma ci sono così tanti di loro! Dove faccio a implementare i metodi di lettura / scrittura e come si esegue il progetto EMF?

Grazie

Update1 SUGGERIMENTO http://www.eclipsezone.com/eclipse/forums/t58829.html

UPDATE2

Ho schema e ho generato il codice del modello utilizzando il XSD. Ora sto avendo problema nella lettura dei dati dal file XML.

È stato utile?

Soluzione

EMF serializza il modello di dati utilizzando (il valore predefinito, modo più popolare) XMIResourceImpl, che rigorosamente utilizza il formato XMI, e non una struttura XML personalizzato .

per articoli su EMF e dei suoi casi d'uso Vedere http://eclipsedriven.blogspot.com/ .

Sono d'accordo con gli altri answerers che campi elettromagnetici non è probabilmente ciò che si vuole qui.

Se ho voglia di utilizzare campi elettromagnetici con una struttura XML personalizzato (vale a dire non XMI), probabilmente sarei usare JAXB al maresciallo / unmarshalling miei oggetti EMF (EObjects).

Quindi EMF non è lo stesso di JAXB e hanno diversi scopi e obiettivi. In realtà è probabilmente possibile combinare campi elettromagnetici e JAXB in qualche modo. Non ho mai provato, ma sembra che ci siano validi usi casi. (Come ho detto sopra, per il marshalling / oggetti EMF unmarshalling da / XML)

Per capire EMF è necessario far passare il proprio paradigma. Per un inizio rimuovere la parte "XML", lasciarlo andare dalla tua mente. Allora vi consiglio di effettuare le seguenti operazioni:

  1. Crea un progetto EMF vuoto.
  2. Creare un semplice file Ecore (.ecore), o scarica da Internet. O l'importazione da qualsiasi file di schema / UML XML in un modello Ecore.
  3. Fare clic destro su un EClass quindi "Crea dinamica Instance", questo creerà un file .xmi.
  4. Aprire il file .xmi, con Eclipse, si aprirà l'Editor EMF per quel modello. Modifica come si vede in forma.
  5. Controllare il contenuto della (a cura) File .xmi. Vedrai che il formato esattamente conforme al modello Ecore. Non sarà in grado di cambiare / personalizzare la mappatura dal modello <-> file XMI, perché, come dice il nome, XMIResourceImpl legge solo / salva i file XMI (che risulta essere implementato in cima XML), ma non legge / salva formato XML arbitrario.

EMF ha il supporto per la lettura / scrittura di metamodelli XML Schema (ad esempio file XSD) al fine di convertirli in un metamodello Ecore, ma non i file XML che è conforme a tale schema (nemmeno per Ecore), a meno che questi file sono in formato XMI.

Per persistente modelli EMF in un database relazionale, vedi: http://eclipsedriven.blogspot.com/2010 /12/persisting-emf-objects-to-rdbms-with.html

sto usando Teneo. (E facoltativamente, CDO)

Per quanto riguarda "XML", se vi limitate a XMI e accontentarsi di esso, EMF renderà la vostra vita molto semplice, in quanto non c'è bisogno di fare qualsiasi mappatura (a differenza di JAXB). Il rovescio della medaglia è che i nostri oggetti devono essere EMF oggetti.

EMF oggetti sono oggetti che sono generati da campi elettromagnetici e realizza EObject e direttamente o indirettamente estende EObjectImpl. Di solito non vorrebbe codificare campi elettromagnetici oggetti a mano, che sarebbe stato un lavoro di routine. D'altra parte, JAXB "oggetti" sono di solito POJO oggetto puro dominio e non ha alcun requisito aggiuntivo da JAXB. Si noti che a differenza di JAXB, EMF Gli oggetti non sono POJO. Questo spiega un altro obiettivo diverso tra campi elettromagnetici e JAXB. La loro sovrapposizione è meno di quanto si potrebbe immaginare.

Lettura da XMI (non XML) è molto semplice:

XMIResource resource = new XMIResourceImpl(URI.create("file:/path/to/mymodel.xmi"));
resource.load(null);
System.out.println( resource.eContents().get(0) );

Altri suggerimenti

Si può leggere file XML arbitrari con EMF, a patto di avere il XSD per loro, e non hanno nemmeno bisogno di generare classi Java dal XSD.
Ho bloggato su questo un paio di mesi fa, ma io incollare i frammenti di codice anche qui. Per una spiegazione un po 'più dettagliata si veda il mio post sul blog su Come caricare e confrontare i file XML arbitrari con EMF .

Per prima cosa bisogna caricare il XSD e inizializzare un paio di cose:

// generate EPackages from schemas
XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder();
Collection generatedPackages = xsdEcoreBuilder.generate(schemaURI);

// register the packages loaded from XSD
for (EObject generatedEObject : generatedPackages) {
    if (generatedEObject instanceof EPackage) {
        EPackage generatedPackage = (EPackage) generatedEObject;
        EPackage.Registry.INSTANCE.put(generatedPackage.getNsURI(),
            generatedPackage);
    }
}

// add file extension to registry
ResourceFactoryRegistryImpl.INSTANCE.getExtensionToFactoryMap()
    .put(MY_FILE_EXTENSION, new GenericXMLResourceFactoryImpl());

Dopo di che è possibile caricare i file XML, come si farebbe normalmente:

ResourceSet resourceSet = ResourceSetFactory.createResourceSet();
Resource resource = resourceSet.getResource(xmlURI, true);
resource.load(Collections.EMPTY_MAP);
EObject root = resource.getContents().get(0);

Ho costruito un piccolo programma che fa un po 'di conversione di formato modello di base utilizzando emftriple (ex emf4sw), vale a dire Ecore XMI (file XML) per RDF TTL.

ho usato alcune delle punte nelle risposte qui, quindi grazie ragazzi!

Forse il codice sorgente può ispirare: https://github.com/frostyandy2k/model-transformer

Il modo normale di fare questo genere di cose è di iniziare con uno schema XML, quindi utilizzare questo per generare il modello FEM, e quindi generare il codice Java. Questo è descritto in questo tutorial EMF .

Non è necessario implementare metodi di lettura / scrittura. Piuttosto si fanno uso di campi elettromagnetici codice della libreria per fare l'importazione e l'esportazione XML. Non ho la mia copia del libro EMF di fronte a me in questo momento, ma è coperto in là. In alternativa, dare un'occhiata a ciò che l'editor campi elettromagnetici generati non quando si caricare o salvare un'istanza di modello.

Modifica

Ecco un risorsa classe di utilità da una base-EMF progetto che ho sviluppato un paio di anni fa. Guardate i metodi load*. Si noti che questo non è necessariamente il modo migliore per farlo ... ma ha funzionato per me.

Modifica 2

Ho appena realizzato che stavo usando XMI XML non semplice. Configurazione di un lettore di XML con uno schema personalizzato e (potenzialmente) una mappatura dello schema personalizzato è probabile che sia diverso. Quindi, tornando alla mia risposta originale, guardare il codice generato !! .

EMF non è progettato per leggere file XML arbitrari. EMF utilizza XML come backend. Da dove vengono i file XML provenienti da / che lo schema non sono conformi a? Se avete lo schema, quindi è possibile utilizzarlo per creare un modello di campi elettromagnetici, che a sua volta si spera in grado di leggere i file XML.

In caso contrario si dovrà decodificare un modello FEM che sarebbe davvero serializzare al tuo XML, in modo che si sarebbe in grado di leggerlo, ma che sarebbe un hack.

Dopo UPDATE2 :

Credo che la prossima domanda allora è "Che problema hai con il caricamento dei file". Come si fa a fare, e quello che non funziona? O non sai come fare?

Per prima cosa è necessario configurare la fabbrica per il set di risorse (la rappresentazione in memoria del set di file che si desidera lavorare), e quindi caricare il file con getResource (URI, bool). Esempio per alcune cose UML che sto facendo:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE);
resourceSet.getPackageRegistry().put("http://www.eclipse.org/uml2/2.0.0/UML", UMLPackage.eINSTANCE);
Resource r = resourceSet.getResource(uriToYourFile,true);
YourModelRootType root = (YourModelRootType) r.getContents().get(0);

Questo dovrebbe essere tutti coperti nel tutorial che hai già il link di collegamento. Quindi, è possibile utilizzare l'API Java generato lavorare da 'root'.

Non ho esperienza con l'ORM-roba, però, ma forse si dovrebbe dare un'occhiata a CDO .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top