2009-09-03 21 views
6

Desidero utilizzare l'editor XML predefinito (org.eclipse.wst.xml.ui) di Eclipse in un'applicazione RCP. Ho bisogno di leggere il DOM del file xml attualmente aperto. Il plugin non offre alcun punto di estensione, quindi sto provando ad accedere alle classi interne. Sono consapevole che l'I non dovrebbe accedere alle classi interne, ma non ho un'altra opzione.Eclipse RCP: come accedere alle classi interne dei plugin?

Il mio approccio consiste nel creare un frammento e un punto di estensione per poter leggere i dati dal plug-in. Sto cercando di non ricompilare il plugin, ecco perché ho pensato che fosse necessario un frammento. Voglio solo caricarlo ed estrarre i dati in fase di runtime.

Quindi, la mia domanda è: c'è un altro modo per accedere alle classi di un plug-in? se sì, come? Qualsiasi tutorial, pagina doc o link utile per uno qualsiasi dei metodi è il benvenuto.

risposta

4

Poiché nessuno ha risposto alla mia domanda e ho trovato la risposta dopo lunghe ricerche, inserirò la risposta che altri useranno se si imbattono in questo problema.

Per accedere a un plug-in in fase di esecuzione, è necessario creare e il punto di estensione e un'estensione collegati ad esso nel plug-in a cui si sta tentando di accedere.

L'aggiunta di classi a un plug-in utilizzando un frammento non è consigliabile se si desidera accedere a tali classi dall'esterno del plug-in.

Quindi, la soluzione migliore è quella di ottenere il plug-in dal repository CVS e apportare le modifiche direttamente alla sorgente del plug-in. Aggiungi punti di estensione, estensioni e il codice per la funzionalità.

Tutorial:

1

ho finito per estendere XMLMultiPageEditorPart come questo:

public class MultiPageEditor extends XMLMultiPageEditorPart implements 
     IResourceChangeListener { 

    @Override 
    public void resourceChanged(IResourceChangeEvent event) { 
     // TODO Auto-generated method stub 
     setActivePage(3); 
    } 

    public Document getDOM() { 
     int activePageIndex = getActivePage(); 

     setActivePage(1); 
     StructuredTextEditor fTextEditor = (StructuredTextEditor) getSelectedPage(); 
     IDocument document = fTextEditor.getDocumentProvider().getDocument(
       fTextEditor.getEditorInput()); 
     IStructuredModel model = StructuredModelManager.getModelManager() 
       .getExistingModelForRead(document); 
     Document modelDocument = null; 
     try { 
      if (model instanceof IDOMModel) { 
       // cast the structured model to a DOM Model 
       modelDocument = (Document) (((IDOMModel) model).getDocument()); 
      } 
     } finally { 
      if (model != null) { 
       model.releaseFromRead(); 
      } 
     } 
     setActivePage(activePageIndex); 
     return modelDocument; 
    } 
} 

Questa non è un'implementazione pulita, ma ottiene il lavoro fatto.