diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd
index 50bc1978cf0..188a57172ab 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd
+++ b/build/org.eclipse.cdt.managedbuilder.core/schema/ManagedBuildTools.exsd
@@ -17,6 +17,7 @@
+
@@ -542,6 +543,31 @@ Additional special types exist to flag options of special relevance to the build
+
+
+
+ <p>
+Version identifier for the managed build extension point. It is a string representation, consisting of three (3) tokens separated by a decimal point. The 3 tokens are positive integer numbers. For example, the following are valid version identifiers:
+ <ul>
+ <li><code>0.0.0</code></li>
+ <li><code>1.0.1234</code></li>
+ <li><code>1.9</code> (interpreted as <code>1.9.0</code>)</li>
+ <li><code>3</code> (interpreted as <code>3.0.0</code>)</li>
+ </ul>
+</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java
index 0c67bacec7c..58dac37e620 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java
@@ -56,6 +56,8 @@ import org.eclipse.core.runtime.QualifiedName;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.ProcessingInstruction;
/**
* This is the main entry point for getting at the build information
@@ -64,11 +66,15 @@ import org.w3c.dom.Node;
public class ManagedBuildManager extends AbstractCExtension implements IScannerInfoProvider {
private static final QualifiedName buildInfoProperty = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "managedBuildInfo"); //$NON-NLS-1$
- private static final String ROOT_ELEM_NAME = "ManagedProjectBuildInfo"; //$NON-NLS-1$
+ private static final String ROOT_NODE_NAME = "ManagedProjectBuildInfo"; //$NON-NLS-1$
private static final String FILE_NAME = ".cdtbuild"; //$NON-NLS-1$
private static final ITarget[] emptyTargets = new ITarget[0];
public static final String INTERFACE_IDENTITY = ManagedBuilderCorePlugin.getUniqueIdentifier() + "." + "ManagedBuildManager"; //$NON-NLS-1$ //$NON-NLS-2$
- public static final String EXTENSION_POINT_ID = "ManagedBuildInfo"; //$NON-NLS-1$
+ private static final String EXTENSION_POINT_ID = "ManagedBuildInfo"; //$NON-NLS-1$
+ private static final String REVISION_ELEMENT_NAME = "managedBuildRevision"; //$NON-NLS-1$
+ private static final String VERSION_ELEMENT_NAME = "fileVersion"; //$NON-NLS-1$
+ private static final String MANIFEST_VERSION_ERROR ="ManagedBuildManager.error.manifest.version.error"; //$NON-NLS-1$
+ private static final String PROJECT_VERSION_ERROR ="ManagedBuildManager.error.project.version.error"; //$NON-NLS-1$
// This is the version of the manifest and project files that
private static final PluginVersionIdentifier buildInfoVersion = new PluginVersionIdentifier(2, 0, 0);
@@ -311,19 +317,26 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();
- Element rootElement = doc.createElement(ROOT_ELEM_NAME);
- doc.appendChild(rootElement);
+
+ // Get the build information for the project
+ ManagedBuildInfo buildInfo = (ManagedBuildInfo) getBuildInfo(project);
// Save the build info
- ManagedBuildInfo buildInfo = (ManagedBuildInfo) getBuildInfo(project);
if (buildInfo != null && (force == true || buildInfo.isDirty())) {
+ // For post-2.0 projects, there will be a version
+ String projectVersion = buildInfo.getVersion();
+ if (projectVersion != null) {
+ ProcessingInstruction instruction = doc.createProcessingInstruction(VERSION_ELEMENT_NAME, projectVersion);
+ doc.appendChild(instruction);
+ }
+ Element rootElement = doc.createElement(ROOT_NODE_NAME);
+ doc.appendChild(rootElement);
buildInfo.serialize(doc, rootElement);
// Transform the document to something we can save in a file
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
- transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(stream);
@@ -331,16 +344,15 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
// Save the document
IFile projectFile = project.getFile(FILE_NAME);
- InputStream inputStream = new ByteArrayInputStream(stream.toByteArray());
+ String utfString = stream.toString("UTF8");
if (projectFile.exists()) {
- projectFile.setContents(inputStream, IResource.FORCE, null);
+ projectFile.setContents(new ByteArrayInputStream(utfString.getBytes()), IResource.FORCE, null);
} else {
- projectFile.create(inputStream, IResource.FORCE, null);
+ projectFile.create(new ByteArrayInputStream(utfString.getBytes()), IResource.FORCE, null);
}
// Close the streams
stream.close();
- inputStream.close();
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
@@ -455,16 +467,28 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
return new Target(resource, parentTarget);
}
- private static boolean isVersionCompatible(IPluginDescriptor descriptor) {
- // Get the version of the manifest
- PluginVersionIdentifier plugin = descriptor.getVersionIdentifier();
-
+ private static boolean isVersionCompatible(IExtension extension) {
// We can ignore the qualifier
- PluginVersionIdentifier version = new PluginVersionIdentifier(plugin.getMajorComponent(),
- plugin.getMinorComponent(),
- plugin.getServiceComponent());
+ PluginVersionIdentifier version = null;
+
+ // Get the version of the manifest
+ IConfigurationElement[] elements = extension.getConfigurationElements();
- return(buildInfoVersion.isCompatibleWith(version));
+ // Find the version string in the manifest
+ for (int index = 0; index < elements.length; ++index) {
+ IConfigurationElement element = elements[index];
+ if (element.getName().equals(REVISION_ELEMENT_NAME)) {
+ version = new PluginVersionIdentifier(element.getAttribute(VERSION_ELEMENT_NAME));
+ break;
+ }
+ }
+
+ if (version == null) {
+ // This is a 1.2 manifest and we are compatible for now
+ return true;
+ } else {
+ return(buildInfoVersion.isCompatibleWith(version));
+ }
}
/* (non-Javadoc)
@@ -481,9 +505,35 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
InputStream stream = file.getContents();
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(stream);
+ String fileVersion = null;
+
+ // Get the first element in the project file
Node rootElement = document.getFirstChild();
- if (rootElement.getNodeName().equals(ROOT_ELEM_NAME)) {
- buildInfo = new ManagedBuildInfo(project, (Element)rootElement);
+
+ // Since 2.0 this will be a processing instruction containing version
+ if (rootElement.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE) {
+ // This is a 1.2 project and it must be updated
+
+ } else {
+ // Make sure that the version is compatible with the manager
+ fileVersion = rootElement.getNodeValue();
+ PluginVersionIdentifier version = new PluginVersionIdentifier(fileVersion);
+ if (!buildInfoVersion.isCompatibleWith(version)) {
+ throw new BuildException(ManagedBuilderCorePlugin.getResourceString(PROJECT_VERSION_ERROR));
+ }
+ if (buildInfoVersion.isGreaterThan(version)) {
+ // TODO Upgrade the project
+ }
+ }
+
+ // Now get the project root element (there should be only one)
+ NodeList nodes = document.getElementsByTagName(ROOT_NODE_NAME);
+ if (nodes.getLength() > 0) {
+ Node node = nodes.item(0);
+ buildInfo = new ManagedBuildInfo(project, (Element)node);
+ if (fileVersion != null) {
+ buildInfo.setVersion(fileVersion);
+ }
project.setSessionProperty(buildInfoProperty, buildInfo);
}
} catch (Exception e) {
@@ -503,18 +553,17 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
// Get those extensions
IPluginDescriptor descriptor = ManagedBuilderCorePlugin.getDefault().getDescriptor();
-
- if (!isVersionCompatible(descriptor)) {
- //The version of the Plug-in is greater than what the manager thinks it understands
- throw new BuildException(ManagedBuilderCorePlugin.getResourceString("ManagedBuildManager.error.version.higher")); //$NON-NLS-1$
- }
-
- // We can read the manifest
IExtensionPoint extensionPoint = descriptor.getExtensionPoint(EXTENSION_POINT_ID);
IExtension[] extensions = extensionPoint.getExtensions();
+
// First call the constructors
for (int i = 0; i < extensions.length; ++i) {
IExtension extension = extensions[i];
+ // Can we read this manifest
+ if (!isVersionCompatible(extension)) {
+ //The version of the Plug-in is greater than what the manager thinks it understands
+ throw new BuildException(ManagedBuilderCorePlugin.getResourceString(MANIFEST_VERSION_ERROR));
+ }
IConfigurationElement[] elements = extension.getConfigurationElements();
loadConfigElements(DefaultManagedConfigElement.convertArray(elements));
}
@@ -600,7 +649,7 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(stream);
Node rootElement = document.getFirstChild();
- if (rootElement.getNodeName().equals(ROOT_ELEM_NAME)) {
+ if (rootElement.getNodeName().equals(ROOT_NODE_NAME)) {
return true;
}
} catch (Exception e) {
@@ -672,8 +721,11 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
return (IManagedBuildInfo) findBuildInfo(resource, false);
}
- public static String getBuildInfoVersion() {
- return buildInfoVersion.toString();
+ /**
+ * @return
+ */
+ public static PluginVersionIdentifier getBuildInfoVersion() {
+ return buildInfoVersion;
}
/*
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 d2e69760a5f..795fd05ccfb 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
@@ -36,7 +36,7 @@ import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.QualifiedName;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
@@ -53,6 +53,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
private IResource owner;
private Map targetMap;
private List targetList;
+ private String version; //$NON-NLS-1$
/**
* Create a new managed build information for the IResource specified in the argument
@@ -94,13 +95,10 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
public ManagedBuildInfo(IResource owner, Element element) {
this(owner);
- // Read in the top-level info objects
- Node child = element.getFirstChild();
- while (child != null) {
- if (child.getNodeName().equals(ITarget.TARGET_ELEMENT_NAME)) {
- new Target(this, (Element)child);
- }
- child = child.getNextSibling();
+ // Inflate the targets
+ NodeList targetNodes = element.getElementsByTagName(ITarget.TARGET_ELEMENT_NAME);
+ for (int targIndex = targetNodes.getLength() - 1; targIndex >= 0; --targIndex) {
+ new Target(this, (Element)targetNodes.item(targIndex));
}
}
@@ -831,6 +829,13 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
return (String[])objs.toArray(new String[objs.size()]);
}
+ /**
+ * @return
+ */
+ public String getVersion() {
+ return version;
+ }
+
/* (non-Javadoc)
* @see org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo#isDirty()
*/
@@ -950,6 +955,7 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
// Remember the default target and configurations
persistDefaultTarget();
persistDefaultConfigurations();
+
// I'm clean now
setDirty(false);
}
@@ -1005,6 +1011,16 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
}
}
+ /**
+ * @param version
+ */
+ public void setVersion(String version) {
+ if (version != null && !version.equals(this.version)) {
+ this.version = version;
+ setDirty(true);
+ }
+ }
+
/**
* Sets the owner of the receiver to be the IResource
specified
* in the argument.
@@ -1025,5 +1041,4 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
}
}
}
-
}
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 f0a806cf2f0..6962600bfd7 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
@@ -37,5 +37,5 @@ Option.error.bad_value_type=Bad value for type
ManagedBuildManager.error.owner_not_null=addTarget: owner not null
ManagedBuildManager.error.null_owner=addTarget: null owner
ManagedBuildManager.error.owner_not_project=addTarget: owner not project
-ManagedBuildManager.error.version.higher=Version of file is higher than version of manager
-ManagedBuildManager.error.version.lower=Version of file is less than version of manager
+ManagedBuildManager.error.manifest.version.error=The version of plugin file is higher than version of the build system
+ManagedBuildManager.error.project.version.error=The version of the project is higher than the build system
diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml
index 063bd777742..d646c0a8b8a 100644
--- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml
+++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml
@@ -70,6 +70,9 @@
id="cdt.managed.build.info"
name="Managed Build Tools Description"
point="org.eclipse.cdt.managedbuilder.core.ManagedBuildInfo">
+
+