diff options
author | James Blackburn | 2010-03-10 13:09:35 +0000 |
---|---|---|
committer | James Blackburn | 2010-03-10 13:09:35 +0000 |
commit | 31f47aedf18a850c605a40e7a6e4357f768408a3 (patch) | |
tree | a44fa757586e29c5fe9109fab228ad830292aab2 /build/org.eclipse.cdt.managedbuilder.core | |
parent | e65973c9cc0786f4ebdcf3c019a3910bf470471a (diff) | |
download | org.eclipse.cdt-31f47aedf18a850c605a40e7a6e4357f768408a3.tar.gz org.eclipse.cdt-31f47aedf18a850c605a40e7a6e4357f768408a3.tar.xz org.eclipse.cdt-31f47aedf18a850c605a40e7a6e4357f768408a3.zip |
Bug 305146 Thread-safety of ManagedBuildManager BuildInfo.
- setLoadedBuildInfo on proj desc load & apply
- volatile ManagedBuildInfo fields which might be accessed in an unsafe way
- HeadlessBuilder gets configuration names from core model so it's not caught in these races.
- JavaDoc + Generics + warnings
Diffstat (limited to 'build/org.eclipse.cdt.managedbuilder.core')
6 files changed, 150 insertions, 126 deletions
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java index bdf3e325f30..afab4d79aae 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IManagedBuildInfo.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.managedbuilder.core; import java.util.List; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; import org.eclipse.cdt.managedbuilder.makegen.IManagedDependencyGeneratorType; import org.eclipse.core.runtime.IPath; @@ -45,7 +46,9 @@ public interface IManagedBuildInfo { * Add a new target to the build information for the receiver * * @param target + * @deprecated */ + @Deprecated public void addTarget(ITarget target); /** @@ -54,7 +57,9 @@ public interface IManagedBuildInfo { * * @param srcExt * @return + * @deprecated */ + @Deprecated public boolean buildsFileType(String srcExt); /** @@ -123,13 +128,14 @@ public interface IManagedBuildInfo { /** * Returns the name of the artifact to build for the receiver. * - * @return + * @return Name of the build artifact */ public String getBuildArtifactName(); /** * Answers a <code>String</code> containing the make command invocation * for the default configuration. + * @return build command */ public String getBuildCommand(); @@ -172,7 +178,7 @@ public interface IManagedBuildInfo { * Answers the name of the default configuration, for example <code>Debug</code> * or <code>Release</code>. * - * @return + * @return String name of default configuration */ public String getConfigurationName(); @@ -180,14 +186,14 @@ public interface IManagedBuildInfo { * Answers a <code>String</code> array containing the names of all the configurations * defined for the project. * - * @return + * @return String[] of configuration names */ public String[] getConfigurationNames(); /** * Get the default configuration associated with the receiver * - * @return + * @return IConfiguration default */ public IConfiguration getDefaultConfiguration(); @@ -288,7 +294,7 @@ public interface IManagedBuildInfo { * Answers the extension that will be built by the current configuration * for the extension passed in the argument or <code>null</code>. * - * @param resourceName + * @param resourceExtension * @return */ public String getOutputExtension(String resourceExtension); @@ -309,7 +315,7 @@ public interface IManagedBuildInfo { * artifact. For example, a library foo, should have the prefix 'lib' and * the extension '.a', so the final goal would be 'libfoo.a' * - * @param extension + * @param outputExtension * @return the prefix or an empty string */ public String getOutputPrefix(String outputExtension); @@ -326,15 +332,18 @@ public interface IManagedBuildInfo { * Get the target specified in the argument. * * @param id - * @return + * @return ITarget + * @deprecated */ + @Deprecated public ITarget getTarget(String id); /** * Get all of the targets associated with the receiver. - * - * @return + * @return List<ITarget> + * @deprecated */ + @Deprecated public List<ITarget> getTargets(); /** @@ -450,9 +459,8 @@ public interface IManagedBuildInfo { public void setDefaultConfiguration(IConfiguration configuration); /** - * - * @param configuration - * @return + * @param configName + * @return boolean indicating if setDefaultConfiguration was successful */ public boolean setDefaultConfiguration(String configName); @@ -490,7 +498,7 @@ public interface IManagedBuildInfo { * only be done if a project resource or setting has been modified in a * way that would invalidate the previous build. * - * @param <code>true</code> will force a rebuild the next time the project builds + * @param rebuild <code>true</code> will force a rebuild the next time the project builds */ public void setRebuildState(boolean rebuild); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java index 8911bd9b112..931d1bb22b8 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java @@ -29,6 +29,7 @@ public class HeadlessBuildMessages extends NLS { public static String HeadlessBuilder_no_arguments; public static String HeadlessBuilder_NoConfigMatched; public static String HeadlessBuilder_NoProjectMatched; + public static String HeadlessBuilder_Not_CDT_Proj; public static String HeadlessBuilder_project; public static String HeadlessBuilder_Quote; public static String HeadlessBuilder_RegExSyntaxError; diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java index 707297c093e..4c23178d202 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java @@ -24,9 +24,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.resources.ACBuilder; +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.managedbuilder.core.IConfiguration; -import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; @@ -56,6 +58,7 @@ import org.eclipse.equinox.app.IApplicationContext; * IApplication ID: org.eclipse.cdt.managedbuilder.core.headlessbuild * Provides: * - Import projects : -import {[uri:/]/path/to/project} + * - Import all projects in the tree : -importAll {[uri:/]/path/to/projectTreeURI} * - Build projects / the workspace : -build {project_name_reg_ex/config_name_reg_ex | all} * - Clean build projects / the workspace : -cleanBuild {project_name_reg_ex/config_name_reg_ex | all} * @@ -96,7 +99,7 @@ public class HeadlessBuilder implements IApplication { /* * Find all project build configurations that match the regular expression ("project/config") */ - private Map<IProject, HashSet<IConfiguration>> matchConfigurations(String regularExpression, IProject[] projectList, Map<IProject, HashSet<IConfiguration>> cfgMap) { + private Map<IProject, Set<ICConfigurationDescription>> matchConfigurations(String regularExpression, IProject[] projectList, Map<IProject, Set<ICConfigurationDescription>> cfgMap) { try { int separatorIndex = regularExpression.indexOf('/'); @@ -123,21 +126,22 @@ public class HeadlessBuilder implements IApplication { if(projectMatcher.matches()) { projectMatched = true; // Find the configurations that match the regular expression - IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); - if (info == null) + ICProjectDescription desc = CoreModel.getDefault().getProjectDescription(project, false); + if (desc == null) { + System.err.println(HeadlessBuildMessages.HeadlessBuilder_project + project.getName() + HeadlessBuildMessages.HeadlessBuilder_Not_CDT_Proj); continue; - IConfiguration[] cfgs = info.getManagedProject().getConfigurations(); + } + ICConfigurationDescription[] cfgs = desc.getConfigurations(); - for(IConfiguration cfg : cfgs) { + for(ICConfigurationDescription cfg : cfgs) { Matcher cfgMatcher = configPattern.matcher(cfg.getName()); if(cfgMatcher.matches()) { configMatched = true; // Build this configuration for this project - HashSet<IConfiguration> set = cfgMap.get(project); - if(set == null){ - set = new HashSet<IConfiguration>(); - } + Set<ICConfigurationDescription> set = cfgMap.get(project); + if(set == null) + set = new HashSet<ICConfigurationDescription>(); set.add(cfg); cfgMap.put(project, set); } @@ -158,12 +162,16 @@ public class HeadlessBuilder implements IApplication { /* * Build the given configurations using the specified build type (FULL, CLEAN, INCREMENTAL) */ - private void buildConfigurations(Map<IProject, HashSet<IConfiguration>> projConfigs, final IProgressMonitor monitor, final int buildType) throws CoreException { - for (Map.Entry<IProject, HashSet<IConfiguration>> entry : projConfigs.entrySet()) { + private void buildConfigurations(Map<IProject, Set<ICConfigurationDescription>> projConfigs, final IProgressMonitor monitor, final int buildType) throws CoreException { + for (Map.Entry<IProject, Set<ICConfigurationDescription>> entry : projConfigs.entrySet()) { final IProject proj = entry.getKey(); - HashSet<IConfiguration> cfgs = entry.getValue(); + Set<ICConfigurationDescription> cfgDescs = entry.getValue(); - final Map<String, String> map = BuilderFactory.createBuildArgs(cfgs.toArray(new IConfiguration[cfgs.size()])); + IConfiguration[] configs = new IConfiguration[cfgDescs.size()]; + int i = 0; + for (ICConfigurationDescription cfgDesc : cfgDescs) + configs[i++] = ManagedBuildManager.getConfigurationForDescription(cfgDesc); + final Map<String, String> map = BuilderFactory.createBuildArgs(configs); IWorkspaceRunnable op = new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { @@ -319,7 +327,7 @@ public class HeadlessBuilder implements IApplication { IProject[] allProjects = root.getProjects(); // Map from Project -> Configurations to build. We also Build all projects which are clean'd - Map<IProject, HashSet<IConfiguration>> configsToBuild = new HashMap<IProject, HashSet<IConfiguration>>(); + Map<IProject, Set<ICConfigurationDescription>> configsToBuild = new HashMap<IProject, Set<ICConfigurationDescription>>(); /* * Perform the Clean / Build diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java index 022a0368adb..9de3f1c3334 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 IBM Software Corporation and others. + * Copyright (c) 2002, 2010 IBM Software 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 @@ -64,8 +64,8 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; /** - * - * @since 1.2 + * Concrete IManagedBuildInfo storing runtime ManagedProject metadata with utility settings for accessing + * some attributes in the default configuration */ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { // The path container used for all managed projects @@ -74,24 +74,23 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { //private static final QualifiedName defaultTargetProperty = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), DEFAULT_TARGET); public static final String MAJOR_SEPERATOR = ";"; //$NON-NLS-1$ public static final String MINOR_SEPERATOR = "::"; //$NON-NLS-1$ - private static final String EMPTY_STRING = new String(); - - private IManagedProject managedProject; - private ICProject cProject; -// private IConfiguration defaultConfig; -// private String defaultConfigId; - private boolean isDirty; - private boolean isValid = false; - private IResource owner; - private boolean rebuildNeeded; - private String version; - private IConfiguration selectedConfig; - - private List targetList; - private Map targetMap; + + private volatile IManagedProject managedProject; + private volatile ICProject cProject; + private volatile boolean isDirty; + private volatile boolean isValid = false; + private volatile IResource owner; + private volatile boolean rebuildNeeded; + private volatile String version; + private volatile IConfiguration selectedConfig; + + @Deprecated + private List<ITarget> targetList; + @Deprecated + private Map<String, ITarget> targetMap; - private boolean isReadOnly = false; - private boolean bIsContainerInited = false; + private volatile boolean isReadOnly = false; + private volatile boolean bIsContainerInited = false; /** @@ -106,16 +105,6 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { // Does not need a save but should be rebuilt isDirty = false; rebuildNeeded = true; - - // Get the default configs -// IProject project = owner.getProject(); -// defaultConfigId = null; -// try { -// defaultConfigId = project.getPersistentProperty(defaultConfigProperty); -// } catch (CoreException e) { -// // Hitting this error just means the default config is not set -// return; -// } } /** @@ -124,6 +113,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * * @param owner * @param element + * @param loadConfigs * @param managedBuildRevision */ public ManagedBuildInfo(IResource owner, ICStorageElement element, boolean loadConfigs, String managedBuildRevision) { @@ -219,14 +209,14 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getConfigurationNames() */ public String[] getConfigurationNames() { - ArrayList configNames = new ArrayList(); + ArrayList<String> configNames = new ArrayList<String>(); IConfiguration[] configs = managedProject.getConfigurations(); for (int i = 0; i < configs.length; i++) { IConfiguration configuration = configs[i]; configNames.add(configuration.getName()); } configNames.trimToSize(); - return (String[])configNames.toArray(new String[configNames.size()]); + return configNames.toArray(new String[configNames.size()]); } public ICProject getCProject() { @@ -288,9 +278,9 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IScannerInfo#getDefinedSymbols() */ - public Map getDefinedSymbols() { + public Map<String, String> getDefinedSymbols() { // Return the defined symbols for the default configuration - HashMap symbols = getMacroPathEntries(); + HashMap<String, String> symbols = getMacroPathEntries(); return symbols; } @@ -382,9 +372,9 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { return null; } - private ArrayList getIncludePathEntries() { + private ArrayList<String> getIncludePathEntries() { // Extract the resolved paths from the project (if any) - ArrayList paths = new ArrayList(); + ArrayList<String> paths = new ArrayList<String>(); if (cProject != null) { try { IPathEntry[] entries = cProject.getResolvedPathEntries(); @@ -412,8 +402,8 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { */ public String[] getIncludePaths() { // Return the include paths for the default configuration - ArrayList paths = getIncludePathEntries(); - return (String[])paths.toArray(new String[paths.size()]); + ArrayList<String> paths = getIncludePathEntries(); + return paths.toArray(new String[paths.size()]); } /* (non-Javadoc) @@ -423,8 +413,8 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { return getDefaultConfiguration().getLibs(extension); } - private HashMap getMacroPathEntries() { - HashMap macros = new HashMap(); + private HashMap<String, String> getMacroPathEntries() { + HashMap<String, String> macros = new HashMap<String, String>(); if (cProject != null) { try { IPathEntry[] entries = cProject.getResolvedPathEntries(); @@ -558,7 +548,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { } /** - * @return + * @return IResource owner */ public IResource getOwner() { return owner; @@ -736,7 +726,9 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * * @param doc * @param element + * @deprecated */ + @Deprecated public void serializeLegacy(Document doc, Element element) { // Write out the managed build project @@ -746,7 +738,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { ((ManagedProject)managedProject).serialize(XmlStorageUtil.createCStorageTree(projElement), true); } else{ - Iterator iter = getTargets().listIterator(); + Iterator<ITarget> iter = getTargets().listIterator(); while (iter.hasNext()) { // Get the target Target targ = (Target)iter.next(); @@ -836,11 +828,11 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { */ public void setDirty(boolean isDirty) { // Reset the dirty status here - this.isDirty = isDirty; // and in the managed project if (managedProject != null) { managedProject.setDirty(isDirty); } + this.isDirty = isDirty; } /* (non-Javadoc) @@ -864,41 +856,38 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @see org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo#setRebuildState(boolean) */ public void setRebuildState(boolean rebuild) { - // Reset the status here - rebuildNeeded = rebuild; // TODO: Is the appropriate? Should the rebuild state be stored in the project file? // and in the managed project if (getDefaultConfiguration() != null) { getDefaultConfiguration().setRebuildState(rebuild); } + // Reset the status here + rebuildNeeded = rebuild; } /** * @param version */ public void setVersion(String version) { - if (version != null && !version.equals(this.version)) { + updateRevision(version); + if (version != null && !version.equals(this.version)) this.version = version; //setDirty(true); - It is primarily up to the ManagedProject to maintain the dirty state - } - updateRevision(version); } /** - * @param boolean + * @param bInited */ public void setContainerInited(boolean bInited) { bIsContainerInited = bInited; } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ + + @Override public String toString() { // Just print out the name of the project return "Managed build information for " + owner.getName(); //$NON-NLS-1$ } - + /** * Sets the owner of the receiver to be the <code>IResource</code> specified * in the argument. @@ -909,20 +898,21 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { // Check to see if the owner is the same as the argument if (resource != null) { if (!owner.equals(resource)) { - owner = resource; - // Do the same for the managed project + // Update owner on the managed project if(managedProject != null) managedProject.updateOwner(resource); // And finally update the cModelElement - cProject = CoreModel.getDefault().create(owner.getProject()); + cProject = CoreModel.getDefault().create(resource.getProject()); // Save everything setDirty(true); setRebuildState(true); + // Finally update this managedbuild info's owner + owner = resource; } } } - + /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getSelectedConfiguration() */ @@ -945,6 +935,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#addTarget(org.eclipse.cdt.core.build.managed.ITarget) */ + @Deprecated public void addTarget(ITarget target) { getTargetMap().put(target.getId(), target); getTargets().add(target); @@ -954,6 +945,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo#removeTarget(java.lang.String) */ + @Deprecated public void removeTarget(String id) { getTargets().remove(getTarget(id)); getTargetMap().remove(id); @@ -961,11 +953,9 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getTarget(org.eclipse.cdt.core.build.managed.IConfiguration) - */ + @Deprecated public ITarget getTarget(String id) { - return (ITarget) getTargetMap().get(id); + return getTargetMap().get(id); } /* (non-Javadoc) @@ -973,19 +963,22 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * * @return Returns the map of IDs to ITargets. */ - private Map getTargetMap() { + @Deprecated + private Map<String, ITarget> getTargetMap() { if (targetMap == null) { - targetMap = new HashMap(); + targetMap = new HashMap<String, ITarget>(); } return targetMap; } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#getTargets(org.eclipse.cdt.core.build.managed.IConfiguration) + * @deprecated */ - public List getTargets() { + @Deprecated + public List<ITarget> getTargets() { if (targetList == null) { - targetList = new ArrayList(); + targetList = new ArrayList<ITarget>(); } return targetList; } @@ -997,13 +990,13 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { private String getCWD() { String cwd = ""; //$NON-NLS-1$ IBuildEnvironmentVariable cwdvar = ManagedBuildManager.getEnvironmentVariableProvider().getVariable("CWD", getDefaultConfiguration(), false, true); //$NON-NLS-1$ - if (cwdvar != null) { cwd = cwdvar.getValue().replace('\\','/'); } //$NON-NLS-1$ //$NON-NLS-2$ + if (cwdvar != null) { cwd = cwdvar.getValue().replace('\\','/'); } return cwd; } /** */ - private List processPath(List list, String path, int context, Object obj) { + private List<String> processPath(List<String> list, String path, int context, Object obj) { final String EMPTY = ""; //$NON-NLS-1$ if (path != null) { if (context != 0) { @@ -1067,10 +1060,10 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { /** * Obtain all possible Managed build values - * @return + * @return IPathEntry[] */ public IPathEntry[] getManagedBuildValues() { - List entries = new ArrayList(); + List<IPathEntry> entries = new ArrayList<IPathEntry>(); int i=0; IPathEntry[] a = getManagedBuildValues(IPathEntry.CDT_INCLUDE); if (a != null) { for (i=0; i<a.length; i++) entries.add(a[i]); } @@ -1078,15 +1071,15 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { if (a != null) { for (i=0; i<a.length; i++) entries.add(a[i]); } a = getManagedBuildValues(IPathEntry.CDT_MACRO); if (a != null) { for (i=0; i<a.length; i++) entries.add(a[i]); } - return (IPathEntry[])entries.toArray(new IPathEntry[entries.size()]); + return entries.toArray(new IPathEntry[entries.size()]); } /** * Obtain all possible Managed build built-ins - * @return + * @return IPathEntry[] */ public IPathEntry[] getManagedBuildBuiltIns() { - List entries = new ArrayList(); + List<IPathEntry> entries = new ArrayList<IPathEntry>(); int i=0; IPathEntry[] a = getManagedBuildBuiltIns(IPathEntry.CDT_INCLUDE); if (a != null) { for (i=0; i<a.length; i++) entries.add(a[i]); } @@ -1094,33 +1087,33 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { if (a != null) { for (i=0; i<a.length; i++) entries.add(a[i]); } a = getManagedBuildBuiltIns(IPathEntry.CDT_MACRO); if (a != null) { for (i=0; i<a.length; i++) entries.add(a[i]); } - return (IPathEntry[])entries.toArray(new IPathEntry[entries.size()]); + return entries.toArray(new IPathEntry[entries.size()]); } /** * * @param entryType - * @return + * @return IPathEntry[] */ public IPathEntry[] getManagedBuildValues(int entryType) { // obtain option values - List entries = getOptionValues(entryType, false); + List<IPathEntry> entries = getOptionValues(entryType, false); // for includes, get env variables values; useless for other entry types if (entryType == IPathEntry.CDT_INCLUDE) { IEnvironmentVariableProvider env = ManagedBuildManager.getEnvironmentVariableProvider(); entries = addIncludes(entries, env.getBuildPaths(getDefaultConfiguration(), IEnvVarBuildPath.BUILDPATH_INCLUDE), Path.EMPTY, 0, null); } - return (IPathEntry[])entries.toArray(new IPathEntry[entries.size()]); + return entries.toArray(new IPathEntry[entries.size()]); } /** * @param entryType - * @return + * @return IPathEntry[] */ public IPathEntry[] getManagedBuildBuiltIns(int entryType) { - List entries = getOptionValues(entryType, true); - return (IPathEntry[])entries.toArray(new IPathEntry[entries.size()]); + List<IPathEntry> entries = getOptionValues(entryType, true); + return entries.toArray(new IPathEntry[entries.size()]); } /** @@ -1129,8 +1122,8 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @param builtIns - return either values or built-in's * @return list of strings which contains all found values */ - private List getOptionValues(int entryType, boolean builtIns) { - List entries = new ArrayList(); + private List<IPathEntry> getOptionValues(int entryType, boolean builtIns) { + List<IPathEntry> entries = new ArrayList<IPathEntry>(); IConfiguration cfg = getDefaultConfiguration(); // process config toolchain's options @@ -1171,7 +1164,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @param builtIns - whether get actual values or builtins * @param obj - object to be processed (ResCfg | Cfg) */ - private List readToolsOptions(int entryType, List entries, boolean builtIns, IBuildObject obj) { + private List<IPathEntry> readToolsOptions(int entryType, List<IPathEntry> entries, boolean builtIns, IBuildObject obj) { ITool[] t = null; IPath resPath = Path.EMPTY; @@ -1232,28 +1225,30 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @param entries * @param values * @param resPath - * @param ocd + * @param context + * @param obj + * @return List<IPathEntry> */ - protected List addIncludes(List entries, String[] values, IPath resPath, int context ,Object obj) { + protected List<IPathEntry> addIncludes(List<IPathEntry> entries, String[] values, IPath resPath, int context ,Object obj) { return addPaths(entries, values, resPath, context, obj, IPathEntry.CDT_INCLUDE); } - protected List addPaths(List entries, String[] values, IPath resPath, int context ,Object obj, int type){ + protected List<IPathEntry> addPaths(List<IPathEntry> entries, String[] values, IPath resPath, int context ,Object obj, int type){ if (values != null && values.length > 0) { - List list = new ArrayList(); + List<String> list = new ArrayList<String>(); for (int k=0; k<values.length; k++) { processPath(list, values[k], context, obj); } - Iterator iter = list.iterator(); + Iterator<String> iter = list.iterator(); while(iter.hasNext()){ IPathEntry entry = null; switch(type){ case IPathEntry.CDT_INCLUDE: - entry = CoreModel.newIncludeEntry(resPath, Path.EMPTY, new Path((String)iter.next()), true); + entry = CoreModel.newIncludeEntry(resPath, Path.EMPTY, new Path(iter.next()), true); break; case IPathEntry.CDT_LIBRARY: - entry = CoreModel.newLibraryEntry(resPath, Path.EMPTY, new Path((String)iter.next()), null, null, null, true); + entry = CoreModel.newLibraryEntry(resPath, Path.EMPTY, new Path(iter.next()), null, null, null, true); break; } if (entry != null && !entries.contains(entry)) { entries.add(entry); } @@ -1267,9 +1262,11 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @param entries * @param values * @param resPath - * @param ocd + * @param context + * @param obj + * @return List<IPathEntry> */ - protected List addLibraries(List entries, String[] values, IPath resPath, int context, Object obj) { + protected List<IPathEntry> addLibraries(List<IPathEntry> entries, String[] values, IPath resPath, int context, Object obj) { return addPaths(entries, values, resPath, context, obj, IPathEntry.CDT_LIBRARY); } @@ -1278,8 +1275,11 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { * @param entries * @param values * @param resPath + * @param context + * @param obj + * @return List<IPathEntry> */ - protected List addSymbols(List entries, String[] values, IPath resPath, int context, Object obj) { + protected List<IPathEntry> addSymbols(List<IPathEntry> entries, String[] values, IPath resPath, int context, Object obj) { if (values == null) return entries; for (int i=0; i<values.length; i++) { try { @@ -1295,7 +1295,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { return entries; } - private List createMacroEntry(List entries, String val, IPath resPath){ + private List<IPathEntry> createMacroEntry(List<IPathEntry> entries, String val, IPath resPath){ if (val != null && val.length() != 0){ String[] tokens = val.split("="); //$NON-NLS-1$ @@ -1303,9 +1303,9 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { String value = (tokens.length > 1) ? tokens[1].trim() : new String(); // Make sure the current entries do not contain a duplicate boolean add = true; - Iterator entryIter = entries.listIterator(); + Iterator<IPathEntry> entryIter = entries.listIterator(); while (entryIter.hasNext()) { - IPathEntry entry = (IPathEntry) entryIter.next(); + IPathEntry entry = entryIter.next(); if (entry.getEntryKind() == IPathEntry.CDT_MACRO) { if (((IMacroEntry)entry).getMacroName().equals(key) && ((IMacroEntry)entry).getMacroValue().equals(value)) { diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties index 94aecd2899d..283f38e9362 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties @@ -174,6 +174,7 @@ HeadlessBuilder_is_not_valid_in_workspace=\ is not valid in the workspace\! HeadlessBuilder_no_arguments=No arguments specified. HeadlessBuilder_NoConfigMatched=WARNING: No Config matched " HeadlessBuilder_NoProjectMatched=WARNING: No Project matched " +HeadlessBuilder_Not_CDT_Proj=\ doesn't appear to be a CDT project. Skipping... HeadlessBuilder_project=Project: HeadlessBuilder_Quote=" HeadlessBuilder_RegExSyntaxError=Project/Configuration Regular Expression Syntax error: diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java index f1e34ecf926..88ee170c5af 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 Intel Corporation and others. + * Copyright (c) 2007, 2010 Intel 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 @@ -170,7 +170,10 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem ManagedBuilderCorePlugin.log(e); } info.setValid(true); - + // Update the ManagedBuildInfo in the ManagedBuildManager map. Doing this creates a barrier for subsequent + // ManagedBuildManager#getBuildInfo(...) see Bug 305146 for more + ManagedBuildManager.setLoaddedBuildInfo(des.getProjectDescription().getProject(), info); + setPersistedFlag(des); cacheNaturesIdsUsedOnCache(des); @@ -543,6 +546,9 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem info.setValid(true); setPersistedFlag(des); cacheNaturesIdsUsedOnCache(des); + // Update the ManagedBuildInfo in the ManagedBuildManager map. Doing this creates a barrier for subsequent + // ManagedBuildManager#getBuildInfo(...) see Bug 305146 for more + ManagedBuildManager.setLoaddedBuildInfo(des.getProjectDescription().getProject(), info); return cfg.getConfigurationData(); } return null; |