2012-06-25 24 views
7

Tôi đang làm việc với cơ sở mã L ++ LARGE cũ với nhiều tệp IDL có tất cả các loại và hằng số được khai báo bên ngoài bất kỳ mô-đun nào.Tạo java từ IDL (tránh gói mặc định)

Đối với C++, kết quả này trong mã được tạo ra cho không gian tên chung - xấu xí, nhưng có thể chấp nhận được.

Bây giờ tôi đang cố gắng thêm các máy khách Java để kết nối qua CORBA. Đối với Java, tuy nhiên, các kiểu được tạo ra từ IDL (sử dụng trình biên dịch IDL của Sun/Oracle cho java: idlj) nằm trong gói mặc định java vì chúng không nằm trong mô-đun IDL. Điều này dẫn đến lỗi biên dịch Java, vì nó là bất hợp pháp để nhập từ gói mặc định.

Tôi đang tìm cách dễ nhất để khắc phục sự cố.

tôi đã xem xét những điều sau đây:

  1. Đặt một tuyên bố mô-đun xung quanh tất cả các loại. Tôi hiện đang làm việc giải pháp này, nhưng nó VERY đau đớn, dựa trên số lượng các loại bị ảnh hưởng và tác động đến lớn di sản C++ codebase.
  2. Sử dụng tùy chọn -pkgPrefix hoặc -pkgTranslate. Cho đến nay, tôi không thể tìm ra cách thực hiện điều này một cách tổng quát, vì bạn phải chỉ định mô-đun để dịch từ hoặc chỉ định loại để thêm tiền tố đến. -pkgPrefix có thể được sử dụng cho một loại cụ thể, nhưng chúng tôi có hàng trăm loại và tôi không muốn liệt kê một tùy chọn -pkgPrefix cụ thể cho từng tệp được biên dịch ...
  3. Sử dụng chỉ thị pragma? Tôi không biết một người sử dụng, nhưng hy vọng một guru có thể chỉ đường?
  4. ????

Tôi cảm thấy khó tin rằng không có cách nào dễ dàng để buộc IDL nằm trong gói Java nếu không có mô-đun hiện có chứa tất cả các loại. Tôi hy vọng rằng tôi chỉ thiếu những điều hiển nhiên!

Sửa:

  • IDL-to-Java biên dịch là idlj.
  • Đã thêm ví dụ bên dưới.
  • Cập nhật Item # 2 (trên) để làm rõ rằng việc sử dụng -pkgPrefix đối với từng loại là không khả thi

Ví dụ (trừ khi nó có thể được kịch bản hợp lý?):


Foo.idl

struct Foo 
{ 
    . 
    . 
    . 
} 

Foo.java: (lưu ý rằng không có gói được quy định, có nghĩa là gói mặc định):

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

Hỏi: Bạn đang sử dụng công cụ nào để tạo Java từ IDL? Tiêu chuẩn Sun "idlj"? Bạn có thể đưa ra một ví dụ cụ thể về 1) dòng lệnh của bạn (với "-pkgPrefix") và 2) kết quả Java (không hoạt động)? – paulsm4

Trả lời

2

bạn có thể chơi với các tùy chọn pkgPrefix và pkgTranslate như được chỉ ra trong a french site Tôi đoán bạn đã có một phần đúng nhưng tôi chỉ chi tiết trong trường hợp.

dụ:

interface T1 
{ 
}; 
interface T2 
{ 
}; 

Bạn ra cấu hình pkgPrefix trong tập tin idl.config

PkgPrefix.T1=aaa 
PkgPrefix.T2=bbb 

Sau lệnh

idlj -td dir T.idl 

tạo ra các tập tin trong (hiện có) dir thư mục:

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

Để tạo tệp cấu hình, bạn có thể sử dụng kết hợp grep/awk/sed/cut.