Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java')
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java858
1 files changed, 429 insertions, 429 deletions
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java
index 103c9e35a..e9574252e 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java
@@ -1,430 +1,430 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2017 WindRiver Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * WindRiver Corporation - initial API and implementation
- * Ericsson AB (Pascal Rapicault) - Bug 387115 - Allow to export everything
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.importexport.internal.wizard;
-
-import java.io.*;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.util.Properties;
-import java.util.concurrent.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.equinox.internal.p2.extensionlocation.ExtensionLocationArtifactRepositoryFactory;
-import org.eclipse.equinox.internal.p2.extensionlocation.ExtensionLocationMetadataRepositoryFactory;
-import org.eclipse.equinox.internal.p2.importexport.internal.Constants;
-import org.eclipse.equinox.internal.p2.importexport.internal.Messages;
-import org.eclipse.equinox.internal.p2.ui.ProvUI;
-import org.eclipse.equinox.internal.p2.ui.dialogs.ISelectableIUsPage;
-import org.eclipse.equinox.internal.p2.ui.dialogs.ProvisioningOperationWizard;
-import org.eclipse.equinox.internal.p2.ui.model.ProfileElement;
-import org.eclipse.equinox.internal.p2.ui.viewers.IUDetailsLabelProvider;
-import org.eclipse.equinox.p2.core.*;
-import org.eclipse.equinox.p2.engine.*;
-import org.eclipse.equinox.p2.metadata.IInstallableUnit;
-import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
-import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
-import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactRepositoryFactory;
-import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
-import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
-import org.eclipse.equinox.p2.repository.metadata.spi.MetadataRepositoryFactory;
-import org.eclipse.equinox.p2.ui.ProvisioningUI;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.*;
-import org.osgi.util.tracker.ServiceTracker;
-
-public class ImportFromInstallationPage extends AbstractImportPage implements ISelectableIUsPage {
-
- protected IProvisioningAgent otherInstanceAgent = null;
- IProfile toBeImportedProfile = null;
- private File instancePath = null;
- private URI[] metaURIs = null;
- private URI[] artiURIs = null;
- private IProvisioningAgentProvider agentProvider;
-
- public ImportFromInstallationPage(ProvisioningUI ui, ProvisioningOperationWizard wizard) {
- super("importfrominstancepage", ui, wizard); //$NON-NLS-1$
- setTitle(Messages.ImportFromInstallationPage_DIALOG_TITLE);
- setDescription(Messages.ImportFromInstallationPage_DIALOG_DESCRIPTION);
- }
-
- @Override
- protected void createContents(Composite composite) {
- createDestinationGroup(composite, true);
- createInstallationTable(composite);
- }
-
- @Override
- protected String getDestinationLabel() {
- return Messages.ImportFromInstallationPage_DESTINATION_LABEL;
- }
-
- @Override
- protected String getDialogTitle() {
- return Messages.ImportFromInstallationPage_DIALOG_TITLE;
- }
-
- @Override
- protected Object getInput() {
- return new IInstallableUnit[0];
- }
-
- @Override
- protected String getInvalidDestinationMessage() {
- return Messages.ImportFromInstallationPage_INVALID_DESTINATION;
- }
-
- @Override
- protected String getNoOptionsMessage() {
- return Messages.ImportFromInstallationPage_SELECT_COMPONENT;
- }
-
- @Override
- protected boolean validateDestinationGroup() {
- return validateDestinationGroup(new NullProgressMonitor());
- }
-
- private IProvisioningAgentProvider getAgentProvider() {
- if (agentProvider == null) {
- ServiceTracker<IProvisioningAgentProvider, IProvisioningAgentProvider> tracker = new ServiceTracker<>(
- Platform.getBundle(Constants.Bundle_ID).getBundleContext(), IProvisioningAgentProvider.class, null);
- tracker.open();
- agentProvider = tracker.getService();
- tracker.close();
- }
- return agentProvider;
- }
-
- boolean validateDestinationGroup(IProgressMonitor monitor) {
- SubMonitor progress = SubMonitor.convert(monitor, 100);
-
- boolean rt;
- if (Display.findDisplay(Thread.currentThread()) == null) {
- Callable<Boolean> getSuperValidateDest = new Callable<Boolean>() {
- Boolean validated;
-
- @Override
- public Boolean call() throws Exception {
- Display.getDefault()
- .syncExec(() -> validated = ImportFromInstallationPage.super.validateDestinationGroup());
- return validated;
- }
- };
- ExecutorService executor = Executors.newSingleThreadScheduledExecutor();
- Future<Boolean> getSuperDestTask = executor.submit(getSuperValidateDest);
-
- try {
- rt = getSuperDestTask.get().booleanValue();
- } catch (Exception e) {
- return false;
- } finally {
- executor.shutdown();
- }
- } else
- rt = super.validateDestinationGroup();
-
- if (rt) {
- try {
- String destination;
- if (Display.findDisplay(Thread.currentThread()) == null) {
- Callable<String> getDestinationValue = new Callable<String>() {
- String des;
-
- @Override
- public String call() throws Exception {
- if (Display.findDisplay(Thread.currentThread()) == null) {
- Display.getDefault().syncExec(() -> des = getDestinationValue());
- } else
- des = getDestinationValue();
- return des;
- }
- };
- ExecutorService executor = Executors.newSingleThreadScheduledExecutor();
- Future<String> getDestTask = executor.submit(getDestinationValue);
- try {
- destination = getDestTask.get();
- } finally {
- executor.shutdown();
- }
- } else
- destination = getDestinationValue();
-
- String toBeImportedProfileId = null;
- try {
- File config = new File(destination, "configuration/config.ini"); //$NON-NLS-1$
- URI configArea = config.getParentFile().toURI();
- InputStream is = null;
- // default area
- File p2DataArea = new File(destination, "p2"); //$NON-NLS-1$
- try {
- Properties props = new Properties();
- is = new FileInputStream(config);
- props.load(is);
- toBeImportedProfileId = props.getProperty("eclipse.p2.profile"); //$NON-NLS-1$
- String url = props.getProperty("eclipse.p2.data.area"); //$NON-NLS-1$
- if (url != null) {
- final String CONFIG_DIR = "@config.dir/"; //$NON-NLS-1$
- final String FILE_PROTOCOL = "file:"; //$NON-NLS-1$
- if (url.startsWith(CONFIG_DIR))
- url = FILE_PROTOCOL + url.substring(CONFIG_DIR.length());
- p2DataArea = new File(URIUtil.makeAbsolute(URIUtil
- .fromString(new File(url.substring(FILE_PROTOCOL.length())).isAbsolute() ? url
- : url.substring(FILE_PROTOCOL.length())),
- configArea));
- }
- } catch (IOException ioe) {
- // ignore
- } finally {
- try {
- is.close();
- } catch (IOException ioe) {
- // ignore
- }
- is = null;
- }
- if (p2DataArea.exists()) {
- boolean createAgent = true;
- if (otherInstanceAgent != null) {
- // don't create agent again if the selection is not changed
- if (!p2DataArea.equals(instancePath)) {
- otherInstanceAgent.stop();
- otherInstanceAgent = null;
- // update cached specified path by users
- instancePath = p2DataArea;
- cleanLocalRepository();
- } else
- createAgent = false;
- }
- if (createAgent)
- otherInstanceAgent = getAgentProvider().createAgent(p2DataArea.toURI());
- ArtifactRepositoryFactory factory = new ExtensionLocationArtifactRepositoryFactory();
- factory.setAgent(agent);
- IArtifactRepository artiRepo = factory.load(new File(destination).toURI(), 0,
- progress.newChild(50));
- artiURIs = new URI[] { artiRepo.getLocation() };
- MetadataRepositoryFactory metaFatory = new ExtensionLocationMetadataRepositoryFactory();
- metaFatory.setAgent(agent);
- IMetadataRepository metaRepo = metaFatory.load(new File(destination).toURI(), 0,
- progress.newChild(50));
- metaURIs = new URI[] { metaRepo.getLocation() };
-
- } else
- throw new FileNotFoundException();
- } catch (ProvisionException e) {
- if (otherInstanceAgent != null) {
- toBeImportedProfile = null;
- IMetadataRepositoryManager manager = agent.getService(IMetadataRepositoryManager.class);
- IArtifactRepositoryManager artifactManager = agent.getService(IArtifactRepositoryManager.class);
- IProfileRegistry registry = otherInstanceAgent.getService(IProfileRegistry.class);
- if (toBeImportedProfileId != null)
- toBeImportedProfile = registry.getProfile(toBeImportedProfileId);
- if (toBeImportedProfile == null) {
- IProfile[] existingProfiles = registry.getProfiles();
- if (existingProfiles.length == 1) {
- toBeImportedProfile = existingProfiles[0];
- } else {
- for (IProfile existingProfile : existingProfiles) {
- if (toBeImportedProfile == null)
- toBeImportedProfile = existingProfile;
- else if ((toBeImportedProfile.getTimestamp() < existingProfile.getTimestamp())) // assuming
- // last
- // modified
- // one
- // is
- // we
- // are
- // looking
- // for
- toBeImportedProfile = existingProfile;
- }
- }
- }
- IAgentLocation location = otherInstanceAgent.getService(IAgentLocation.class);
- URI engineDataArea = location.getDataArea("org.eclipse.equinox.p2.engine"); //$NON-NLS-1$
- progress.setWorkRemaining(50);
- IMetadataRepository metaRepo = manager.loadRepository(
- engineDataArea
- .resolve("profileRegistry/" + toBeImportedProfile.getProfileId() + ".profile"), //$NON-NLS-1$//$NON-NLS-2$
- progress.newChild(25));
- metaURIs = new URI[] { metaRepo.getLocation() };
- IArtifactRepository artiRepo = artifactManager.loadRepository(new File(destination).toURI(),
- progress.newChild(25));
- artiURIs = new URI[] { artiRepo.getLocation() };
- } else
- throw new Exception();
- }
- } catch (Exception e) {
- Display.getDefault().asyncExec(() -> setErrorMessage(getInvalidDestinationMessage()));
- rt = false;
- if (otherInstanceAgent != null)
- otherInstanceAgent.stop();
- otherInstanceAgent = null;
- toBeImportedProfile = null;
- cleanLocalRepository();
- } finally {
- monitor.done();
- }
- }
- return rt;
- }
-
- @Override
- protected void giveFocusToDestination() {
- destinationBrowseButton.setFocus();
- }
-
- @Override
- protected void handleDestinationBrowseButtonPressed() {
- DirectoryDialog dialog = new DirectoryDialog(getContainer().getShell());
- dialog.setText(getDialogTitle());
- dialog.setFilterPath(getDestinationValue());
- final String selectedFileName = dialog.open();
-
- if (selectedFileName != null) {
- modifyDestinationValue(selectedFileName);
- handleDestinationChanged(selectedFileName);
- }
- }
-
- @Override
- protected void handleDestinationChanged(String newDestination) {
- try {
- getContainer().run(true, false, monitor -> {
- Object input = null;
- if (validateDestinationGroup(monitor)) {
- final IProfile currentProfile = toBeImportedProfile;
- final ProfileElement element = new ProfileElement(null, currentProfile.getProfileId()) {
- @Override
- public org.eclipse.equinox.p2.query.IQueryable<?> getQueryable() {
- return currentProfile;
- }
- };
- element.setQueryable(currentProfile);
- input = element;
-
- }
- final Object viewerInput = input;
- Display.getDefault().asyncExec(() -> {
- viewer.setInput(viewerInput);
- updatePageCompletion();
- });
- });
- } catch (InvocationTargetException e) {
- setErrorMessage(e.getLocalizedMessage());
- setPageComplete(false);
- } catch (InterruptedException e) {
- // won't happen
- }
- }
-
- @Override
- void modifyDestinationValue(String selectedFileName) {
- /*
- * If the destination file is a Mac app bundle, modify the destination to
- * *.app/Contents/Eclipse if the path exists.
- */
- if ("cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$
- Path nPath = new Path(selectedFileName);
- if (nPath.lastSegment().endsWith(".app")) { //$NON-NLS-1$
- IPath appendedPath = nPath.append("Contents").append("Eclipse");//$NON-NLS-1$ //$NON-NLS-2$
- if (appendedPath.toFile().exists()) {
- selectedFileName = appendedPath.toOSString();
- }
- }
- }
- setDestinationValue(selectedFileName);
- }
-
- @Override
- protected boolean validDestination() {
- if (this.destinationNameField == null)
- return true;
- File file = new File(getDestinationValue());
- return file.exists() && file.isDirectory();
- }
-
- class ImportFromInstallationLabelProvider extends IUDetailsLabelProvider {
- @Override
- public String getColumnText(Object element, int columnIndex) {
- String text = super.getColumnText(element, columnIndex);
- // it's the order of label provider
- if (columnIndex == 0) {
- IInstallableUnit iu = ProvUI.getAdapter(element, IInstallableUnit.class);
- return getIUNameWithDetail(iu);
- }
- return text;
- }
-
- @Override
- public Color getForeground(Object element) {
- IInstallableUnit iu = ProvUI.getAdapter(element, IInstallableUnit.class);
- if (hasInstalled(iu))
- return Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
- return super.getForeground(element);
- }
- }
-
- @Override
- protected ITableLabelProvider getLabelProvider() {
- return new ImportFromInstallationLabelProvider();
- }
-
- @Override
- public void dispose() {
- super.dispose();
- if (otherInstanceAgent != null) {
- otherInstanceAgent.stop();
- otherInstanceAgent = null;
- toBeImportedProfile = null;
- }
- if (getWizard().performCancel())
- cleanLocalRepository();
- }
-
- public void cleanLocalRepository() {
- if (metaURIs != null && metaURIs.length > 0) {
- IProvisioningAgent runningAgent = getProvisioningUI().getSession().getProvisioningAgent();
- IMetadataRepositoryManager manager = runningAgent.getService(IMetadataRepositoryManager.class);
- for (URI uri : metaURIs)
- manager.removeRepository(uri);
- IArtifactRepositoryManager artifactManager = runningAgent.getService(IArtifactRepositoryManager.class);
- for (URI uri : artiURIs)
- artifactManager.removeRepository(uri);
- }
- }
-
- @Override
- public Object[] getCheckedIUElements() {
- return viewer.getCheckedElements();
- }
-
- @Override
- public Object[] getSelectedIUElements() {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void setCheckedElements(Object[] elements) {
- new UnsupportedOperationException();
- }
-
- public ProvisioningContext getProvisioningContext() {
- ProvisioningContext context = new ProvisioningContext(getProvisioningUI().getSession().getProvisioningAgent());
- context.setArtifactRepositories(artiURIs);
- context.setMetadataRepositories(metaURIs);
- return context;
- }
+/*******************************************************************************
+ * Copyright (c) 2011, 2017 WindRiver Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * WindRiver Corporation - initial API and implementation
+ * Ericsson AB (Pascal Rapicault) - Bug 387115 - Allow to export everything
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.importexport.internal.wizard;
+
+import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.util.Properties;
+import java.util.concurrent.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.equinox.internal.p2.extensionlocation.ExtensionLocationArtifactRepositoryFactory;
+import org.eclipse.equinox.internal.p2.extensionlocation.ExtensionLocationMetadataRepositoryFactory;
+import org.eclipse.equinox.internal.p2.importexport.internal.Constants;
+import org.eclipse.equinox.internal.p2.importexport.internal.Messages;
+import org.eclipse.equinox.internal.p2.ui.ProvUI;
+import org.eclipse.equinox.internal.p2.ui.dialogs.ISelectableIUsPage;
+import org.eclipse.equinox.internal.p2.ui.dialogs.ProvisioningOperationWizard;
+import org.eclipse.equinox.internal.p2.ui.model.ProfileElement;
+import org.eclipse.equinox.internal.p2.ui.viewers.IUDetailsLabelProvider;
+import org.eclipse.equinox.p2.core.*;
+import org.eclipse.equinox.p2.engine.*;
+import org.eclipse.equinox.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
+import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactRepositoryFactory;
+import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
+import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
+import org.eclipse.equinox.p2.repository.metadata.spi.MetadataRepositoryFactory;
+import org.eclipse.equinox.p2.ui.ProvisioningUI;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.*;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class ImportFromInstallationPage extends AbstractImportPage implements ISelectableIUsPage {
+
+ protected IProvisioningAgent otherInstanceAgent = null;
+ IProfile toBeImportedProfile = null;
+ private File instancePath = null;
+ private URI[] metaURIs = null;
+ private URI[] artiURIs = null;
+ private IProvisioningAgentProvider agentProvider;
+
+ public ImportFromInstallationPage(ProvisioningUI ui, ProvisioningOperationWizard wizard) {
+ super("importfrominstancepage", ui, wizard); //$NON-NLS-1$
+ setTitle(Messages.ImportFromInstallationPage_DIALOG_TITLE);
+ setDescription(Messages.ImportFromInstallationPage_DIALOG_DESCRIPTION);
+ }
+
+ @Override
+ protected void createContents(Composite composite) {
+ createDestinationGroup(composite, true);
+ createInstallationTable(composite);
+ }
+
+ @Override
+ protected String getDestinationLabel() {
+ return Messages.ImportFromInstallationPage_DESTINATION_LABEL;
+ }
+
+ @Override
+ protected String getDialogTitle() {
+ return Messages.ImportFromInstallationPage_DIALOG_TITLE;
+ }
+
+ @Override
+ protected Object getInput() {
+ return new IInstallableUnit[0];
+ }
+
+ @Override
+ protected String getInvalidDestinationMessage() {
+ return Messages.ImportFromInstallationPage_INVALID_DESTINATION;
+ }
+
+ @Override
+ protected String getNoOptionsMessage() {
+ return Messages.ImportFromInstallationPage_SELECT_COMPONENT;
+ }
+
+ @Override
+ protected boolean validateDestinationGroup() {
+ return validateDestinationGroup(new NullProgressMonitor());
+ }
+
+ private IProvisioningAgentProvider getAgentProvider() {
+ if (agentProvider == null) {
+ ServiceTracker<IProvisioningAgentProvider, IProvisioningAgentProvider> tracker = new ServiceTracker<>(
+ Platform.getBundle(Constants.Bundle_ID).getBundleContext(), IProvisioningAgentProvider.class, null);
+ tracker.open();
+ agentProvider = tracker.getService();
+ tracker.close();
+ }
+ return agentProvider;
+ }
+
+ boolean validateDestinationGroup(IProgressMonitor monitor) {
+ SubMonitor progress = SubMonitor.convert(monitor, 100);
+
+ boolean rt;
+ if (Display.findDisplay(Thread.currentThread()) == null) {
+ Callable<Boolean> getSuperValidateDest = new Callable<Boolean>() {
+ Boolean validated;
+
+ @Override
+ public Boolean call() throws Exception {
+ Display.getDefault()
+ .syncExec(() -> validated = ImportFromInstallationPage.super.validateDestinationGroup());
+ return validated;
+ }
+ };
+ ExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+ Future<Boolean> getSuperDestTask = executor.submit(getSuperValidateDest);
+
+ try {
+ rt = getSuperDestTask.get().booleanValue();
+ } catch (Exception e) {
+ return false;
+ } finally {
+ executor.shutdown();
+ }
+ } else
+ rt = super.validateDestinationGroup();
+
+ if (rt) {
+ try {
+ String destination;
+ if (Display.findDisplay(Thread.currentThread()) == null) {
+ Callable<String> getDestinationValue = new Callable<String>() {
+ String des;
+
+ @Override
+ public String call() throws Exception {
+ if (Display.findDisplay(Thread.currentThread()) == null) {
+ Display.getDefault().syncExec(() -> des = getDestinationValue());
+ } else
+ des = getDestinationValue();
+ return des;
+ }
+ };
+ ExecutorService executor = Executors.newSingleThreadScheduledExecutor();
+ Future<String> getDestTask = executor.submit(getDestinationValue);
+ try {
+ destination = getDestTask.get();
+ } finally {
+ executor.shutdown();
+ }
+ } else
+ destination = getDestinationValue();
+
+ String toBeImportedProfileId = null;
+ try {
+ File config = new File(destination, "configuration/config.ini"); //$NON-NLS-1$
+ URI configArea = config.getParentFile().toURI();
+ InputStream is = null;
+ // default area
+ File p2DataArea = new File(destination, "p2"); //$NON-NLS-1$
+ try {
+ Properties props = new Properties();
+ is = new FileInputStream(config);
+ props.load(is);
+ toBeImportedProfileId = props.getProperty("eclipse.p2.profile"); //$NON-NLS-1$
+ String url = props.getProperty("eclipse.p2.data.area"); //$NON-NLS-1$
+ if (url != null) {
+ final String CONFIG_DIR = "@config.dir/"; //$NON-NLS-1$
+ final String FILE_PROTOCOL = "file:"; //$NON-NLS-1$
+ if (url.startsWith(CONFIG_DIR))
+ url = FILE_PROTOCOL + url.substring(CONFIG_DIR.length());
+ p2DataArea = new File(URIUtil.makeAbsolute(URIUtil
+ .fromString(new File(url.substring(FILE_PROTOCOL.length())).isAbsolute() ? url
+ : url.substring(FILE_PROTOCOL.length())),
+ configArea));
+ }
+ } catch (IOException ioe) {
+ // ignore
+ } finally {
+ try {
+ is.close();
+ } catch (IOException ioe) {
+ // ignore
+ }
+ is = null;
+ }
+ if (p2DataArea.exists()) {
+ boolean createAgent = true;
+ if (otherInstanceAgent != null) {
+ // don't create agent again if the selection is not changed
+ if (!p2DataArea.equals(instancePath)) {
+ otherInstanceAgent.stop();
+ otherInstanceAgent = null;
+ // update cached specified path by users
+ instancePath = p2DataArea;
+ cleanLocalRepository();
+ } else
+ createAgent = false;
+ }
+ if (createAgent)
+ otherInstanceAgent = getAgentProvider().createAgent(p2DataArea.toURI());
+ ArtifactRepositoryFactory factory = new ExtensionLocationArtifactRepositoryFactory();
+ factory.setAgent(agent);
+ IArtifactRepository artiRepo = factory.load(new File(destination).toURI(), 0,
+ progress.newChild(50));
+ artiURIs = new URI[] { artiRepo.getLocation() };
+ MetadataRepositoryFactory metaFatory = new ExtensionLocationMetadataRepositoryFactory();
+ metaFatory.setAgent(agent);
+ IMetadataRepository metaRepo = metaFatory.load(new File(destination).toURI(), 0,
+ progress.newChild(50));
+ metaURIs = new URI[] { metaRepo.getLocation() };
+
+ } else
+ throw new FileNotFoundException();
+ } catch (ProvisionException e) {
+ if (otherInstanceAgent != null) {
+ toBeImportedProfile = null;
+ IMetadataRepositoryManager manager = agent.getService(IMetadataRepositoryManager.class);
+ IArtifactRepositoryManager artifactManager = agent.getService(IArtifactRepositoryManager.class);
+ IProfileRegistry registry = otherInstanceAgent.getService(IProfileRegistry.class);
+ if (toBeImportedProfileId != null)
+ toBeImportedProfile = registry.getProfile(toBeImportedProfileId);
+ if (toBeImportedProfile == null) {
+ IProfile[] existingProfiles = registry.getProfiles();
+ if (existingProfiles.length == 1) {
+ toBeImportedProfile = existingProfiles[0];
+ } else {
+ for (IProfile existingProfile : existingProfiles) {
+ if (toBeImportedProfile == null)
+ toBeImportedProfile = existingProfile;
+ else if ((toBeImportedProfile.getTimestamp() < existingProfile.getTimestamp())) // assuming
+ // last
+ // modified
+ // one
+ // is
+ // we
+ // are
+ // looking
+ // for
+ toBeImportedProfile = existingProfile;
+ }
+ }
+ }
+ IAgentLocation location = otherInstanceAgent.getService(IAgentLocation.class);
+ URI engineDataArea = location.getDataArea("org.eclipse.equinox.p2.engine"); //$NON-NLS-1$
+ progress.setWorkRemaining(50);
+ IMetadataRepository metaRepo = manager.loadRepository(
+ engineDataArea
+ .resolve("profileRegistry/" + toBeImportedProfile.getProfileId() + ".profile"), //$NON-NLS-1$//$NON-NLS-2$
+ progress.newChild(25));
+ metaURIs = new URI[] { metaRepo.getLocation() };
+ IArtifactRepository artiRepo = artifactManager.loadRepository(new File(destination).toURI(),
+ progress.newChild(25));
+ artiURIs = new URI[] { artiRepo.getLocation() };
+ } else
+ throw new Exception();
+ }
+ } catch (Exception e) {
+ Display.getDefault().asyncExec(() -> setErrorMessage(getInvalidDestinationMessage()));
+ rt = false;
+ if (otherInstanceAgent != null)
+ otherInstanceAgent.stop();
+ otherInstanceAgent = null;
+ toBeImportedProfile = null;
+ cleanLocalRepository();
+ } finally {
+ monitor.done();
+ }
+ }
+ return rt;
+ }
+
+ @Override
+ protected void giveFocusToDestination() {
+ destinationBrowseButton.setFocus();
+ }
+
+ @Override
+ protected void handleDestinationBrowseButtonPressed() {
+ DirectoryDialog dialog = new DirectoryDialog(getContainer().getShell());
+ dialog.setText(getDialogTitle());
+ dialog.setFilterPath(getDestinationValue());
+ final String selectedFileName = dialog.open();
+
+ if (selectedFileName != null) {
+ modifyDestinationValue(selectedFileName);
+ handleDestinationChanged(selectedFileName);
+ }
+ }
+
+ @Override
+ protected void handleDestinationChanged(String newDestination) {
+ try {
+ getContainer().run(true, false, monitor -> {
+ Object input = null;
+ if (validateDestinationGroup(monitor)) {
+ final IProfile currentProfile = toBeImportedProfile;
+ final ProfileElement element = new ProfileElement(null, currentProfile.getProfileId()) {
+ @Override
+ public org.eclipse.equinox.p2.query.IQueryable<?> getQueryable() {
+ return currentProfile;
+ }
+ };
+ element.setQueryable(currentProfile);
+ input = element;
+
+ }
+ final Object viewerInput = input;
+ Display.getDefault().asyncExec(() -> {
+ viewer.setInput(viewerInput);
+ updatePageCompletion();
+ });
+ });
+ } catch (InvocationTargetException e) {
+ setErrorMessage(e.getLocalizedMessage());
+ setPageComplete(false);
+ } catch (InterruptedException e) {
+ // won't happen
+ }
+ }
+
+ @Override
+ void modifyDestinationValue(String selectedFileName) {
+ /*
+ * If the destination file is a Mac app bundle, modify the destination to
+ * *.app/Contents/Eclipse if the path exists.
+ */
+ if ("cocoa".equals(SWT.getPlatform())) { //$NON-NLS-1$
+ Path nPath = new Path(selectedFileName);
+ if (nPath.lastSegment().endsWith(".app")) { //$NON-NLS-1$
+ IPath appendedPath = nPath.append("Contents").append("Eclipse");//$NON-NLS-1$ //$NON-NLS-2$
+ if (appendedPath.toFile().exists()) {
+ selectedFileName = appendedPath.toOSString();
+ }
+ }
+ }
+ setDestinationValue(selectedFileName);
+ }
+
+ @Override
+ protected boolean validDestination() {
+ if (this.destinationNameField == null)
+ return true;
+ File file = new File(getDestinationValue());
+ return file.exists() && file.isDirectory();
+ }
+
+ class ImportFromInstallationLabelProvider extends IUDetailsLabelProvider {
+ @Override
+ public String getColumnText(Object element, int columnIndex) {
+ String text = super.getColumnText(element, columnIndex);
+ // it's the order of label provider
+ if (columnIndex == 0) {
+ IInstallableUnit iu = ProvUI.getAdapter(element, IInstallableUnit.class);
+ return getIUNameWithDetail(iu);
+ }
+ return text;
+ }
+
+ @Override
+ public Color getForeground(Object element) {
+ IInstallableUnit iu = ProvUI.getAdapter(element, IInstallableUnit.class);
+ if (hasInstalled(iu))
+ return Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
+ return super.getForeground(element);
+ }
+ }
+
+ @Override
+ protected ITableLabelProvider getLabelProvider() {
+ return new ImportFromInstallationLabelProvider();
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (otherInstanceAgent != null) {
+ otherInstanceAgent.stop();
+ otherInstanceAgent = null;
+ toBeImportedProfile = null;
+ }
+ if (getWizard().performCancel())
+ cleanLocalRepository();
+ }
+
+ public void cleanLocalRepository() {
+ if (metaURIs != null && metaURIs.length > 0) {
+ IProvisioningAgent runningAgent = getProvisioningUI().getSession().getProvisioningAgent();
+ IMetadataRepositoryManager manager = runningAgent.getService(IMetadataRepositoryManager.class);
+ for (URI uri : metaURIs)
+ manager.removeRepository(uri);
+ IArtifactRepositoryManager artifactManager = runningAgent.getService(IArtifactRepositoryManager.class);
+ for (URI uri : artiURIs)
+ artifactManager.removeRepository(uri);
+ }
+ }
+
+ @Override
+ public Object[] getCheckedIUElements() {
+ return viewer.getCheckedElements();
+ }
+
+ @Override
+ public Object[] getSelectedIUElements() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void setCheckedElements(Object[] elements) {
+ new UnsupportedOperationException();
+ }
+
+ public ProvisioningContext getProvisioningContext() {
+ ProvisioningContext context = new ProvisioningContext(getProvisioningUI().getSession().getProvisioningAgent());
+ context.setArtifactRepositories(artiURIs);
+ context.setMetadataRepositories(metaURIs);
+ return context;
+ }
} \ No newline at end of file

Back to the top