Документация совсем не помогает, в OSGi in Action нет примера того, как что-то делать. Например, я хочу, чтобы пакет A запрещал импорт пакетов из пакета B и т. д. Простые примеры, от начала до конца — не могу их найти.
Но вернемся к моему вопросу, я хочу заблокировать звонки на System.exit
по понятным причинам, кроме того, что "не реализовывать свой собственный Security Manager", я мало что получил от форума Девы, поэтому мой вопрос здесь.
ИЗМЕНИТЬ
Поскольку я хочу, чтобы это произошло в Деве, вот что я пробовал:
public void start(BundleContext context) throws Exception {
System.out.println("===== Starting Bundle PermissionsTest =====");
SecurityManager securityManager = System.getSecurityManager();
if(securityManager == null) throw new IllegalArgumentException("Security Manager is not defined!");
ServiceReference serviceReference =
(ServiceReference) context.getServiceReference(ConditionalPermissionAdmin.class.getName());
if(serviceReference == null) throw new IllegalArgumentException(ConditionalPermissionAdmin.class.getName() + " IS NULL");
else System.out.println("===== Good so far 1 =====");
ConditionalPermissionAdmin conditionalPermissionAdmin =
(ConditionalPermissionAdmin)context.getService(serviceReference);
if(conditionalPermissionAdmin == null) throw new IllegalArgumentException("ConditionalPermissionAdmin can not be found");
else System.out.println("===== Good so far 2 =====");
Первое, что я сделал в Virgo, т.е. включил Equinox Security Manager (потому что именно его использует Virgo). Спецификация OSGi говорит, что каждый контейнер должен реализовать свой собственный Security Manager, расширенный набором специфичных для OSGi действий.
В случае Девы это Equinox Security Manager. Включить его очень просто - просто добавьте две строчки в bin/dmk.sh и все готово.
Итак, у меня есть ConditionalPermissionAdmin — хорошо! Теперь я могу, например, добавить проверку безопасности, например, BundlePermission для Bundle. Конечно, но это происходит для сочетания определенных действий, таких как запуск/остановка/экспорт и т. д. Я не могу понять, как это сделать для действия LifeCycle — System.exit в моем случае .
кстати, я использую версию 4.2.0 osgi-core, и нет, я не могу обновиться до 4.3.0, по крайней мере, не сейчас.