У меня есть приложение 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, или они решили заменить этот класс любой аналогичной функциональностью? Или, если у кого-нибудь есть идея для другого решения этой проблемы?
Заранее спасибо.