2012-06-25 17 views
7

Sto lavorando con una base di codice C++ legacy LARGE con numerosi file IDL che hanno tutti i tipi e le costanti dichiarate all'esterno di qualsiasi modulo.Generazione java da IDL (evitando il pacchetto predefinito)

Per C++, questo genera il codice generato nello spazio dei nomi globale - brutto, ma accettabile.

Ora sto cercando di aggiungere client Java per la connessione tramite CORBA. Per Java, tuttavia, i tipi generati dall'IDL (utilizzando il compilatore IDL Sun/Oracle per Java: idlj) sono nel pacchetto predefinito java perché non si trovano all'interno di un modulo IDL. Ciò si traduce in errori di compilazione Java, poiché è illegale importare dal pacchetto predefinito.

Sto cercando il modo più semplice per correggere il problema.

Ho considerato il seguente:

  1. Posizionare una dichiarazione del modulo intorno a tutti i tipi. Attualmente sto lavorando a questa soluzione, ma è MOLTO doloroso, in base al numero di tipi interessati e all'impatto sulla base di codice C++ di grandi dimensioni.
  2. Utilizzare le opzioni -pkgPrefix o -pkgTranslate. Finora, non riesco a capire come farlo genericamente, dal momento che devi specificare un modulo per tradurre da o specificare un tipo per aggiungere un prefisso a. -pkgPrefix può essere usato per un tipo specifico, ma abbiamo centinaia di tipi e preferisco non elencare un'opzione -pkgPrefix specifica per ogni file compilato ...
  3. Utilizzare una direttiva pragma? Non sono a conoscenza di uno da usare, ma spero che un guru possa indicarci la via?
  4. ????

Trovo difficile credere che non ci sia un modo semplice per forzare l'IDL in un pacchetto Java se non esiste un modulo esistente che contiene tutti i tipi. Spero che mi manchi l'ovvio!

Edit:

  • IDL-to-Java compilatore è idlj.
  • Esempio aggiunto di seguito.
  • Aggiornato Articolo # 2 (sopra) per chiarire che l'uso -pkgPrefix per ogni tipo non è fattibile

Esempio (a meno che non si può ragionevolmente script?):


Foo.idl

struct Foo 
{ 
    . 
    . 
    . 
} 

Foo.java: (notare che nessun pacchetto è specificato, cioè il pacchetto di default):

public final class Foo implements org.omg.CORBA.portable.IDLEntity 
{ 
    . 
    . 
    . 
} 

ClassUsesFoo.java:

package com.sigh; 

import Foo; // <-- this is an error 
public class ClassUsesFoo 
{ 
    private Foo f; 
}; 
+2

D: Quale strumento stai utilizzando per generare Java da IDL? Lo standard Sun "idlj"? Potresti fornire un esempio specifico di 1) la tua riga di comando (con "-pkgPrefix") e 2) il Java risultante (che non funziona)? – paulsm4

risposta

2

si può giocare con le opzioni pkgPrefix e pkgTranslate come indicato in a french site Immagino che tu avessi quella parte giusta, ma dettaglio nel caso.

esempio:

interface T1 
{ 
}; 
interface T2 
{ 
}; 

È fuori di configurazione nel file di pkgPrefix idl.config

PkgPrefix.T1=aaa 
PkgPrefix.T2=bbb 

seguito comando

idlj -td dir T.idl 

crea i file (esistente) directory dir:

dir/ 
├── aaa 
│   ├── T1Helper.java 
│   ├── T1Holder.java 
│   ├── T1.java 
│   ├── T1Operations.java 
│   └── _T1Stub.java 
└── bbb 
    ├── T2Helper.java 
    ├── T2Holder.java 
    ├── T2.java 
    ├── T2Operations.java 
    └── _T2Stub.java 

Per creare il file di configurazione, è possibile utilizzare una combinazione di grep/awk/sed/cut.