2013-08-19 28 views
5

Tôi gặp vấn đề với một ứng dụng RCP Eclipse 4. Tôi cần phải đăng nhập một số sự kiện. Tôi cần có được bằng cách nào đó một tham chiếu đến logger. Tôi biết, làm thế nào để làm điều đó bằng cách sử dụng IEclipseContext, nhưng tôi đã hư không tìm thấy, làm thế nào để có được IEclipseContext mà không có tiêm phụ thuộc, mà tôi không thể sử dụng trong activator. Bạn có biết, làm thế nào để sắp xếp nó ra vấn đề này, xin vui lòng?Cách lấy IEclipseContext trong trình kích hoạt

Thanks a lot

Trả lời

2

Có vẻ như rất tiếc, rằng không có cách nào để có được IEclipseContext mà không sử dụng tiêm. Có được viết bằng một câu trả lời cho How to use eclipse 4 DI in classes that are not attached to the application model:

Vấn đề là, tuy nhiên, rằng IEclipseContext đã cần phải được tiêm vào một lớp học mà có thể truy cập vào các đối tượng có nhu cầu tiêm.

Tuy nhiên tôi đã giải quyết được vấn đề đăng nhập và điều tôi làm, nguyên tắc hoạt động thường. Luôn luôn có một số dịch vụ cung cấp những thứ bạn cần. Nếu bạn không thể sử dụng tiêm phụ thuộc, bạn đã nhận được bằng cách nào đó (Internet và các thí nghiệm rất thường xuyên) một tên lớp dịch vụ thích hợp. Nếu bạn đã có tên lớp dịch vụ, thì bạn có thể lấy một tham chiếu cá thể từ ngữ cảnh gói. May mắn thay, bối cảnh bó có thể truy cập mà không cần sử dụng tiêm.

Quay lại vấn đề đăng nhập của chúng tôi. Lớp đang được tìm kiếm là org.osgi.service.log.LogService:

public class Activator implements BundleActivator { 
    ... 
    private static BundleContext context; 
    ... 

    public static BundleContext getContext() { 
     return context; 
    } 
    ... 
    public void start(BundleContext bundleContext) throws Exception { 
     ServiceReference<?> logser = bundleContext.getServiceReference(LogService.class); 
     LogService ls = (LogService)bundleContext.getService(logser); 
     //print an error to test it (note, that info can be below the threshold) 
     ls.log(LogService.LOG_ERROR, "The bundle is starting..."); 
     Activator.context = bundleContext; 
    } 
    ... 
} 

Et voilà!

!ENTRY eu.barbucha.rcp-experiment.kernel 4 0 2013-08-20 07:32:32.347 
!MESSAGE The bundle is starting... 

Đó là tất cả. Sau đó, bạn có thể lấy bối cảnh gói bằng cách sử dụng Activator.getContext(), nếu cần thiết.

Lưu ý quan trọng: Đáng tiếc là bạn không thể giảm ngưỡng ngay bây giờ. Đối số JVM -Declipse.log.level không ảnh hưởng đến dịch vụ nhật ký OSGI và bạn chỉ đang sử dụng trình ghi nhật ký OSGI. Thật không may là họ (có thể tạm thời) đã mã hóa ngưỡng đăng nhập (xem How to log warnings and infos in eclipse 3.7). Tôi phát hiện ra rằng họ chưa sửa chữa nó. Không có trong bản phát hành Kepler. Tuy nhiên bạn có thể thỏa hiệp. Bạn có thể làm điều đó injection-way, nếu có thể.

giải pháp cuối cùng (để bắt ngoại lệ trên toàn cầu cũng)

tôi mở rộng hoạt của tôi:

ServiceReference<?> logreser = bundleContext.getServiceReference(LogReaderService.class); 
LogReaderService lrs = (LogReaderService) bundleContext.getService(logreser); 
lrs.addLogListener(new LogListener() { 
    @Override 
    public void logged(LogEntry entry) { 
     System.err.println("Something was logged: " + entry.getMessage()); 
    } 
}); 

Các văn bản bắt đầu với Something đã đăng thực sự xuất hiện, whenewer được một cái gì đó ở đâu đó đăng nhập. Nhưng lợi thế là, lớp này là của tôi. Tôi có thể kiểm soát nó. Mục nhật ký cũng chứa cấp độ. Tôi cũng có thể dễ dàng thiết lập ngưỡng. Ví dụ trên dòng lệnh.

5

Bạn có thể nhận được IEclipseContext chuyên ngành bằng cách gọi EclipseContextFactory.getServiceContext(bundleContext) cho phép truy cập vào các dịch vụ OSGi.

+0

nào _specialized_ thực sự có ý nghĩa gì? Tôi đã thử nó, nhưng không có trường hợp nào của lớp 'org.eclipse.e4.core.services.Logger' int 'IEclipseContext' chuyên biệt này, được đề cập như thế nào [trên trang wiki này] (http: //wiki.eclipse. org/E4/EAS/Logging_and_Tracing). Nếu tôi hiểu tốt, nó không thể được. Chỉ có OSGI logger cho những thứ cấp thấp như kích hoạt và vân vân. –

+0

Nó 'chuyên' bởi vì nó chỉ chứa các dịch vụ OSGi chứ không phải những thứ khác thường được tìm thấy trong ngữ cảnh. Nó chứa LogService và LogReaderService –

+0

Vâng, bạn nói đúng. Chỉ có các dịch vụ OSGI, bởi vì người kích hoạt là vấn đề của cấp OSGI. –

2

Có thể để có được những "WorkbenchContext" từ IWorkbench như một dịch vụ:

import org.eclipse.e4.core.contexts.IEclipseContext; 
import org.eclipse.ui.PlatformUI; 

public final class EclipseContextHelper { 

    public static IEclipseContext getActiveContext(){ 
     IEclipseContext context = getWorkbenchContext(); 
     return context == null ? null : context.getActiveLeaf(); 
    } 

    public static IEclipseContext getWorkbenchContext(){ 
     return PlatformUI.getWorkbench().getService(IEclipseContext.class); 
    } 
} 
+0

PlatformUI.getWorkbench() là RCP 3 API. – aviit

Các vấn đề liên quan