Есть ли способ проверить, есть ли у вас подключение/доступ к репозиторию p2 из приложения rcp в Eclipse 3.7?

У меня есть приложение RCP, которое использует безголовое обновление с репозиторием p2, написанным в eclipse 3.6. После принятия решения о переходе на Eclipse 3.7 оказалось, что мой обходной путь не будет работать, так как некоторых классов в 3.7 больше нет. В чем проблема в 3.6?

Проблема в Eclipse 3.6: приложение проверяет наличие обновлений перед запуском основного подключаемого модуля. Он пытается подключиться к репозиторию p2. Если есть к нему подключение, то ищет обновления, если есть, обновления, если нет ничего не говорит для обновления и дальше. Если соединения нет, то возникло исключение глубоко в фреймворке Equinox/Eclipse, которое было обработано фреймворком и никогда нам не показывалось, поэтому приложение не может сказать, есть соединение или нет, в результате оно говорит, что есть нечего обновлять.

Решение: После нескольких дней поиска решений для этого я нашел обходной путь. Решение заключалось в создании класса для проверки «Статус» репозитория, например. есть ли у меня связь с ним или нет. Вот мой класс:

public class RepositoryValidator {

private final static String urlExtension = "artifacts.jar"; //$NON-NLS-1$

private static RepositoryValidator instance;

private RepositoryValidator() {

}

public static RepositoryValidator sharedInstance() {
if (instance == null) {
instance = new RepositoryValidator();
}
return instance;
}

public IStatus checkRepositoryStatus(URI repoURI) {
try {
URI checkURI = new URI(repoURI.toString() + urlExtension);
ILog logger = Activator.getDefault().getLog();
logger.log(new Status(IStatus.INFO, Activator.PLUGIN_ID,
"CHECK REPOSITORY \"artifacts.jar\" - " //$NON-NLS-1$
+ checkURI.toString()));
long result = RepositoryTransport.getInstance().getLastModified(
checkURI, new NullProgressMonitor());
if (result == 0) {
logger.log(new Status(IStatus.INFO, Activator.PLUGIN_ID,
"RESULT FROM CHECK - " + result)); //$NON-NLS-1$
return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
"WRONG SERVER RESPONCE!!!"); //$NON-NLS-1$
}
} catch (Exception e) {
return new Status(IStatus.ERROR, Activator.PLUGIN_ID,
"CONNECTION EXCEPTION", e); //$NON-NLS-1$
}
return new Status(IStatus.OK, Activator.PLUGIN_ID,
"REPOSITORY IS REACHABLE AND OK!!!"); //$NON-NLS-1$


}
}

Что я в основном здесь делаю, так это проверяю, когда был изменен файл Artifacts.jar, если я могу получить к нему доступ, у меня есть подключение, если нет, то нет.

Проблема в Eclipse 3.7: В решении для Eclipse 3.6 я использовал класс RepositoryTransport, которого больше нет в 3.7. Я пытался выяснить, был ли этот класс заменен другим, или в доступном классе есть метод, который я мог бы достичь аналогичной функциональности. Не нашел ничего по теме, ни по классу, ни по решению вопроса в 3.6.

Деос, кто-нибудь знает что-нибудь по этому вопросу? Есть ли исправление для решения в самой версии 3.6, или они решили заменить этот класс любой аналогичной функциональностью? Или, если у кого-нибудь есть идея для другого решения этой проблемы?

Заранее спасибо.


person Dancho    schedule 01.08.2011    source источник


Ответы (1)


Во-первых, RepositoryTransport перемещен в пакет org.eclipse.equinox.internal.p2.transport.ecf в новом пакете после рефакторинга кода в версии 3.7.

Во-вторых, я не думаю, что ваш обходной путь - хороший способ проверить, есть ли у него обновления или нет. Вы должны использовать API p2 для загрузить ваш репозиторий, а затем запросить, содержит ли он обновления для Ваша установка.

person Kane    schedule 03.08.2011