### Eclipse Workspace Patch 1.0 #P org.eclipse.pde.core Index: src/org/eclipse/pde/internal/core/target/provisional/ITargetPlatformService.java =================================================================== RCS file: /cvsroot/eclipse/pde/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/provisional/ITargetPlatformService.java,v retrieving revision 1.4 diff -u -r1.4 ITargetPlatformService.java --- src/org/eclipse/pde/internal/core/target/provisional/ITargetPlatformService.java 19 Jan 2009 17:54:59 -0000 1.4 +++ src/org/eclipse/pde/internal/core/target/provisional/ITargetPlatformService.java 23 Jan 2009 21:40:56 -0000 @@ -1,136 +1,147 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 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 org.eclipse.pde.internal.core.target.provisional; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * A service to manage target platform definitions available to the workspace. - * - * @since 3.5 - */ -public interface ITargetPlatformService { - - /** - * Returns handles to all target definitions known in the workspace. - * - * @return handles to all target definitions known in the workspace - */ - public ITargetHandle[] getTargets(IProgressMonitor monitor); - - /** - * Returns a handle to a target definition backed by the underlying file. - * The target definition may or may not exist. If the file does not exist - * then this is a new target definition which becomes one of the known - * workspace target definitions when it is saved. - * - * @param file target definition file that may or may not exist - * @return target handle - */ - public ITargetHandle getTarget(IFile file); - - /** - * Returns a new target definition to be stored with local metadata. The target - * becomes one of the known workspace target definitions when it is saved. - * - * @return new empty target definition - */ - public ITargetDefinition newTarget(); - - /** - * Persists the given target definition. The target becomes one of known - * workspace target definitions when it is saved. - *

- * The target is persisted in a location determined by its handle. A handle - * may refer to an {@link IFile} or a workspace metadata location. Any existing - * target definition at the same location is overwritten. - *

