Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.siteview.mde.internal.ui.samples; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.net.URISyntaxException; import java.util.Collection; import java.util.Properties; import org.eclipse.core.runtime.*; import org.eclipse.equinox.internal.provisional.configurator.Configurator; import org.eclipse.equinox.p2.core.IProvisioningAgent; import org.eclipse.equinox.p2.core.ProvisionException; import org.eclipse.equinox.p2.engine.IProfile; import org.eclipse.equinox.p2.engine.IProfileRegistry; import org.eclipse.equinox.p2.operations.InstallOperation; import org.eclipse.equinox.p2.operations.ProvisioningJob; import org.eclipse.equinox.p2.query.IQuery; import org.eclipse.equinox.p2.query.QueryUtil; import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository; import org.eclipse.equinox.p2.ui.ProvisioningUI; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import com.siteview.mde.internal.ui.*; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.intro.IIntroSite; import org.eclipse.ui.intro.config.*; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; public class ShowSampleAction extends Action implements IIntroAction { private static final String SAMPLE_FEATURE_ID = "org.eclipse.sdk.samples"; //$NON-NLS-1$ private static final String SAMPLE_FEATURE_VERSION = "3.3.0"; //$NON-NLS-1$ private static final String UPDATE_SITE = "http://dev.eclipse.org/viewcvs/index.cgi/%7Echeckout%7E/pde-ui-home/samples/"; //$NON-NLS-1$ private String sampleId; private ProvisioningUI provUI; /** * */ public ShowSampleAction() { provUI = ProvisioningUI.getDefaultUI(); } public void run(IIntroSite site, Properties params) { sampleId = params.getProperty("id"); //$NON-NLS-1$ if (sampleId == null) return; Runnable r = new Runnable() { public void run() { if (!ensureSampleFeaturePresent()) return; SampleWizard wizard = new SampleWizard(); try { wizard.setInitializationData(null, "class", sampleId); //$NON-NLS-1$ wizard.setSampleEditorNeeded(false); wizard.setSwitchPerspective(false); wizard.setSelectRevealEnabled(false); wizard.setActivitiesEnabled(false); WizardDialog dialog = new WizardDialog(MDEPlugin.getActiveWorkbenchShell(), wizard); dialog.create(); if (dialog.open() == Window.OK) { switchToSampleStandby(wizard); } } catch (CoreException e) { MDEPlugin.logException(e); } } }; Shell currentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); currentShell.getDisplay().asyncExec(r); } private void switchToSampleStandby(SampleWizard wizard) { StringBuffer url = new StringBuffer(); url.append("http://org.eclipse.ui.intro/showStandby?"); //$NON-NLS-1$ url.append("pluginId=com.siteview.mde.ui"); //$NON-NLS-1$ url.append("&"); //$NON-NLS-1$ url.append("partId=com.siteview.mde.ui.sampleStandbyPart"); //$NON-NLS-1$ url.append("&"); //$NON-NLS-1$ url.append("input="); //$NON-NLS-1$ url.append(sampleId); IIntroURL introURL = IntroURLFactory.createIntroURL(url.toString()); if (introURL != null) { introURL.execute(); ensureProperContext(wizard); } } private void ensureProperContext(SampleWizard wizard) { IConfigurationElement sample = wizard.getSelection(); String perspId = sample.getAttribute("perspectiveId"); //$NON-NLS-1$ if (perspId != null) { try { wizard.enableActivities(); PlatformUI.getWorkbench().showPerspective(perspId, MDEPlugin.getActiveWorkbenchWindow()); wizard.selectReveal(MDEPlugin.getActiveWorkbenchShell()); } catch (WorkbenchException e) { MDEPlugin.logException(e); } } enableActivities(sample); } private void enableActivities(IConfigurationElement sample) { } /** * Ensure the sample feature is present. If not present, attempt to install it. * * @return <code>true</code> if the sample features are present, and * <code>false</code> otherwise. */ private boolean ensureSampleFeaturePresent() { IProfile profile = getProfile(); if (profile == null) return false; if (checkFeature(profile)) return true; // the feature is not present - ask to download if (MessageDialog.openQuestion(MDEPlugin.getActiveWorkbenchShell(), MDEUIMessages.ShowSampleAction_msgTitle, MDEUIMessages.ShowSampleAction_msgDesc)) { return downloadFeature(); } return false; } private boolean checkFeature(IProfile profile) { return !profile.query(getSampleFeatureQuery(), null).isEmpty(); } /** * Returns <code>true</code> if the sample feature is already installed, or if * it won't be possible to install the feature (required services are missing). Returns * <code>false</code> if the features are missing and should be installed. */ private IProfile getProfile() { IProvisioningAgent agent = provUI.getSession().getProvisioningAgent(); if (agent == null) return null; IProfileRegistry registry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME); if (registry == null) return null; return registry.getProfile(provUI.getProfileId()); } IQuery getSampleFeatureQuery() { return QueryUtil.createIUQuery(SAMPLE_FEATURE_ID, org.eclipse.equinox.p2.metadata.Version.parseVersion(SAMPLE_FEATURE_VERSION)); } /** * Download the sample feature, returning <code>true</code> if the feature * was installed successfully, and <code>false</code> otherwise. */ private boolean downloadFeature() { IRunnableWithProgress op = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { SubMonitor sub = SubMonitor.convert(monitor, MDEUIMessages.ShowSampleAction_installing, 100); InstallOperation operation = createInstallOperation(sub.newChild(10)); operation.resolveModal(sub.newChild(20)); IStatus status = operation.getResolutionResult(); if (status.getSeverity() == IStatus.CANCEL) { throw new InterruptedException(); } else if (!(status.isOK() || status.getSeverity() == IStatus.INFO)) { throw new CoreException(status); } ProvisioningJob job = operation.getProvisioningJob(null); status = job.runModal(sub.newChild(70)); if (!(status.isOK() || status.getSeverity() == IStatus.INFO)) { throw new CoreException(status); } applyConfiguration(); } catch (Exception e) { throw new InvocationTargetException(e); } } }; try { PlatformUI.getWorkbench().getProgressService().busyCursorWhile(op); } catch (InvocationTargetException e) { MDEPlugin.logException(e); return false; } catch (InterruptedException e) { MDEPlugin.logException(e); } return true; } /** * Returns a Collection<IInstallableUnit> of the installable units that contain the samples * to be installed. */ protected Collection findSampleIUs(URI location, SubMonitor monitor) throws ProvisionException { IMetadataRepository repository = provUI.loadMetadataRepository(location, false, monitor.newChild(5)); return repository.query(getSampleFeatureQuery(), monitor.newChild(5)).toUnmodifiableSet(); } /** * Creates the operation that will install the sample features in the running platform. */ InstallOperation createInstallOperation(SubMonitor monitor) throws URISyntaxException, ProvisionException { URI repositoryLocation = new URI(UPDATE_SITE); Collection sampleIUs = findSampleIUs(repositoryLocation, monitor); URI[] repos = new URI[] { repositoryLocation }; InstallOperation operation = provUI.getInstallOperation(sampleIUs, repos); return operation; } /** * Apply the profile changes to the currently running configuration. */ void applyConfiguration() throws CoreException { BundleContext context = MDEPlugin.getDefault().getBundle().getBundleContext(); ServiceReference reference = context.getServiceReference(Configurator.class.getName()); Configurator configurator = (Configurator) context.getService(reference); try { configurator.applyConfiguration(); } catch (IOException e) { throw new CoreException(new Status(IStatus.ERROR, IMDEUIConstants.PLUGIN_ID, "Unexpected failure applying configuration", e)); //$NON-NLS-1$ } finally { context.ungetService(reference); } } }