org.eclipse.buckminster.jnlp.p2.P2MaterializerRunnable.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.buckminster.jnlp.p2.P2MaterializerRunnable.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2007, Cloudsmith Inc.
 * The code, documentation and other materials contained herein have been
 * licensed under the Eclipse Public License - v 1.0 by the copyright holder
 * listed above, as the Initial Contributor under such license. The text of
 * such license is available at www.eclipse.org.
 ******************************************************************************/
package org.eclipse.buckminster.jnlp.p2;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.buckminster.jnlp.p2.installer.IInstallOperation;
import org.eclipse.buckminster.jnlp.p2.installer.InstallDescription;
import org.eclipse.buckminster.jnlp.p2.installer.InstallUpdateProductOperation;
import org.eclipse.buckminster.jnlp.p2.installer.Messages;
import org.eclipse.core.net.proxy.IProxyService;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.ServiceReference;

public class P2MaterializerRunnable implements IRunnableWithProgress {
    private final IInstallOperation m_installOperation;

    public P2MaterializerRunnable(InstallDescription installDescription) throws Exception {
        initializeProxySupport();
        startRequiredBundles(installDescription);

        m_installOperation = new InstallUpdateProductOperation(JNLPPlugin.getDefault().getContext(),
                installDescription);
    }

    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        try {
            IStatus status = m_installOperation.install(monitor);
            switch (status.getSeverity()) {
            case IStatus.ERROR:
                throw new CoreException(status);
            case IStatus.CANCEL:
                throw new InterruptedException();
            }
        } catch (InterruptedException e) {
            throw e;
        } catch (Throwable t) {
            throw new InvocationTargetException(t);
        }
    }

    private void initializeProxySupport() {
        IProxyService proxies = (IProxyService) getService(JNLPPlugin.getDefault().getContext(),
                IProxyService.class.getName());
        if (proxies == null)
            return;
        proxies.setProxiesEnabled(true);
        proxies.setSystemProxiesEnabled(true);
    }

    private static Object getService(BundleContext context, String name) {
        if (context == null)
            return null;
        ServiceReference reference = context.getServiceReference(name);
        if (reference == null)
            return null;
        Object result = context.getService(reference);
        context.ungetService(reference);
        return result;
    }

    /**
     * Starts the p2 bundles needed to continue with the install.
     */
    private void startRequiredBundles(InstallDescription description) throws CoreException {
        IPath installLocation = description.getInstallLocation();
        if (installLocation == null)
            throw new CoreException(new Status(IStatus.ERROR, JNLPPlugin.ID, Messages.App_NoInstallLocation, null));
        //set agent location if specified
        IPath agentLocation = description.getAgentLocation();
        if (agentLocation != null) {
            String agentArea = System.getProperty("eclipse.p2.data.area"); //$NON-NLS-1$
            // TODO a bit of a hack here.  If the value is already set and it is set to @config/p2 then 
            // it may well be the default value put in by PDE.  Overwrite it.
            // Its kind of unclear why we would NOT overwrite.  At this point the user set their choice
            // of shared or standalone and those dicate where the agent should put its info...
            if (agentArea == null || agentArea.length() == 0 || agentArea.startsWith("@config")) //$NON-NLS-1$
                System.setProperty("eclipse.p2.data.area", agentLocation.toOSString()); //$NON-NLS-1$ 
        }
        //start up p2
        try {
            JNLPPlugin.getDefault().getBundle("org.eclipse.equinox.p2.exemplarysetup") //$NON-NLS-1$
                    .start(Bundle.START_TRANSIENT);
        } catch (BundleException e) {
            throw new CoreException(new Status(IStatus.ERROR, JNLPPlugin.ID, Messages.App_FailedStart, e));
        }
    }
}