- * @param definition definition to persist - * @throws CoreException if unable to persist the definition - */ - public void saveTargetDefinition(ITargetDefinition definition) throws CoreException; - - /** - * Deletes the target definition associated with the given handle. - * - * @param handle target handle - * @throws CoreException if the associated target does not exist or deletion fails - */ - public void deleteTarget(ITargetHandle handle) throws CoreException; - - /** - * Creates and returns a target handle from the given memento. The memento must - * have been generated from {@link ITargetHandle#getMemento()}. - * - * @param memento a target handle memento - * @return target handle - * @throws CoreException if the target handle format is invalid - */ - public ITargetHandle getTarget(String memento) throws CoreException; - - /** - * Creates and returns a bundle container that contains all bundles in the - * specified directory which may contain string substitution variables. - * - * @param path absolute path in the local file system, may contain string variables - * @return bundle container - */ - public IBundleContainer newDirectoryContainer(String path); - - /** - * Creates and returns a bundle container that contains all bundles installed in - * a profile at the specified location with the specified configuration area. If - * a configuration area is not specified the default location is used. The specified - * home location and configuration location may contain string substitution variables. - * - * @param home absolute path in the local file system to the root of an installed profile - * which may contain string substitution variables - * @param configurationLocation absolute path in the local file system to the - * configuration area for the specified installation which may contain string substitution - * variables or null to use the default location - * @return bundle container - */ - public IBundleContainer newProfileContainer(String home, String configurationLocation); - - /** - * Creates and returns a bundle container that contains all bundles referenced by - * the feature at the specified location. The location is the directory that defines - * the feature. - * - * @param home installation location containing a features directory which may contain - * string substitution variables - * @param featureId feature symbolic name - * @param version feature version identifier or null to use most recent available - * @return bundle container - */ - public IBundleContainer newFeatureContainer(String home, String featureId, String version); - - /** - * Returns a handle to the target definition that corresponds to the active target platform - * or null if none. - * - * @return handle to workspace target platform or null if none - * @exception CoreException if an error occurs generating the handle - */ - public ITargetHandle getWorkspaceTargetHandle() throws CoreException; - - /** - * Copies all attributes from one target definition to another. - * - * @param from attributes are copied from this definition - * @param to attributes are copied to this definition - * @throws CoreException in copy fails - */ - public void copyTargetDefinition(ITargetDefinition from, ITargetDefinition to) throws CoreException; - -} +/******************************************************************************* + * Copyright (c) 2008, 2009 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 org.eclipse.pde.internal.core.target.provisional; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * A service to manage target platform definitions available to the workspace. + * + * @since 3.5 + */ +public interface ITargetPlatformService { + + /** + * Returns handles to all target definitions known in the workspace. + * + * @return handles to all target definitions known in the workspace + */ + public ITargetHandle[] getTargets(IProgressMonitor monitor); + + /** + * Returns a handle to a target definition backed by the underlying file. + * The target definition may or may not exist. If the file does not exist + * then this is a new target definition which becomes one of the known + * workspace target definitions when it is saved. + * + * @param file target definition file that may or may not exist + * @return target handle + */ + public ITargetHandle getTarget(IFile file); + + /** + * Returns a new target definition to be stored with local metadata. The target + * becomes one of the known workspace target definitions when it is saved. + * + * @return new empty target definition + */ + public ITargetDefinition newTarget(); + + /** + * Persists the given target definition. The target becomes one of known + * workspace target definitions when it is saved. + *

+ * The target is persisted in a location determined by its handle. A handle + * may refer to an {@link IFile} or a workspace metadata location. Any existing + * target definition at the same location is overwritten. + *

+ * @param definition definition to persist + * @throws CoreException if unable to persist the definition + */ + public void saveTargetDefinition(ITargetDefinition definition) throws CoreException; + + /** + * Deletes the target definition associated with the given handle. + * + * @param handle target handle + * @throws CoreException if the associated target does not exist or deletion fails + */ + public void deleteTarget(ITargetHandle handle) throws CoreException; + + /** + * Creates and returns a target handle from the given memento. The memento must + * have been generated from {@link ITargetHandle#getMemento()}. + * + * @param memento a target handle memento + * @return target handle + * @throws CoreException if the target handle format is invalid + */ + public ITargetHandle getTarget(String memento) throws CoreException; + + /** + * Creates and returns a bundle container that contains all bundles in the + * specified directory which may contain string substitution variables. + * + * @param path absolute path in the local file system, may contain string variables + * @return bundle container + */ + public IBundleContainer newDirectoryContainer(String path); + + /** + * Creates and returns a bundle container that contains all bundles installed in + * a profile at the specified location with the specified configuration area. If + * a configuration area is not specified the default location is used. The specified + * home location and configuration location may contain string substitution variables. + * + * @param home absolute path in the local file system to the root of an installed profile + * which may contain string substitution variables + * @param configurationLocation absolute path in the local file system to the + * configuration area for the specified installation which may contain string substitution + * variables or null to use the default location + * @return bundle container + */ + public IBundleContainer newProfileContainer(String home, String configurationLocation); + + /** + * Creates and returns a bundle container that contains all bundles referenced by + * the feature at the specified location. The location is the directory that defines + * the feature. + * + * @param home installation location containing a features directory which may contain + * string substitution variables + * @param featureId feature symbolic name + * @param version feature version identifier or null to use most recent available + * @return bundle container + */ + public IBundleContainer newFeatureContainer(String home, String featureId, String version); + + /** + * Returns a handle to the target definition that corresponds to the active target platform + * or null if none. + * + * @return handle to workspace target platform or null if none + * @exception CoreException if an error occurs generating the handle + */ + public ITargetHandle getWorkspaceTargetHandle() throws CoreException; + + /** + * Copies all attributes from one target definition to another. + * + * @param from attributes are copied from this definition + * @param to attributes are copied to this definition + * @throws CoreException in copy fails + */ + public void copyTargetDefinition(ITargetDefinition from, ITargetDefinition to) throws CoreException; + + /** + * Sets the content of the given target definition based on the target file supplied + * by an org.eclipse.pde.core.targets extension with the specified identifier. + * + * @param definition target definition to load + * @param targetExtensionId identifier of a targets extension + * @throws CoreException if the extension is not found or an error occurs reading the target + * file or loading the target definition + */ + public void loadTargetDefinition(ITargetDefinition definition, String targetExtensionId) throws CoreException; + +} Index: src/org/eclipse/pde/internal/core/target/provisional/LoadTargetDefinitionJob.java =================================================================== RCS file: /cvsroot/eclipse/pde/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/provisional/LoadTargetDefinitionJob.java,v retrieving revision 1.5 diff -u -r1.5 LoadTargetDefinitionJob.java --- src/org/eclipse/pde/internal/core/target/provisional/LoadTargetDefinitionJob.java 21 Jan 2009 20:40:14 -0000 1.5 +++ src/org/eclipse/pde/internal/core/target/provisional/LoadTargetDefinitionJob.java 23 Jan 2009 21:40:56 -0000 @@ -1,327 +1,379 @@ -/******************************************************************************* - * Copyright (c) 2009 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 org.eclipse.pde.internal.core.target.provisional; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.*; -import org.eclipse.core.resources.WorkspaceJob; -import org.eclipse.core.runtime.*; -import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.variables.IStringVariableManager; -import org.eclipse.core.variables.VariablesPlugin; -import org.eclipse.equinox.internal.provisional.frameworkadmin.BundleInfo; -import org.eclipse.jdt.launching.IVMInstall; -import org.eclipse.jdt.launching.JavaRuntime; -import org.eclipse.pde.core.plugin.IPluginModelBase; -import org.eclipse.pde.core.plugin.TargetPlatform; -import org.eclipse.pde.internal.core.*; -import org.eclipse.pde.internal.core.target.impl.*; - -/** - * Sets the current target platform based on a target definition. - * - * @since 3.5 - */ -public class LoadTargetDefinitionJob extends WorkspaceJob { - - /** - * Target definition being loaded - */ - private ITargetDefinition fTarget; - - /** - * Whether a target definition was specified - */ - private boolean fNone = false; - - /** - * Constructs a new operation to load the specified target definition - * as the current target platform. When null is specified - * the target platform is empty and all other settings are default. - * - * @param target target definition or null if none - */ - public LoadTargetDefinitionJob(ITargetDefinition target) { - super(Messages.LoadTargetDefinitionJob_0); - fTarget = target; - if (target == null) { - fNone = true; - ITargetPlatformService service = (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName()); - fTarget = service.newTarget(); - } - } - - /* (non-Javadoc) - * @see org.eclipse.core.resources.WorkspaceJob#runInWorkspace(org.eclipse.core.runtime.IProgressMonitor) - */ - public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { - try { - Preferences preferences = PDECore.getDefault().getPluginPreferences(); - monitor.beginTask(Messages.LoadTargetOperation_mainTaskName, 100); - loadEnvironment(preferences, new SubProgressMonitor(monitor, 5)); - loadArgs(preferences, new SubProgressMonitor(monitor, 5)); - loadJRE(preferences, new SubProgressMonitor(monitor, 15)); - loadImplicitPlugins(preferences, new SubProgressMonitor(monitor, 15)); - loadPlugins(preferences, new SubProgressMonitor(monitor, 60)); - loadAdditionalPreferences(preferences); - PDECore.getDefault().savePluginPreferences(); - } finally { - monitor.done(); - } - return Status.OK_STATUS; - } - - /** - * Configures program and VM argument preferences based on the target - * definition. - * - * @param pref preference store - * @param monitor progress monitor - */ - private void loadArgs(Preferences pref, IProgressMonitor monitor) { - monitor.beginTask(Messages.LoadTargetOperation_argsTaskName, 2); - String args = fTarget.getProgramArguments(); - pref.setValue(ICoreConstants.PROGRAM_ARGS, (args != null) ? args : ""); //$NON-NLS-1$ - monitor.worked(1); - args = fTarget.getVMArguments(); - pref.setValue(ICoreConstants.VM_ARGS, (args != null) ? args : ""); //$NON-NLS-1$ - monitor.done(); - } - - /** - * Configures the environment preferences from the target definition. - * - * @param pref preference store - * @param monitor progress monitor - */ - private void loadEnvironment(Preferences pref, IProgressMonitor monitor) { - monitor.beginTask(Messages.LoadTargetOperation_envTaskName, 1); - setEnvironmentPref(pref, ICoreConstants.ARCH, fTarget.getArch()); - setEnvironmentPref(pref, ICoreConstants.NL, fTarget.getNL()); - setEnvironmentPref(pref, ICoreConstants.OS, fTarget.getOS()); - setEnvironmentPref(pref, ICoreConstants.WS, fTarget.getWS()); - monitor.done(); - } - - /** - * Sets the given preference to default when null or the - * specified value. - * - * @param pref preference store - * @param key preference key - * @param value preference value or null - */ - private void setEnvironmentPref(Preferences pref, String key, String value) { - if (value == null) { - pref.setToDefault(key); - } else { - pref.setValue(key, value); - } - } - - /** - * Sets the workspace default JRE based on the target's JRE container. - * - * @param pref - * @param monitor - */ - private void loadJRE(Preferences pref, IProgressMonitor monitor) { - IPath container = fTarget.getJREContainer(); - monitor.beginTask(Messages.LoadTargetOperation_jreTaskName, 1); - if (container != null) { - IVMInstall jre = JavaRuntime.getVMInstall(container); - if (jre != null) { - IVMInstall def = JavaRuntime.getDefaultVMInstall(); - if (!jre.equals(def)) { - try { - JavaRuntime.setDefaultVMInstall(jre, null); - } catch (CoreException e) { - } - } - } - } - monitor.done(); - } - - /** - * Sets implicit dependencies, if any - * - * @param pref preference store - * @param monitor progress monitor - */ - private void loadImplicitPlugins(Preferences pref, IProgressMonitor monitor) { - BundleInfo[] infos = fTarget.getImplicitDependencies(); - if (infos != null) { - monitor.beginTask(Messages.LoadTargetOperation_implicitPluginsTaskName, infos.length + 1); - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < infos.length; i++) { - buffer.append(infos[i].getSymbolicName()).append(','); - monitor.worked(1); - } - if (infos.length > 0) - buffer.setLength(buffer.length() - 1); - pref.setValue(ICoreConstants.IMPLICIT_DEPENDENCIES, buffer.toString()); - } - monitor.done(); - } - - /** - * Resolves the bundles in the target platform and sets them in the corresponding - * CHECKED_PLUGINS preference. Sets home and addition location preferences as well. - * - * @param pref - * @param monitor - * @throws CoreException - */ - private void loadPlugins(Preferences pref, IProgressMonitor monitor) throws CoreException { - monitor.beginTask(Messages.LoadTargetOperation_loadPluginsTaskName, 100); - String currentPath = pref.getString(ICoreConstants.PLATFORM_PATH); - IBundleContainer[] containers = fTarget.getBundleContainers(); - // the first container is assumed to be the primary/home location - String path = null; - if (containers != null && containers.length > 0) { - path = ((AbstractBundleContainer) containers[0]).getLocation(true); - } - if (path == null) { - path = TargetPlatform.getDefaultLocation(); - } else { - try { - IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager(); - path = manager.performStringSubstitution(path); - } catch (CoreException e) { - return; - } - } - monitor.worked(10); - List additional = getAdditionalLocs(); - handleReload(path, additional, pref, new SubProgressMonitor(monitor, 85)); - - // update preferences (Note: some preferences updated in handleReload()) - pref.setValue(ICoreConstants.PLATFORM_PATH, path); - String mode = new Path(path).equals(new Path(TargetPlatform.getDefaultLocation())) ? ICoreConstants.VALUE_USE_THIS : ICoreConstants.VALUE_USE_OTHER; - pref.setValue(ICoreConstants.TARGET_MODE, mode); - - ListIterator li = additional.listIterator(); - StringBuffer buffer = new StringBuffer(); - while (li.hasNext()) - buffer.append(li.next()).append(","); //$NON-NLS-1$ - if (buffer.length() > 0) - buffer.setLength(buffer.length() - 1); - pref.setValue(ICoreConstants.ADDITIONAL_LOCATIONS, buffer.toString()); - - String newValue = currentPath; - for (int i = 0; i < 4; i++) { - String value = pref.getString(ICoreConstants.SAVED_PLATFORM + i); - pref.setValue(ICoreConstants.SAVED_PLATFORM + i, newValue); - if (!value.equals(currentPath)) - newValue = value; - else - break; - } - monitor.done(); - } - - /** - * Sets the TARGET_PROFILE preference which stores the ID of the target profile used - * (if based on an target extension) or the workspace location of the file that - * was used. For now we just clear it. - *

- * Sets the WORKSPACE_TARGET_HANDLE. - *

- * @param pref - */ - private void loadAdditionalPreferences(Preferences pref) throws CoreException { - pref.setValue(ICoreConstants.TARGET_PROFILE, ""); //$NON-NLS-1$ - String memento = fTarget.getHandle().getMemento(); - if (fNone) { - memento = ""; //$NON-NLS-1$ - } - pref.setValue(ICoreConstants.WORKSPACE_TARGET_HANDLE, memento); - IBundleContainer[] containers = fTarget.getBundleContainers(); - boolean profile = false; - if (containers.length > 0) { - profile = containers[0] instanceof ProfileBundleContainer; - } - pref.setValue(ICoreConstants.TARGET_PLATFORM_REALIZATION, profile); - } - - /** - * Returns a list of additional locations of bundles. - * - * @return additional bundle locations - */ - private List getAdditionalLocs() throws CoreException { - ArrayList additional = new ArrayList(); - // secondary containers are considered additional - IBundleContainer[] containers = fTarget.getBundleContainers(); - if (containers != null && containers.length > 1) { - for (int i = 1; i < containers.length; i++) { - additional.add(((AbstractBundleContainer) containers[i]).getLocation(true)); - } - } - return additional; - } - - private void handleReload(String targetLocation, List additionalLocations, Preferences pref, IProgressMonitor monitor) throws CoreException { - monitor.beginTask(Messages.LoadTargetOperation_reloadTaskName, 85); - - List infos = new ArrayList(); - BundleInfo[] code = fTarget.resolveBundles(null); - for (int i = 0; i < code.length; i++) { - infos.add(code[i]); - } - // to be consistent with previous implementation, add source bundles - BundleInfo[] sourceBundles = fTarget.resolveSourceBundles(null); - for (int i = 0; i < sourceBundles.length; i++) { - infos.add(sourceBundles[i]); - } - BundleInfo[] bundles = (BundleInfo[]) infos.toArray(new BundleInfo[infos.size()]); - // generate URLs and save CHECKED_PLUGINS - StringBuffer checked = new StringBuffer(); - - URL[] paths = new URL[bundles.length]; - for (int i = 0; i < paths.length; i++) { - try { - paths[i] = new File(bundles[i].getLocation()).toURL(); - if (i > 0) { - checked.append(" "); //$NON-NLS-1$ - } - checked.append(bundles[i].getSymbolicName()); - } catch (MalformedURLException e) { - throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, Messages.LoadTargetDefinitionJob_1, e)); - } - } - - PDEState state = new PDEState(paths, true, new SubProgressMonitor(monitor, 45)); - IPluginModelBase[] models = state.getTargetModels(); - for (int i = 0; i < models.length; i++) { - models[i].setEnabled(true); - } - // save CHECKED_PLUGINS - if (paths.length == 0) { - pref.setValue(ICoreConstants.CHECKED_PLUGINS, ICoreConstants.VALUE_SAVED_NONE); - } else { - pref.setValue(ICoreConstants.CHECKED_PLUGINS, checked.toString()); - } - - Job job = new TargetPlatformResetJob(state); - job.schedule(); - try { - job.join(); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - } - monitor.done(); - } - -} +/******************************************************************************* + * Copyright (c) 2009 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 org.eclipse.pde.internal.core.target.provisional; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; +import org.eclipse.core.resources.WorkspaceJob; +import org.eclipse.core.runtime.*; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.variables.IStringVariableManager; +import org.eclipse.core.variables.VariablesPlugin; +import org.eclipse.equinox.internal.provisional.frameworkadmin.BundleInfo; +import org.eclipse.jdt.launching.IVMInstall; +import org.eclipse.jdt.launching.JavaRuntime; +import org.eclipse.pde.core.plugin.IPluginModelBase; +import org.eclipse.pde.core.plugin.TargetPlatform; +import org.eclipse.pde.internal.core.*; +import org.eclipse.pde.internal.core.target.impl.*; + +/** + * Sets the current target platform based on a target definition. + * + * @since 3.5 + */ +public class LoadTargetDefinitionJob extends WorkspaceJob { + + /** + * Target definition being loaded + */ + private ITargetDefinition fTarget; + + /** + * Whether a target definition was specified + */ + private boolean fNone = false; + + /** + * Constructs a new operation to load the specified target definition + * as the current target platform. When null is specified + * the target platform is empty and all other settings are default. + * + * @param target target definition or null if none + */ + public LoadTargetDefinitionJob(ITargetDefinition target) { + super(Messages.LoadTargetDefinitionJob_0); + fTarget = target; + if (target == null) { + fNone = true; + ITargetPlatformService service = (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName()); + fTarget = service.newTarget(); + } + } + + /* (non-Javadoc) + * @see org.eclipse.core.resources.WorkspaceJob#runInWorkspace(org.eclipse.core.runtime.IProgressMonitor) + */ + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { + try { + Preferences preferences = PDECore.getDefault().getPluginPreferences(); + monitor.beginTask(Messages.LoadTargetOperation_mainTaskName, 100); + loadEnvironment(preferences, new SubProgressMonitor(monitor, 5)); + loadArgs(preferences, new SubProgressMonitor(monitor, 5)); + loadJRE(preferences, new SubProgressMonitor(monitor, 15)); + loadImplicitPlugins(preferences, new SubProgressMonitor(monitor, 15)); + loadPlugins(preferences, new SubProgressMonitor(monitor, 60)); + loadAdditionalPreferences(preferences); + PDECore.getDefault().savePluginPreferences(); + } finally { + monitor.done(); + } + return Status.OK_STATUS; + } + + /** + * Configures program and VM argument preferences based on the target + * definition. + * + * @param pref preference store + * @param monitor progress monitor + */ + private void loadArgs(Preferences pref, IProgressMonitor monitor) { + monitor.beginTask(Messages.LoadTargetOperation_argsTaskName, 2); + String args = fTarget.getProgramArguments(); + pref.setValue(ICoreConstants.PROGRAM_ARGS, (args != null) ? args : ""); //$NON-NLS-1$ + monitor.worked(1); + args = fTarget.getVMArguments(); + pref.setValue(ICoreConstants.VM_ARGS, (args != null) ? args : ""); //$NON-NLS-1$ + monitor.done(); + } + + /** + * Configures the environment preferences from the target definition. + * + * @param pref preference store + * @param monitor progress monitor + */ + private void loadEnvironment(Preferences pref, IProgressMonitor monitor) { + monitor.beginTask(Messages.LoadTargetOperation_envTaskName, 1); + setEnvironmentPref(pref, ICoreConstants.ARCH, fTarget.getArch()); + setEnvironmentPref(pref, ICoreConstants.NL, fTarget.getNL()); + setEnvironmentPref(pref, ICoreConstants.OS, fTarget.getOS()); + setEnvironmentPref(pref, ICoreConstants.WS, fTarget.getWS()); + monitor.done(); + } + + /** + * Sets the given preference to default when null or the + * specified value. + * + * @param pref preference store + * @param key preference key + * @param value preference value or null + */ + private void setEnvironmentPref(Preferences pref, String key, String value) { + if (value == null) { + pref.setToDefault(key); + } else { + pref.setValue(key, value); + } + } + + /** + * Sets the workspace default JRE based on the target's JRE container. + * + * @param pref + * @param monitor + */ + private void loadJRE(Preferences pref, IProgressMonitor monitor) { + IPath container = fTarget.getJREContainer(); + monitor.beginTask(Messages.LoadTargetOperation_jreTaskName, 1); + if (container != null) { + IVMInstall jre = JavaRuntime.getVMInstall(container); + if (jre != null) { + IVMInstall def = JavaRuntime.getDefaultVMInstall(); + if (!jre.equals(def)) { + try { + JavaRuntime.setDefaultVMInstall(jre, null); + } catch (CoreException e) { + } + } + } + } + monitor.done(); + } + + /** + * Sets implicit dependencies, if any + * + * @param pref preference store + * @param monitor progress monitor + */ + private void loadImplicitPlugins(Preferences pref, IProgressMonitor monitor) { + BundleInfo[] infos = fTarget.getImplicitDependencies(); + if (infos != null) { + monitor.beginTask(Messages.LoadTargetOperation_implicitPluginsTaskName, infos.length + 1); + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < infos.length; i++) { + buffer.append(infos[i].getSymbolicName()).append(','); + monitor.worked(1); + } + if (infos.length > 0) + buffer.setLength(buffer.length() - 1); + pref.setValue(ICoreConstants.IMPLICIT_DEPENDENCIES, buffer.toString()); + } + monitor.done(); + } + + /** + * Resolves the bundles in the target platform and sets them in the corresponding + * CHECKED_PLUGINS preference. Sets home and addition location preferences as well. + * + * @param pref + * @param monitor + * @throws CoreException + */ + private void loadPlugins(Preferences pref, IProgressMonitor monitor) throws CoreException { + monitor.beginTask(Messages.LoadTargetOperation_loadPluginsTaskName, 100); + String currentPath = pref.getString(ICoreConstants.PLATFORM_PATH); + IBundleContainer[] containers = fTarget.getBundleContainers(); + // the first container is assumed to be the primary/home location + String path = null; + if (containers != null && containers.length > 0) { + path = ((AbstractBundleContainer) containers[0]).getLocation(true); + } + if (path == null) { + path = TargetPlatform.getDefaultLocation(); + } else { + try { + IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager(); + path = manager.performStringSubstitution(path); + } catch (CoreException e) { + return; + } + } + monitor.worked(10); + List additional = getAdditionalLocs(); + handleReload(path, additional, pref, new SubProgressMonitor(monitor, 85)); + + // update preferences (Note: some preferences updated in handleReload()) + pref.setValue(ICoreConstants.PLATFORM_PATH, path); + String mode = new Path(path).equals(new Path(TargetPlatform.getDefaultLocation())) ? ICoreConstants.VALUE_USE_THIS : ICoreConstants.VALUE_USE_OTHER; + pref.setValue(ICoreConstants.TARGET_MODE, mode); + + ListIterator li = additional.listIterator(); + StringBuffer buffer = new StringBuffer(); + while (li.hasNext()) + buffer.append(li.next()).append(","); //$NON-NLS-1$ + if (buffer.length() > 0) + buffer.setLength(buffer.length() - 1); + pref.setValue(ICoreConstants.ADDITIONAL_LOCATIONS, buffer.toString()); + + String newValue = currentPath; + for (int i = 0; i < 4; i++) { + String value = pref.getString(ICoreConstants.SAVED_PLATFORM + i); + pref.setValue(ICoreConstants.SAVED_PLATFORM + i, newValue); + if (!value.equals(currentPath)) + newValue = value; + else + break; + } + monitor.done(); + } + + /** + * Sets the TARGET_PROFILE preference which stores the ID of the target profile used + * (if based on an target extension) or the workspace location of the file that + * was used. For now we just clear it. + *

+ * Sets the WORKSPACE_TARGET_HANDLE. + *

+ * @param pref + */ + private void loadAdditionalPreferences(Preferences pref) throws CoreException { + pref.setValue(ICoreConstants.TARGET_PROFILE, ""); //$NON-NLS-1$ + String memento = fTarget.getHandle().getMemento(); + if (fNone) { + memento = ""; //$NON-NLS-1$ + } + pref.setValue(ICoreConstants.WORKSPACE_TARGET_HANDLE, memento); + IBundleContainer[] containers = fTarget.getBundleContainers(); + boolean profile = false; + if (containers != null && containers.length > 0) { + profile = containers[0] instanceof ProfileBundleContainer; + } + pref.setValue(ICoreConstants.TARGET_PLATFORM_REALIZATION, profile); + } + + /** + * Returns a list of additional locations of bundles. + * + * @return additional bundle locations + */ + private List getAdditionalLocs() throws CoreException { + ArrayList additional = new ArrayList(); + // secondary containers are considered additional + IBundleContainer[] containers = fTarget.getBundleContainers(); + if (containers != null && containers.length > 1) { + for (int i = 1; i < containers.length; i++) { + additional.add(((AbstractBundleContainer) containers[i]).getLocation(true)); + } + } + return additional; + } + + private void handleReload(String targetLocation, List additionalLocations, Preferences pref, IProgressMonitor monitor) throws CoreException { + monitor.beginTask(Messages.LoadTargetOperation_reloadTaskName, 85); + + Set included = new HashSet(); + List infos = new ArrayList(); + BundleInfo[] code = fTarget.resolveBundles(null); + for (int i = 0; i < code.length; i++) { + infos.add(code[i]); + included.add(code[i]); + } + // to be consistent with previous implementation, add source bundles + BundleInfo[] sourceBundles = fTarget.resolveSourceBundles(null); + for (int i = 0; i < sourceBundles.length; i++) { + infos.add(sourceBundles[i]); + included.add(sourceBundles[i]); + } + + // Compute missing bundles + List missing = new ArrayList(); + IBundleContainer[] containers = fTarget.getBundleContainers(); + if (containers != null) { + for (int i = 0; i < containers.length; i++) { + IBundleContainer container = containers[i]; + BundleInfo[] restrictions = container.getRestrictions(); + if (restrictions != null) { + try { + container.setRestrictions(null); + BundleInfo[] all = container.resolveBundles(null); + for (int j = 0; j < all.length; j++) { + BundleInfo bi = all[j]; + if (!included.contains(bi)) { + missing.add(bi); + } + } + all = container.resolveSourceBundles(null); + for (int j = 0; j < all.length; j++) { + BundleInfo bi = all[j]; + if (!included.contains(bi)) { + missing.add(bi); + } + } + } finally { + container.setRestrictions(restrictions); + } + } + } + } + + List paths = new ArrayList(infos.size() + missing.size()); + Iterator iterator = infos.iterator(); + while (iterator.hasNext()) { + BundleInfo info = (BundleInfo) iterator.next(); + try { + paths.add(new File(info.getLocation()).toURL()); + } catch (MalformedURLException e) { + throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, Messages.LoadTargetDefinitionJob_1, e)); + } + } + + // generate URLs and save CHECKED_PLUGINS (which are missing), and add to master list of paths + StringBuffer checked = new StringBuffer(); + int i = 0; + iterator = missing.iterator(); + Set missingIds = new HashSet(missing.size()); + while (iterator.hasNext()) { + BundleInfo bi = (BundleInfo) iterator.next(); + missingIds.add(bi.getSymbolicName()); + try { + paths.add(new File(bi.getLocation()).toURL()); + } catch (MalformedURLException e) { + throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, Messages.LoadTargetDefinitionJob_1, e)); + } + if (i > 0) { + checked.append(" "); //$NON-NLS-1$ + } + checked.append(bi.getSymbolicName()); + i++; + } + + URL[] urls = (URL[]) paths.toArray(new URL[paths.size()]); + PDEState state = new PDEState(urls, true, new SubProgressMonitor(monitor, 45)); + IPluginModelBase[] models = state.getTargetModels(); + for (i = 0; i < models.length; i++) { + models[i].setEnabled(!missingIds.contains(models[i].getPluginBase().getId())); + } + // save CHECKED_PLUGINS + if (urls.length == 0) { + pref.setValue(ICoreConstants.CHECKED_PLUGINS, ICoreConstants.VALUE_SAVED_NONE); + } else if (missing.size() == 0) { + pref.setValue(ICoreConstants.CHECKED_PLUGINS, ICoreConstants.VALUE_SAVED_ALL); + } else { + pref.setValue(ICoreConstants.CHECKED_PLUGINS, checked.toString()); + } + + Job job = new TargetPlatformResetJob(state); + job.schedule(); + try { + job.join(); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + } + monitor.done(); + } + +} Index: src/org/eclipse/pde/internal/core/PluginModelManager.java =================================================================== RCS file: /cvsroot/eclipse/pde/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginModelManager.java,v retrieving revision 1.123 diff -u -r1.123 PluginModelManager.java --- src/org/eclipse/pde/internal/core/PluginModelManager.java 13 Oct 2008 19:21:11 -0000 1.123 +++ src/org/eclipse/pde/internal/core/PluginModelManager.java 23 Jan 2009 21:40:56 -0000 @@ -14,14 +14,15 @@ import java.util.*; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.*; import org.eclipse.jdt.core.*; import org.eclipse.osgi.service.resolver.*; import org.eclipse.pde.core.*; import org.eclipse.pde.core.build.IBuild; import org.eclipse.pde.core.build.IBuildEntry; import org.eclipse.pde.core.plugin.*; +import org.eclipse.pde.internal.core.target.impl.*; +import org.eclipse.pde.internal.core.target.provisional.*; public class PluginModelManager implements IModelProviderListener { @@ -420,6 +421,64 @@ } fEntries = entries; + + // Create default target platform definition if required + initDefaultTargetPlatformDefinition(); + } + + /** + * Creates initial target platform definition in local metadata if not already created. + */ + private synchronized void initDefaultTargetPlatformDefinition() { + ITargetPlatformService service = (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName()); + if (service != null) { + String memento = PDECore.getDefault().getPluginPreferences().getString(ICoreConstants.WORKSPACE_TARGET_HANDLE); + if (memento.equals("")) { //$NON-NLS-1$ + // no workspace target handle set, check for local targets + ITargetHandle[] targets = service.getTargets(null); + boolean local = false; + for (int i = 0; i < targets.length; i++) { + if (targets[i] instanceof LocalTargetHandle) { + local = true; + break; + } + } + if (!local) { + // no local targets, no workspace preference > create default target platform + ITargetDefinition def = null; + TargetPlatformService ts = (TargetPlatformService) service; + ITargetDefinition host = ts.newDefaultTargetDefinition(); + try { + service.saveTargetDefinition(host); + } catch (CoreException e) { + PDECore.log(e); + } + // create target platform from current workspace settings + TargetDefinition curr = (TargetDefinition) ts.newTarget(); + try { + ts.loadTargetDefinitionFromPreferences(curr); + if (curr.isContentEqual(host)) { + // current settings are the same as the default target platform + def = host; + } else { + // current settings are different than default + service.saveTargetDefinition(curr); + def = curr; + } + } catch (CoreException e) { + PDECore.log(e); + } + if (def != null) { + Preferences preferences = PDECore.getDefault().getPluginPreferences(); + try { + preferences.setValue(ICoreConstants.WORKSPACE_TARGET_HANDLE, def.getHandle().getMemento()); + } catch (CoreException e) { + PDECore.log(e); + } + } + } + } + } } /** Index: src/org/eclipse/pde/internal/core/target/impl/AbstractBundleContainer.java =================================================================== RCS file: /cvsroot/eclipse/pde/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/impl/AbstractBundleContainer.java,v retrieving revision 1.7 diff -u -r1.7 AbstractBundleContainer.java --- src/org/eclipse/pde/internal/core/target/impl/AbstractBundleContainer.java 23 Jan 2009 16:04:27 -0000 1.7 +++ src/org/eclipse/pde/internal/core/target/impl/AbstractBundleContainer.java 23 Jan 2009 21:40:56 -0000 @@ -1,207 +1,208 @@ -/******************************************************************************* - * Copyright (c) 2009 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 org.eclipse.pde.internal.core.target.impl; - -import java.util.*; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.variables.IStringVariableManager; -import org.eclipse.core.variables.VariablesPlugin; -import org.eclipse.equinox.internal.provisional.frameworkadmin.BundleInfo; -import org.eclipse.pde.internal.core.target.provisional.IBundleContainer; - -/** - * Common function for bundle containers. - * - * @since 3.5 - */ -public abstract class AbstractBundleContainer implements IBundleContainer { - - /** - * Bundle restrictions (subset) this container is restricted to or null if - * no restrictions. - */ - private BundleInfo[] fRestrictions; - - /** - * Resolves any string substitution variables in the given text returning - * the result. - * - * @param text text to resolve - * @return result of the resolution - * @throws CoreException if unable to resolve - */ - protected String resolveVariables(String text) throws CoreException { - IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager(); - return manager.performStringSubstitution(text); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#resolveBundles(org.eclipse.core.runtime.IProgressMonitor) - */ - public final BundleInfo[] resolveBundles(IProgressMonitor monitor) throws CoreException { - BundleInfo[] all = resolveAllBundles(monitor); - return getMatchingBundles(all, getRestrictions()); - } - - /** - * Resolves all executable bundles in this container regardless of any bundle restrictions. - *

- * Subclasses must implement this method. - *

- * @param monitor progress monitor - * @return all executable bundles in this container regardless of any bundle restrictions - * @throws CoreException if an error occurs - */ - protected abstract BundleInfo[] resolveAllBundles(IProgressMonitor monitor) throws CoreException; - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#resolveSourceBundles(org.eclipse.core.runtime.IProgressMonitor) - */ - public final BundleInfo[] resolveSourceBundles(IProgressMonitor monitor) throws CoreException { - BundleInfo[] all = resolveAllSourceBundles(monitor); - return getMatchingBundles(all, getRestrictions()); - } - - /** - * Resolves all source bundles in this container regardless of any bundle restrictions. - *

- * Subclasses must implement this method. - *

- * @param monitor progress monitor - * @return all source bundles in this container regardless of any bundle restrictions - * @throws CoreException if an error occurs - */ - protected abstract BundleInfo[] resolveAllSourceBundles(IProgressMonitor monitor) throws CoreException; - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#getRestrictions() - */ - public BundleInfo[] getRestrictions() { - return fRestrictions; - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#setRestrictions(org.eclipse.equinox.internal.provisional.frameworkadmin.BundleInfo[]) - */ - public void setRestrictions(BundleInfo[] bundles) { - fRestrictions = bundles; - } - - /** - * Returns bundles from the specified collection that match the symbolic names - * and/or version in the specified criteria. When no version is specified - * the newest version (if any) is selected. - * - * @param collection bundles to resolve against match criteria - * @param criteria bundles to select or null if no restrictions - * @return bundles that match this container's restrictions - */ - static BundleInfo[] getMatchingBundles(BundleInfo[] collection, BundleInfo[] criteria) { - if (criteria == null) { - return collection; - } - // map bundles names to available versions - Map bundleMap = new HashMap(collection.length); - for (int i = 0; i < collection.length; i++) { - BundleInfo info = collection[i]; - List list = (List) bundleMap.get(info.getSymbolicName()); - if (list == null) { - list = new ArrayList(3); - bundleMap.put(info.getSymbolicName(), list); - } - list.add(info); - } - List subset = new ArrayList(criteria.length); - for (int i = 0; i < criteria.length; i++) { - BundleInfo info = criteria[i]; - List list = (List) bundleMap.get(info.getSymbolicName()); - if (list != null) { - String version = info.getVersion(); - if (version == null) { - // select newest - if (list.size() > 1) { - // sort the list - Collections.sort(list, new Comparator() { - public int compare(Object o1, Object o2) { - return ((BundleInfo) o1).getVersion().compareTo(((BundleInfo) o2).getVersion()); - } - }); - } - // select the last one - subset.add(list.get(list.size() - 1)); - } else { - Iterator iterator = list.iterator(); - boolean found = false; - while (iterator.hasNext() && !found) { - BundleInfo bundle = (BundleInfo) iterator.next(); - if (bundle.getVersion().equals(version)) { - subset.add(bundle); - found = true; - } - } - if (!found) { - // TODO: report not found? exception? - } - } - } else { - // TODO: report not found? exception? - } - } - return (BundleInfo[]) subset.toArray(new BundleInfo[subset.size()]); - } - - /** - * Returns a string that identifies the type of bundle container. This type is persisted to xml - * so that the correct bundle container is created when deserializing the xml. This type is also - * used to alter how the containers are presented to the user in the UI. - * - * @return string identifier for the type of bundle container. - */ - public abstract String getType(); - - /** - * Returns a path in the local file system to the root of the bundle container. - *

- * TODO: Ideally we won't need this method. Currently the PDE target platform preferences are - * based on a home location and additional locations, so we need the information. - *

- * @param resolve whether to resolve variables in the path - * @return home location - * @exception CoreException if unable to resolve the location - */ - public abstract String getLocation(boolean resolve) throws CoreException; - - /** - * Returns whether restrictions are equivalent. Subclasses should override for other data. - * - * @param container bundle container - * @return whether content is equivalent - */ - public boolean isContentEqual(AbstractBundleContainer container) { - if (fRestrictions == null) { - return container.fRestrictions == null; - } - if (container.fRestrictions == null) { - return false; - } - if (fRestrictions.length == container.fRestrictions.length) { - for (int i = 0; i < fRestrictions.length; i++) { - if (!fRestrictions[i].equals(container.fRestrictions[i])) { - return false; - } - } - return true; - } - return false; - } - -} +/******************************************************************************* + * Copyright (c) 2009 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 org.eclipse.pde.internal.core.target.impl; + +import java.util.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.variables.IStringVariableManager; +import org.eclipse.core.variables.VariablesPlugin; +import org.eclipse.equinox.internal.provisional.frameworkadmin.BundleInfo; +import org.eclipse.pde.internal.core.target.provisional.IBundleContainer; + +/** + * Common function for bundle containers. + * + * @since 3.5 + */ +public abstract class AbstractBundleContainer implements IBundleContainer { + + /** + * Bundle restrictions (subset) this container is restricted to or null if + * no restrictions. + */ + private BundleInfo[] fRestrictions; + + /** + * Resolves any string substitution variables in the given text returning + * the result. + * + * @param text text to resolve + * @return result of the resolution + * @throws CoreException if unable to resolve + */ + protected String resolveVariables(String text) throws CoreException { + IStringVariableManager manager = VariablesPlugin.getDefault().getStringVariableManager(); + return manager.performStringSubstitution(text); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#resolveBundles(org.eclipse.core.runtime.IProgressMonitor) + */ + public final BundleInfo[] resolveBundles(IProgressMonitor monitor) throws CoreException { + BundleInfo[] all = resolveAllBundles(monitor); + return getMatchingBundles(all, getRestrictions()); + } + + /** + * Resolves all executable bundles in this container regardless of any bundle restrictions. + *

+ * Subclasses must implement this method. + *

+ * @param monitor progress monitor + * @return all executable bundles in this container regardless of any bundle restrictions + * @throws CoreException if an error occurs + */ + protected abstract BundleInfo[] resolveAllBundles(IProgressMonitor monitor) throws CoreException; + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#resolveSourceBundles(org.eclipse.core.runtime.IProgressMonitor) + */ + public final BundleInfo[] resolveSourceBundles(IProgressMonitor monitor) throws CoreException { + BundleInfo[] all = resolveAllSourceBundles(monitor); + // for now, don't restrict source bundles + return all; + } + + /** + * Resolves all source bundles in this container regardless of any bundle restrictions. + *

+ * Subclasses must implement this method. + *

+ * @param monitor progress monitor + * @return all source bundles in this container regardless of any bundle restrictions + * @throws CoreException if an error occurs + */ + protected abstract BundleInfo[] resolveAllSourceBundles(IProgressMonitor monitor) throws CoreException; + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#getRestrictions() + */ + public BundleInfo[] getRestrictions() { + return fRestrictions; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.IBundleContainer#setRestrictions(org.eclipse.equinox.internal.provisional.frameworkadmin.BundleInfo[]) + */ + public void setRestrictions(BundleInfo[] bundles) { + fRestrictions = bundles; + } + + /** + * Returns bundles from the specified collection that match the symbolic names + * and/or version in the specified criteria. When no version is specified + * the newest version (if any) is selected. + * + * @param collection bundles to resolve against match criteria + * @param criteria bundles to select or null if no restrictions + * @return bundles that match this container's restrictions + */ + static BundleInfo[] getMatchingBundles(BundleInfo[] collection, BundleInfo[] criteria) { + if (criteria == null) { + return collection; + } + // map bundles names to available versions + Map bundleMap = new HashMap(collection.length); + for (int i = 0; i < collection.length; i++) { + BundleInfo info = collection[i]; + List list = (List) bundleMap.get(info.getSymbolicName()); + if (list == null) { + list = new ArrayList(3); + bundleMap.put(info.getSymbolicName(), list); + } + list.add(info); + } + List subset = new ArrayList(criteria.length); + for (int i = 0; i < criteria.length; i++) { + BundleInfo info = criteria[i]; + List list = (List) bundleMap.get(info.getSymbolicName()); + if (list != null) { + String version = info.getVersion(); + if (version == null) { + // select newest + if (list.size() > 1) { + // sort the list + Collections.sort(list, new Comparator() { + public int compare(Object o1, Object o2) { + return ((BundleInfo) o1).getVersion().compareTo(((BundleInfo) o2).getVersion()); + } + }); + } + // select the last one + subset.add(list.get(list.size() - 1)); + } else { + Iterator iterator = list.iterator(); + boolean found = false; + while (iterator.hasNext() && !found) { + BundleInfo bundle = (BundleInfo) iterator.next(); + if (bundle.getVersion().equals(version)) { + subset.add(bundle); + found = true; + } + } + if (!found) { + // TODO: report not found? exception? + } + } + } else { + // TODO: report not found? exception? + } + } + return (BundleInfo[]) subset.toArray(new BundleInfo[subset.size()]); + } + + /** + * Returns a string that identifies the type of bundle container. This type is persisted to xml + * so that the correct bundle container is created when deserializing the xml. This type is also + * used to alter how the containers are presented to the user in the UI. + * + * @return string identifier for the type of bundle container. + */ + public abstract String getType(); + + /** + * Returns a path in the local file system to the root of the bundle container. + *

+ * TODO: Ideally we won't need this method. Currently the PDE target platform preferences are + * based on a home location and additional locations, so we need the information. + *

+ * @param resolve whether to resolve variables in the path + * @return home location + * @exception CoreException if unable to resolve the location + */ + public abstract String getLocation(boolean resolve) throws CoreException; + + /** + * Returns whether restrictions are equivalent. Subclasses should override for other data. + * + * @param container bundle container + * @return whether content is equivalent + */ + public boolean isContentEqual(AbstractBundleContainer container) { + if (fRestrictions == null) { + return container.fRestrictions == null; + } + if (container.fRestrictions == null) { + return false; + } + if (fRestrictions.length == container.fRestrictions.length) { + for (int i = 0; i < fRestrictions.length; i++) { + if (!fRestrictions[i].equals(container.fRestrictions[i])) { + return false; + } + } + return true; + } + return false; + } + +} Index: src/org/eclipse/pde/internal/core/target/impl/TargetPlatformService.java =================================================================== RCS file: /cvsroot/eclipse/pde/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/impl/TargetPlatformService.java,v retrieving revision 1.5 diff -u -r1.5 TargetPlatformService.java --- src/org/eclipse/pde/internal/core/target/impl/TargetPlatformService.java 19 Jan 2009 17:54:59 -0000 1.5 +++ src/org/eclipse/pde/internal/core/target/impl/TargetPlatformService.java 23 Jan 2009 21:40:56 -0000 @@ -1,219 +1,440 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 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 org.eclipse.pde.internal.core.target.impl; - -import java.io.*; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.*; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; -import org.eclipse.pde.internal.core.ICoreConstants; -import org.eclipse.pde.internal.core.PDECore; -import org.eclipse.pde.internal.core.target.provisional.*; - -/** - * Target platform service implementation. - * - * @since 3.5 - */ -public class TargetPlatformService implements ITargetPlatformService { - - /** - * Service instance - */ - private static ITargetPlatformService fgDefault; - - /** - * Collects target files in the workspace - */ - class ResourceProxyVisitor implements IResourceProxyVisitor { - - private List fList; - - protected ResourceProxyVisitor(List list) { - fList = list; - } - - /** - * @see org.eclipse.core.resources.IResourceProxyVisitor#visit(org.eclipse.core.resources.IResourceProxy) - */ - public boolean visit(IResourceProxy proxy) { - if (proxy.getType() == IResource.FILE) { - if (ICoreConstants.TARGET_FILE_EXTENSION.equalsIgnoreCase(new Path(proxy.getName()).getFileExtension())) { - fList.add(proxy.requestResource()); - } - return false; - } - return true; - } - } - - private TargetPlatformService() { - } - - public synchronized static ITargetPlatformService getDefault() { - if (fgDefault == null) { - fgDefault = new TargetPlatformService(); - } - return fgDefault; - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#deleteTarget(org.eclipse.pde.internal.core.target.provisional.ITargetHandle) - */ - public void deleteTarget(ITargetHandle handle) throws CoreException { - ((AbstractTargetHandle) handle).delete(); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getTarget(org.eclipse.core.resources.IFile) - */ - public ITargetHandle getTarget(IFile file) { - return new WorkspaceFileTargetHandle(file); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getTarget(java.lang.String) - */ - public ITargetHandle getTarget(String memento) throws CoreException { - try { - URI uri = new URI(memento); - String scheme = uri.getScheme(); - if (WorkspaceFileTargetHandle.SCHEME.equals(scheme)) { - return WorkspaceFileTargetHandle.restoreHandle(uri); - } else if (LocalTargetHandle.SCHEME.equals(scheme)) { - return LocalTargetHandle.restoreHandle(uri); - } - } catch (URISyntaxException e) { - throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, Messages.TargetPlatformService_0, e)); - } - throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, Messages.TargetPlatformService_1, null)); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getTargets(org.eclipse.core.runtime.IProgressMonitor) - */ - public ITargetHandle[] getTargets(IProgressMonitor monitor) { - List local = findLocalTargetDefinitions(); - List ws = findWorkspaceTargetDefinitions(); - local.addAll(ws); - return (ITargetHandle[]) local.toArray(new ITargetHandle[local.size()]); - } - - /** - * Finds and returns all local target definition handles - * - * @return all local target definition handles - */ - private List findLocalTargetDefinitions() { - IPath containerPath = LocalTargetHandle.LOCAL_TARGET_CONTAINER_PATH; - List handles = new ArrayList(10); - final File directory = containerPath.toFile(); - if (directory.isDirectory()) { - FilenameFilter filter = new FilenameFilter() { - public boolean accept(File dir, String name) { - return dir.equals(directory) && name.endsWith(ICoreConstants.TARGET_FILE_EXTENSION); - } - }; - File[] files = directory.listFiles(filter); - for (int i = 0; i < files.length; i++) { - try { - handles.add(LocalTargetHandle.restoreHandle(files[i].toURI())); - } catch (CoreException e) { - PDECore.log(e); - } - } - } - return handles; - } - - /** - * Finds and returns all target definition handles defined by workspace files - * - * @return all target definition handles in the workspace - */ - private List findWorkspaceTargetDefinitions() { - List files = new ArrayList(10); - ResourceProxyVisitor visitor = new ResourceProxyVisitor(files); - try { - ResourcesPlugin.getWorkspace().getRoot().accept(visitor, IResource.NONE); - } catch (CoreException e) { - PDECore.log(e); - return new ArrayList(0); - } - Iterator iter = files.iterator(); - List handles = new ArrayList(files.size()); - while (iter.hasNext()) { - IFile file = (IFile) iter.next(); - handles.add(new WorkspaceFileTargetHandle(file)); - } - return handles; - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newDirectoryContainer(java.lang.String) - */ - public IBundleContainer newDirectoryContainer(String path) { - return new DirectoryBundleContainer(path); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newProfileContainer(java.lang.String, java.lang.String) - */ - public IBundleContainer newProfileContainer(String home, String configurationLocation) { - return new ProfileBundleContainer(home, configurationLocation); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newTarget() - */ - public ITargetDefinition newTarget() { - return new TargetDefinition(new LocalTargetHandle()); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#saveTargetDefinition(org.eclipse.pde.internal.core.target.provisional.ITargetDefinition) - */ - public void saveTargetDefinition(ITargetDefinition definition) throws CoreException { - ((AbstractTargetHandle) definition.getHandle()).save(definition); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newFeatureContainer(java.lang.String, java.lang.String, java.lang.String) - */ - public IBundleContainer newFeatureContainer(String home, String id, String version) { - return new FeatureBundleContainer(home, id, version); - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getWorkspaceTargetDefinition() - */ - public ITargetHandle getWorkspaceTargetHandle() throws CoreException { - Preferences preferences = PDECore.getDefault().getPluginPreferences(); - String memento = preferences.getString(ICoreConstants.WORKSPACE_TARGET_HANDLE); - if (memento != null && memento.length() != 0) { - return getTarget(memento); - } - return null; - } - - /* (non-Javadoc) - * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#copyTargetDefinition(org.eclipse.pde.internal.core.target.provisional.ITargetDefinition, org.eclipse.pde.internal.core.target.provisional.ITargetDefinition) - */ - public void copyTargetDefinition(ITargetDefinition from, ITargetDefinition to) throws CoreException { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ((TargetDefinition) from).write(outputStream); - ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); - ((TargetDefinition) to).setContents(inputStream); - } - -} +/******************************************************************************* + * Copyright (c) 2008, 2009 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 org.eclipse.pde.internal.core.target.impl; + +import java.io.*; +import java.net.*; +import java.util.*; +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.*; +import org.eclipse.equinox.internal.provisional.frameworkadmin.BundleInfo; +import org.eclipse.osgi.service.datalocation.Location; +import org.eclipse.osgi.util.NLS; +import org.eclipse.pde.core.plugin.IPluginModelBase; +import org.eclipse.pde.core.plugin.PluginRegistry; +import org.eclipse.pde.internal.core.*; +import org.eclipse.pde.internal.core.target.provisional.*; + +/** + * Target platform service implementation. + * + * @since 3.5 + */ +public class TargetPlatformService implements ITargetPlatformService { + + /** + * Service instance + */ + private static ITargetPlatformService fgDefault; + + /** + * Collects target files in the workspace + */ + class ResourceProxyVisitor implements IResourceProxyVisitor { + + private List fList; + + protected ResourceProxyVisitor(List list) { + fList = list; + } + + /** + * @see org.eclipse.core.resources.IResourceProxyVisitor#visit(org.eclipse.core.resources.IResourceProxy) + */ + public boolean visit(IResourceProxy proxy) { + if (proxy.getType() == IResource.FILE) { + if (ICoreConstants.TARGET_FILE_EXTENSION.equalsIgnoreCase(new Path(proxy.getName()).getFileExtension())) { + fList.add(proxy.requestResource()); + } + return false; + } + return true; + } + } + + private TargetPlatformService() { + } + + public synchronized static ITargetPlatformService getDefault() { + if (fgDefault == null) { + fgDefault = new TargetPlatformService(); + } + return fgDefault; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#deleteTarget(org.eclipse.pde.internal.core.target.provisional.ITargetHandle) + */ + public void deleteTarget(ITargetHandle handle) throws CoreException { + ((AbstractTargetHandle) handle).delete(); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getTarget(org.eclipse.core.resources.IFile) + */ + public ITargetHandle getTarget(IFile file) { + return new WorkspaceFileTargetHandle(file); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getTarget(java.lang.String) + */ + public ITargetHandle getTarget(String memento) throws CoreException { + try { + URI uri = new URI(memento); + String scheme = uri.getScheme(); + if (WorkspaceFileTargetHandle.SCHEME.equals(scheme)) { + return WorkspaceFileTargetHandle.restoreHandle(uri); + } else if (LocalTargetHandle.SCHEME.equals(scheme)) { + return LocalTargetHandle.restoreHandle(uri); + } + } catch (URISyntaxException e) { + throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, Messages.TargetPlatformService_0, e)); + } + throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, Messages.TargetPlatformService_1, null)); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getTargets(org.eclipse.core.runtime.IProgressMonitor) + */ + public ITargetHandle[] getTargets(IProgressMonitor monitor) { + List local = findLocalTargetDefinitions(); + List ws = findWorkspaceTargetDefinitions(); + local.addAll(ws); + return (ITargetHandle[]) local.toArray(new ITargetHandle[local.size()]); + } + + /** + * Finds and returns all local target definition handles + * + * @return all local target definition handles + */ + private List findLocalTargetDefinitions() { + IPath containerPath = LocalTargetHandle.LOCAL_TARGET_CONTAINER_PATH; + List handles = new ArrayList(10); + final File directory = containerPath.toFile(); + if (directory.isDirectory()) { + FilenameFilter filter = new FilenameFilter() { + public boolean accept(File dir, String name) { + return dir.equals(directory) && name.endsWith(ICoreConstants.TARGET_FILE_EXTENSION); + } + }; + File[] files = directory.listFiles(filter); + for (int i = 0; i < files.length; i++) { + try { + handles.add(LocalTargetHandle.restoreHandle(files[i].toURI())); + } catch (CoreException e) { + PDECore.log(e); + } + } + } + return handles; + } + + /** + * Finds and returns all target definition handles defined by workspace files + * + * @return all target definition handles in the workspace + */ + private List findWorkspaceTargetDefinitions() { + List files = new ArrayList(10); + ResourceProxyVisitor visitor = new ResourceProxyVisitor(files); + try { + ResourcesPlugin.getWorkspace().getRoot().accept(visitor, IResource.NONE); + } catch (CoreException e) { + PDECore.log(e); + return new ArrayList(0); + } + Iterator iter = files.iterator(); + List handles = new ArrayList(files.size()); + while (iter.hasNext()) { + IFile file = (IFile) iter.next(); + handles.add(new WorkspaceFileTargetHandle(file)); + } + return handles; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newDirectoryContainer(java.lang.String) + */ + public IBundleContainer newDirectoryContainer(String path) { + return new DirectoryBundleContainer(path); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newProfileContainer(java.lang.String, java.lang.String) + */ + public IBundleContainer newProfileContainer(String home, String configurationLocation) { + return new ProfileBundleContainer(home, configurationLocation); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newTarget() + */ + public ITargetDefinition newTarget() { + return new TargetDefinition(new LocalTargetHandle()); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#saveTargetDefinition(org.eclipse.pde.internal.core.target.provisional.ITargetDefinition) + */ + public void saveTargetDefinition(ITargetDefinition definition) throws CoreException { + ((AbstractTargetHandle) definition.getHandle()).save(definition); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#newFeatureContainer(java.lang.String, java.lang.String, java.lang.String) + */ + public IBundleContainer newFeatureContainer(String home, String id, String version) { + return new FeatureBundleContainer(home, id, version); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#getWorkspaceTargetDefinition() + */ + public ITargetHandle getWorkspaceTargetHandle() throws CoreException { + Preferences preferences = PDECore.getDefault().getPluginPreferences(); + String memento = preferences.getString(ICoreConstants.WORKSPACE_TARGET_HANDLE); + if (memento != null && memento.length() != 0) { + return getTarget(memento); + } + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#copyTargetDefinition(org.eclipse.pde.internal.core.target.provisional.ITargetDefinition, org.eclipse.pde.internal.core.target.provisional.ITargetDefinition) + */ + public void copyTargetDefinition(ITargetDefinition from, ITargetDefinition to) throws CoreException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ((TargetDefinition) from).write(outputStream); + ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); + ((TargetDefinition) to).setContents(inputStream); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.target.provisional.ITargetPlatformService#loadTargetDefinition(org.eclipse.pde.internal.core.target.provisional.ITargetDefinition, java.lang.String) + */ + public void loadTargetDefinition(ITargetDefinition definition, String targetExtensionId) throws CoreException { + IConfigurationElement elem = PDECore.getDefault().getTargetProfileManager().getTarget(targetExtensionId); + if (elem == null) { + throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, NLS.bind("Target extension does not exist: {0}", targetExtensionId))); + } + String path = elem.getAttribute("definition"); //$NON-NLS-1$ + String symbolicName = elem.getDeclaringExtension().getNamespaceIdentifier(); + URL url = TargetDefinitionManager.getResourceURL(symbolicName, path); + if (url != null) { + try { + ((TargetDefinition) definition).setContents(new BufferedInputStream(url.openStream())); + } catch (IOException e) { + throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, NLS.bind("Error reading target extension file: {0}", path), e)); + } + } else { + throw new CoreException(new Status(IStatus.ERROR, PDECore.PLUGIN_ID, NLS.bind("Target extension file does not exist: {0}", path))); + } + } + + /** + * This is a utility method to initialize a target definition based on current workspace + * preference settings (target platform settings). It is not part of the service API since + * the preference settings should eventually be removed. + * + * @param definition target definition + * @throws CoreException + */ + public void loadTargetDefinitionFromPreferences(ITargetDefinition target) throws CoreException { + Preferences preferences = PDECore.getDefault().getPluginPreferences(); + initializeArgumentsInfo(preferences, target); + initializeEnvironmentInfo(preferences, target); + initializeImplicitInfo(preferences, target); + initializeLocationInfo(preferences, target); + initializeAdditionalLocsInfo(preferences, target); + initializeJREInfo(target); + initializePluginContent(preferences, target); + } + + /** + * Returns the given string or null if the empty string. + * + * @param value + * @return value or null + */ + private String getValueOrNull(String value) { + if (value == null) { + return null; + } + if (value.length() == 0) { + return null; + } + return value; + } + + private void initializeArgumentsInfo(Preferences preferences, ITargetDefinition target) { + target.setProgramArguments(getValueOrNull(preferences.getString(ICoreConstants.PROGRAM_ARGS))); + target.setVMArguments(getValueOrNull(preferences.getString(ICoreConstants.VM_ARGS))); + } + + private void initializeEnvironmentInfo(Preferences preferences, ITargetDefinition target) { + target.setOS(getValueOrNull(preferences.getString(ICoreConstants.OS))); + target.setWS(getValueOrNull(preferences.getString(ICoreConstants.WS))); + target.setNL(getValueOrNull(preferences.getString(ICoreConstants.NL))); + target.setArch(getValueOrNull(preferences.getString(ICoreConstants.ARCH))); + } + + private void initializeImplicitInfo(Preferences preferences, ITargetDefinition target) { + String value = preferences.getString(ICoreConstants.IMPLICIT_DEPENDENCIES); + if (value.length() > 0) { + StringTokenizer tokenizer = new StringTokenizer(value, ","); //$NON-NLS-1$ + BundleInfo[] plugins = new BundleInfo[tokenizer.countTokens()]; + int i = 0; + while (tokenizer.hasMoreTokens()) { + String id = tokenizer.nextToken(); + plugins[i++] = new BundleInfo(id, null, null, BundleInfo.NO_LEVEL, false); + } + target.setImplicitDependencies(plugins); + } + } + + private void initializeLocationInfo(Preferences preferences, ITargetDefinition target) { + boolean useThis = preferences.getString(ICoreConstants.TARGET_MODE).equals(ICoreConstants.VALUE_USE_THIS); + boolean profile = preferences.getBoolean(ICoreConstants.TARGET_PLATFORM_REALIZATION); + String home = null; + // Target weaving + Location configArea = Platform.getConfigurationLocation(); + String configLocation = null; + if (configArea != null) { + configLocation = configArea.getURL().getFile(); + } + if (configLocation != null) { + Location location = Platform.getInstallLocation(); + if (location != null) { + URL url = location.getURL(); + if (url != null) { + IPath installPath = new Path(url.getFile()); + IPath configPath = new Path(configLocation); + if (installPath.isPrefixOf(configPath)) { + // if it is the default configuration area, do not specify explicitly + configPath = configPath.removeFirstSegments(installPath.segmentCount()); + configPath = configPath.setDevice(null); + if (configPath.segmentCount() == 1 && configPath.lastSegment().equals("configuration")) { //$NON-NLS-1$ + configLocation = null; + } + } + } + } + } + if (useThis) { + home = "${eclipse_home}"; //$NON-NLS-1$ + } else { + home = preferences.getString(ICoreConstants.PLATFORM_PATH); + } + IBundleContainer primary = null; + if (profile) { + primary = newProfileContainer(home, configLocation); + } else { + primary = newDirectoryContainer(home); + } + try { + String location = ((AbstractBundleContainer) primary).getLocation(true); + target.setName(location); + } catch (CoreException e) { + target.setName("Restored Target Platform"); + } + target.setBundleContainers(new IBundleContainer[] {primary}); + } + + private void initializeAdditionalLocsInfo(Preferences preferences, ITargetDefinition target) { + String additional = preferences.getString(ICoreConstants.ADDITIONAL_LOCATIONS); + StringTokenizer tokenizer = new StringTokenizer(additional, ","); //$NON-NLS-1$ + int size = tokenizer.countTokens(); + if (size > 0) { + IBundleContainer[] locations = new IBundleContainer[size + 1]; + locations[0] = target.getBundleContainers()[0]; + int i = 1; + while (tokenizer.hasMoreTokens()) { + locations[i++] = newDirectoryContainer(tokenizer.nextToken().trim()); + } + target.setBundleContainers(locations); + } + } + + private void initializeJREInfo(ITargetDefinition target) { + target.setJREContainer(null); + } + + private void initializePluginContent(Preferences preferences, ITargetDefinition target) { + String value = preferences.getString(ICoreConstants.CHECKED_PLUGINS); + IBundleContainer primary = target.getBundleContainers()[0]; + if (value.length() == 0 || value.equals(ICoreConstants.VALUE_SAVED_NONE)) { + // no bundles + target.setBundleContainers(null); + return; + } + if (!value.equals(ICoreConstants.VALUE_SAVED_ALL)) { + // restrictions on container + IPluginModelBase[] models = PluginRegistry.getExternalModels(); + ArrayList list = new ArrayList(models.length); + for (int i = 0; i < models.length; i++) { + if (models[i].isEnabled()) { + String id = models[i].getPluginBase().getId(); + if (id != null) { + list.add(new BundleInfo(id, null, null, BundleInfo.NO_LEVEL, false)); + } + } + } + if (list.size() > 0) { + primary.setRestrictions((BundleInfo[]) list.toArray(new BundleInfo[list.size()])); + } + } + + } + + /** + * Creates a target definition with default settings - i.e. the running host. + * Uses an explicit configuration area if not equal to the default location. + * + * @return target definition + */ + public ITargetDefinition newDefaultTargetDefinition() { + ITargetDefinition target = newTarget(); + Location configArea = Platform.getConfigurationLocation(); + String configLocation = null; + if (configArea != null) { + configLocation = configArea.getURL().getFile(); + } + if (configLocation != null) { + Location location = Platform.getInstallLocation(); + if (location != null) { + URL url = location.getURL(); + if (url != null) { + IPath installPath = new Path(url.getFile()); + IPath configPath = new Path(configLocation); + if (installPath.isPrefixOf(configPath)) { + // if it is the default configuration area, do not specify explicitly + configPath = configPath.removeFirstSegments(installPath.segmentCount()); + configPath = configPath.setDevice(null); + if (configPath.segmentCount() == 1 && configPath.lastSegment().equals("configuration")) { //$NON-NLS-1$ + configLocation = null; + } + } + } + } + } + IBundleContainer container = newProfileContainer("${eclipse_home}", configLocation); //$NON-NLS-1$ + target.setBundleContainers(new IBundleContainer[] {container}); + try { + String location = ((AbstractBundleContainer) container).getLocation(true); + target.setName(NLS.bind("Running Platform ({0})", location)); + } catch (CoreException e) { + target.setName("Running Platform (Default)"); + } + return target; + } +} #P org.eclipse.pde.ui Index: src/org/eclipse/pde/internal/ui/wizards/target/TargetCreationPage.java =================================================================== RCS file: /cvsroot/eclipse/pde/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/wizards/target/TargetCreationPage.java,v retrieving revision 1.1 diff -u -r1.1 TargetCreationPage.java --- src/org/eclipse/pde/internal/ui/wizards/target/TargetCreationPage.java 23 Jan 2009 20:30:20 -0000 1.1 +++ src/org/eclipse/pde/internal/ui/wizards/target/TargetCreationPage.java 23 Jan 2009 21:40:57 -0000 @@ -1,252 +1,249 @@ -/******************************************************************************* - * Copyright (c) 2005, 2009 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 org.eclipse.pde.internal.ui.wizards.target; - -import org.eclipse.pde.internal.ui.PDEUIMessages; - -import java.io.*; -import java.net.URL; -import javax.xml.parsers.ParserConfigurationException; -import org.eclipse.core.runtime.*; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.wizard.IWizardPage; -import org.eclipse.jface.wizard.WizardSelectionPage; -import org.eclipse.pde.internal.core.PDECore; -import org.eclipse.pde.internal.core.TargetDefinitionManager; -import org.eclipse.pde.internal.core.itarget.ITargetModel; -import org.eclipse.pde.internal.core.target.TargetModel; -import org.eclipse.pde.internal.core.target.impl.TargetDefinitionPersistenceHelper; -import org.eclipse.pde.internal.core.target.provisional.*; -import org.eclipse.pde.internal.ui.*; -import org.eclipse.pde.internal.ui.editor.target.OpenTargetProfileAction; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.*; -import org.xml.sax.SAXException; - -/** - * First wizard page used to create a target definition. Defines the location where - * the definition will be created and how to seed the definition. - */ -public class TargetCreationPage extends WizardSelectionPage { - - protected static final int USE_EMPTY = 0; - protected static final int USE_DEFAULT = 1; - protected static final int USE_CURRENT_TP = 2; - protected static final int USE_EXISTING_TARGET = 3; - - private Button fEmptyButton; - private Button fDefaultButton; - private Button fCurrentTPButton; - private Button fExistingTargetButton; - private Combo fTargets; - private String[] fTargetIds; - private Button fPreviewButton; - - public TargetCreationPage(String pageName) { - super(pageName); - setTitle(PDEUIMessages.TargetProfileWizardPage_title); - setDescription(PDEUIMessages.TargetProfileWizardPage_description); - } - - /** - * Returns the target service or null if none. - * - * @return target service or null - */ - protected ITargetPlatformService getTargetService() { - return (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName()); - } - - /* (non-Javadoc) - * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) - */ - public void createControl(Composite parent) { - Composite comp = SWTFactory.createComposite(parent, 3, 1, GridData.FILL_BOTH); - SWTFactory.createLabel(comp, PDEUIMessages.TargetCreationPage_0, 3); - - fEmptyButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_1, 3); - fDefaultButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_2, 3); - fCurrentTPButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_3, 3); - fExistingTargetButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_4, 1); - fExistingTargetButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - boolean enabled = fExistingTargetButton.getSelection(); - fTargets.setEnabled(enabled); - fPreviewButton.setEnabled(enabled); - } - }); - - fEmptyButton.setSelection(true); - - fTargets = SWTFactory.createCombo(comp, SWT.SINGLE | SWT.READ_ONLY, 1, null); - fTargets.setEnabled(false); - initializeTargetCombo(); - - fPreviewButton = SWTFactory.createPushButton(comp, PDEUIMessages.TargetCreationPage_5, null); - fPreviewButton.setEnabled(false); - fPreviewButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - InputStream stream = null; - try { - URL url = getExternalTargetURL(); - if (url != null) - stream = new BufferedInputStream(url.openStream()); - if (stream != null) { - ITargetModel model = new TargetModel(); - model.load(stream, false); - new OpenTargetProfileAction(getShell(), model, fTargets.getText()).run(); - } - } catch (IOException e1) { - } catch (CoreException e2) { - } finally { - try { - if (stream != null) - stream.close(); - } catch (IOException e3) { - } - } - } - }); - - Dialog.applyDialogFont(comp); - setSelectedNode(new EditTargetNode()); - setControl(comp); - setPageComplete(true); - } - - private URL getExternalTargetURL() { - TargetDefinitionManager manager = PDECore.getDefault().getTargetProfileManager(); - IConfigurationElement elem = manager.getTarget(fTargetIds[fTargets.getSelectionIndex()]); - if (elem != null) { - String path = elem.getAttribute("definition"); //$NON-NLS-1$ - String symbolicName = elem.getDeclaringExtension().getNamespaceIdentifier(); - return TargetDefinitionManager.getResourceURL(symbolicName, path); - } - return null; - } - - protected void initializeTargetCombo() { - IConfigurationElement[] elements = PDECore.getDefault().getTargetProfileManager().getSortedTargets(); - fTargetIds = new String[elements.length]; - for (int i = 0; i < elements.length; i++) { - String name = elements[i].getAttribute("name"); //$NON-NLS-1$ - if (fTargets.indexOf(name) == -1) - fTargets.add(name); - fTargetIds[i] = elements[i].getAttribute("id"); //$NON-NLS-1$ - } - if (elements.length > 0) - fTargets.select(0); - } - - protected int getInitializationOption() { - if (fEmptyButton.getSelection()) - return USE_EMPTY; - if (fDefaultButton.getSelection()) - return USE_DEFAULT; - else if (fCurrentTPButton.getSelection()) - return USE_CURRENT_TP; - return USE_EXISTING_TARGET; - } - - protected String getTargetId() { - return fTargetIds[fTargets.getSelectionIndex()]; - } - - private ITargetDefinition createTarget() { - ITargetPlatformService service = getTargetService(); - if (service != null) { - ITargetDefinition definition = service.newTarget(); - switch (getInitializationOption()) { - case USE_EMPTY : - definition.setName(PDEUIMessages.TargetCreationPage_6); - break; - case USE_DEFAULT : - populateBasicTarget(definition); - break; - case USE_CURRENT_TP : - populateFromCurrentTargetPlatform(definition); - break; - case USE_EXISTING_TARGET : - try { - populateFromTemplate(definition, getTargetId()); - } catch (CoreException e) { - setErrorMessage(e.getMessage()); - return null; - } - break; - } - return definition; - } - return null; - } - - /** - * Applies basic target settings to the given target definition. - * - * @param definition - */ - private void populateBasicTarget(ITargetDefinition definition) { - ITargetPlatformService service = getTargetService(); - if (service != null) { - definition.setName(PDEUIMessages.TargetCreationPage_7); - definition.setBundleContainers(new IBundleContainer[] {service.newProfileContainer("${eclipse_home}", null)}); //$NON-NLS-1$ - } - } - - /** - * Populates the given definition from current target platform settings. - * - * @param definition - */ - private void populateFromCurrentTargetPlatform(ITargetDefinition definition) { - // TODO: - } - - /** - * Populates the given definition from the specified target template. - * - * @param definition - * @param id target extension identifier - * @exception CoreException if unable to complete - */ - private void populateFromTemplate(ITargetDefinition definition, String id) throws CoreException { - IConfigurationElement elem = PDECore.getDefault().getTargetProfileManager().getTarget(id); - String path = elem.getAttribute("definition"); //$NON-NLS-1$ - String symbolicName = elem.getDeclaringExtension().getNamespaceIdentifier(); - URL url = TargetDefinitionManager.getResourceURL(symbolicName, path); - if (url != null) { - try { - TargetDefinitionPersistenceHelper.initFromXML(definition, new BufferedInputStream(url.openStream())); - } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, PDEPlugin.getPluginId(), PDEUIMessages.TargetCreationPage_8, e)); - } catch (ParserConfigurationException e) { - throw new CoreException(new Status(IStatus.ERROR, PDEPlugin.getPluginId(), PDEUIMessages.TargetCreationPage_8, e)); - } catch (SAXException e) { - throw new CoreException(new Status(IStatus.ERROR, PDEPlugin.getPluginId(), PDEUIMessages.TargetCreationPage_8, e)); - } - } - } - - /* (non-Javadoc) - * @see org.eclipse.jface.wizard.WizardSelectionPage#getNextPage() - */ - public IWizardPage getNextPage() { - ITargetDefinition target = createTarget(); - if (target != null) { - ((EditTargetNode) getSelectedNode()).setTargetDefinition(target); - return super.getNextPage(); - } - return null; - } -} +/******************************************************************************* + * Copyright (c) 2005, 2009 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 org.eclipse.pde.internal.ui.wizards.target; + +import java.io.*; +import java.net.URL; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.wizard.IWizardPage; +import org.eclipse.jface.wizard.WizardSelectionPage; +import org.eclipse.pde.internal.core.PDECore; +import org.eclipse.pde.internal.core.TargetDefinitionManager; +import org.eclipse.pde.internal.core.itarget.ITargetModel; +import org.eclipse.pde.internal.core.target.TargetModel; +import org.eclipse.pde.internal.core.target.impl.TargetPlatformService; +import org.eclipse.pde.internal.core.target.provisional.*; +import org.eclipse.pde.internal.ui.PDEUIMessages; +import org.eclipse.pde.internal.ui.SWTFactory; +import org.eclipse.pde.internal.ui.editor.target.OpenTargetProfileAction; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.*; + +/** + * First wizard page used to create a target definition. Defines the location where + * the definition will be created and how to seed the definition. + */ +public class TargetCreationPage extends WizardSelectionPage { + + protected static final int USE_EMPTY = 0; + protected static final int USE_DEFAULT = 1; + protected static final int USE_CURRENT_TP = 2; + protected static final int USE_EXISTING_TARGET = 3; + + private Button fEmptyButton; + private Button fDefaultButton; + private Button fCurrentTPButton; + private Button fExistingTargetButton; + private Combo fTargets; + private String[] fTargetIds; + private Button fPreviewButton; + + public TargetCreationPage(String pageName) { + super(pageName); + setTitle(PDEUIMessages.TargetProfileWizardPage_title); + setDescription(PDEUIMessages.TargetProfileWizardPage_description); + } + + /** + * Returns the target service or null if none. + * + * @return target service or null + */ + protected ITargetPlatformService getTargetService() { + return (ITargetPlatformService) PDECore.getDefault().acquireService(ITargetPlatformService.class.getName()); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) + */ + public void createControl(Composite parent) { + Composite comp = SWTFactory.createComposite(parent, 3, 1, GridData.FILL_BOTH); + SWTFactory.createLabel(comp, PDEUIMessages.TargetCreationPage_0, 3); + + fEmptyButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_1, 3); + fDefaultButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_2, 3); + fCurrentTPButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_3, 3); + fExistingTargetButton = SWTFactory.createRadioButton(comp, PDEUIMessages.TargetCreationPage_4, 1); + fExistingTargetButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + boolean enabled = fExistingTargetButton.getSelection(); + fTargets.setEnabled(enabled); + fPreviewButton.setEnabled(enabled); + } + }); + + fEmptyButton.setSelection(true); + + fTargets = SWTFactory.createCombo(comp, SWT.SINGLE | SWT.READ_ONLY, 1, null); + fTargets.setEnabled(false); + initializeTargetCombo(); + + fPreviewButton = SWTFactory.createPushButton(comp, PDEUIMessages.TargetCreationPage_5, null); + fPreviewButton.setEnabled(false); + fPreviewButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + InputStream stream = null; + try { + URL url = getExternalTargetURL(); + if (url != null) + stream = new BufferedInputStream(url.openStream()); + if (stream != null) { + ITargetModel model = new TargetModel(); + model.load(stream, false); + new OpenTargetProfileAction(getShell(), model, fTargets.getText()).run(); + } + } catch (IOException e1) { + } catch (CoreException e2) { + } finally { + try { + if (stream != null) + stream.close(); + } catch (IOException e3) { + } + } + } + }); + + Dialog.applyDialogFont(comp); + setSelectedNode(new EditTargetNode()); + setControl(comp); + setPageComplete(true); + } + + private URL getExternalTargetURL() { + TargetDefinitionManager manager = PDECore.getDefault().getTargetProfileManager(); + IConfigurationElement elem = manager.getTarget(fTargetIds[fTargets.getSelectionIndex()]); + if (elem != null) { + String path = elem.getAttribute("definition"); //$NON-NLS-1$ + String symbolicName = elem.getDeclaringExtension().getNamespaceIdentifier(); + return TargetDefinitionManager.getResourceURL(symbolicName, path); + } + return null; + } + + protected void initializeTargetCombo() { + IConfigurationElement[] elements = PDECore.getDefault().getTargetProfileManager().getSortedTargets(); + fTargetIds = new String[elements.length]; + for (int i = 0; i < elements.length; i++) { + String name = elements[i].getAttribute("name"); //$NON-NLS-1$ + if (fTargets.indexOf(name) == -1) + fTargets.add(name); + fTargetIds[i] = elements[i].getAttribute("id"); //$NON-NLS-1$ + } + if (elements.length > 0) + fTargets.select(0); + } + + protected int getInitializationOption() { + if (fEmptyButton.getSelection()) + return USE_EMPTY; + if (fDefaultButton.getSelection()) + return USE_DEFAULT; + else if (fCurrentTPButton.getSelection()) + return USE_CURRENT_TP; + return USE_EXISTING_TARGET; + } + + protected String getTargetId() { + return fTargetIds[fTargets.getSelectionIndex()]; + } + + private ITargetDefinition createTarget() { + ITargetPlatformService service = getTargetService(); + if (service != null) { + ITargetDefinition definition = service.newTarget(); + switch (getInitializationOption()) { + case USE_EMPTY : + definition.setName(PDEUIMessages.TargetCreationPage_6); + break; + case USE_DEFAULT : + populateBasicTarget(definition); + break; + case USE_CURRENT_TP : + try { + populateFromCurrentTargetPlatform(definition); + } catch (CoreException e) { + setErrorMessage(e.getMessage()); + return null; + } + break; + case USE_EXISTING_TARGET : + try { + populateFromTemplate(definition, getTargetId()); + } catch (CoreException e) { + setErrorMessage(e.getMessage()); + return null; + } + break; + } + return definition; + } + return null; + } + + /** + * Applies basic target settings to the given target definition. + * + * @param definition + */ + private void populateBasicTarget(ITargetDefinition definition) { + ITargetPlatformService service = getTargetService(); + if (service != null) { + definition.setName(PDEUIMessages.TargetCreationPage_7); + definition.setBundleContainers(new IBundleContainer[] {service.newProfileContainer("${eclipse_home}", null)}); //$NON-NLS-1$ + } + } + + /** + * Populates the given definition from current target platform settings. + * + * @param definition + * @throws CoreException + */ + private void populateFromCurrentTargetPlatform(ITargetDefinition definition) throws CoreException { + ITargetPlatformService service = getTargetService(); + if (service instanceof TargetPlatformService) { + TargetPlatformService ts = (TargetPlatformService) service; + ts.loadTargetDefinitionFromPreferences(definition); + } + } + + /** + * Populates the given definition from the specified target template. + * + * @param definition + * @param id target extension identifier + * @exception CoreException if unable to complete + */ + private void populateFromTemplate(ITargetDefinition definition, String id) throws CoreException { + ITargetPlatformService service = getTargetService(); + if (service != null) { + service.loadTargetDefinition(definition, id); + } + } + + /* (non-Javadoc) + * @see org.eclipse.jface.wizard.WizardSelectionPage#getNextPage() + */ + public IWizardPage getNextPage() { + ITargetDefinition target = createTarget(); + if (target != null) { + ((EditTargetNode) getSelectedNode()).setTargetDefinition(target); + return super.getNextPage(); + } + return null; + } +} Index: src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java =================================================================== RCS file: /cvsroot/eclipse/pde/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java,v retrieving revision 1.86 diff -u -r1.86 TargetPlatformPreferencePage.java --- src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java 22 May 2008 19:18:04 -0000 1.86 +++ src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java 23 Jan 2009 21:40:57 -0000 @@ -565,6 +565,8 @@ fArgumentsTab.performOk(); fImplicitDependenciesTab.performOk(); saveTarget(); + // the old page has been use - wipe out current target setting for new pref page + fPreferences.setValue(ICoreConstants.WORKSPACE_TARGET_HANDLE, ""); //$NON-NLS-1$ return super.performOk(); }