P2 Автообновление из веб-хранилища - PullRequest
3 голосов
/ 07 марта 2012

У меня есть некоторые проблемы с автообновлением P2, когда я выполняю локально, из локального репозитория все работает нормально, и я могу делать автообновления при перезапуске, но когда я пытаюсь обновить из веб-репо, у меня есть эти ошибки:

An internal error occurred during: "Install download0".
org.eclipse.swt.SWTException: Invalid thread access

Действительно, я не понимаю, в чем разница. В моем ApplicationWindowWorkbenchAdvisor у меня есть этот метод открытия окна сообщения:

private static final String JUSTUPDATED = "justUpdated";

public void postWindowOpen() {
    final IProvisioningAgent agent = (IProvisioningAgent) ServiceHelper
            .getService(Activator.bundleContext,
                    IProvisioningAgent.SERVICE_NAME);
    if (agent == null) {
        LogHelper
                .log(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
                        "No provisioning agent found.  This application is not set up for updates."));
    }
    final IPreferenceStore prefStore = Activator.getDefault()
            .getPreferenceStore();
    if (prefStore.getBoolean(JUSTUPDATED)) {
        prefStore.setValue(JUSTUPDATED, false);
        return;
    }

    IRunnableWithProgress runnable = new IRunnableWithProgress() {
        public void run(IProgressMonitor monitor)
                throws InvocationTargetException, InterruptedException {
            IStatus updateStatus = P2Util.checkForUpdates(agent, monitor);
            if (updateStatus.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) {
                PlatformUI.getWorkbench().getDisplay()
                        .asyncExec(new Runnable() {
                            public void run() {
                                MessageDialog.openInformation(null,
                                        "Updates", "No updates were found");
                            }
                        });
            } else if (updateStatus.getSeverity() != IStatus.ERROR) {
                prefStore.setValue(JUSTUPDATED, true);
                PlatformUI.getWorkbench().restart();
            } else {
                LogHelper.log(updateStatus);
            }
        }
    };
    try {
        new ProgressMonitorDialog(null).run(true, true, runnable);
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
    }

}

И в моем P2Util это:

    public static IStatus checkForUpdates(IProvisioningAgent agent,
        IProgressMonitor monitor) {
    ProvisioningSession session = new ProvisioningSession(agent);
    UpdateOperation operation = new UpdateOperation(session);
    SubMonitor sub = SubMonitor.convert(monitor,
            "Checking for application updates...", 200);
    IStatus status = operation.resolveModal(sub.newChild(100));
    if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) {
        return status;
    }
    if (status.getSeverity() == IStatus.CANCEL)
        throw new OperationCanceledException();

    if (status.getSeverity() != IStatus.ERROR) {
        ProvisioningJob job = operation.getProvisioningJob(null);
        status = job.runModal(sub.newChild(100));
        if (status.getSeverity() == IStatus.CANCEL)
            throw new OperationCanceledException();
    } 
    return status;
}

В моем PreferenceInitializer это:

node.putBoolean(PreferenceConstants.PREF_AUTO_UPDATE_ENABLED, true);
node.putBoolean(PreferenceConstants.PREF_AUTO_UPDATE_SCHEDULE, true);
node.putBoolean(PreferenceConstants.PREF_DOWNLOAD_ONLY, true);

Я повторяюсь: из локального репо я могу выполнять автообновления, но из веб-репо я не могу. Спасибо за чтение.

1 Ответ

4 голосов
/ 08 марта 2012

проблемный код

new ProgressMonitorDialog(null).run(true, true, runnable);

это вызывается вне пользовательского потока, который выдает ошибку ... вы должны также обернуть это в вызов asyncExec

...