[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Applied: [cdt-patch] Patch for Approval: Standard make info in cdtproject file
|
I have applied this patch. I have raised a bug on myself to address the
multi-threading issue.
Doug Schaefer, Senior Software Developer
IBM Rational Software, Ottawa, Ontario, Canada
Douglas Schaefer/Ottawa/IBM@IBMCA
Sent by: cdt-patch-admin@xxxxxxxxxxx
07/07/2003 10:14 PM
Please respond to
cdt-patch@xxxxxxxxxxx
To
cdt-patch@xxxxxxxxxxx
cc
Subject
[cdt-patch] Patch for Approval: Standard make info in cdtproject file
Hey gang,
Here's one I'd like to get approval on. This patch adds the ability to
add arbitrary XML data to the cdtproject file. I then use this to store
the stuff Sean had put in the cdtbuild file for Standard Make projects.
The intention is to do the same for the Managed Make projects and anything
else we need to store in source control.
I also cleaned up some of the exception handling in the
StandardBuildManager.
Thanks,
Doug Schaefer, Senior Software Developer
IBM Rational Software, Ottawa, Ontario, Canada
Index: build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java,v
retrieving revision 1.1
diff -u -r1.1 StandardBuildManager.java
--- build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java 4 Jul 2003 18:36:45 -0000 1.1
+++ build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java 8 Jul 2003 02:06:31 -0000
@@ -1,9 +1,5 @@
package org.eclipse.cdt.core.build.standard;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -11,16 +7,9 @@
import java.util.ListIterator;
import java.util.Map;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.apache.xerces.dom.DocumentImpl;
-import org.apache.xml.serialize.Method;
-import org.apache.xml.serialize.OutputFormat;
-import org.apache.xml.serialize.Serializer;
-import org.apache.xml.serialize.SerializerFactory;
import org.eclipse.cdt.core.BuildInfoFactory;
import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
@@ -30,9 +19,9 @@
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
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;
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
@@ -49,18 +38,16 @@
// Name we will use to store build property with the project
private static final QualifiedName buildInfoProperty
= new QualifiedName(CCorePlugin.PLUGIN_ID, "standardBuildInfo");
+ private static final String ID = CCorePlugin.PLUGIN_ID + ".standardBuildInfo";
// Listeners interested in build model changes
private static Map buildModelListeners;
- private static final String FILE_NAME = ".cdtbuild";
- private static final String ROOT_ELEM_NAME = "StandardProjectBuildInfo";
-
/**
* @param project
* @return
*/
- private static IStandardBuildInfo findBuildInfo(IResource resource, boolean create) {
+ private static IStandardBuildInfo findBuildInfo(IResource resource, boolean create) throws CoreException {
IStandardBuildInfo buildInfo = null;
// See if there's already one associated with the resource for this session
try {
@@ -87,11 +74,11 @@
return buildInfo;
}
- public static IStandardBuildInfo getBuildInfo(IProject project) {
+ public static IStandardBuildInfo getBuildInfo(IProject project) throws CoreException {
return findBuildInfo(project, false);
}
- public static IStandardBuildInfo getBuildInfo(IProject project, boolean create) {
+ public static IStandardBuildInfo getBuildInfo(IProject project, boolean create) throws CoreException {
return findBuildInfo(project, create);
}
@@ -108,7 +95,7 @@
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#managesResource(org.eclipse.core.resources.IResource)
*/
- public boolean managesResource(IResource resource) {
+ public boolean managesResource(IResource resource) throws CoreException {
/*
* Answers true if this project has a build info associated with it
*/
@@ -129,7 +116,9 @@
return info == null ? false : true;
}
- public static void setPreprocessorSymbols(IProject project, String[] symbols) {
+ public static void setPreprocessorSymbols(IProject project, String[] symbols)
+ throws CoreException
+ {
// Get the information for the project
IStandardBuildInfo info = getBuildInfo(project);
// Set the new information
@@ -143,7 +132,9 @@
}
}
- public static void setIncludePaths(IProject project, String[] paths) {
+ public static void setIncludePaths(IProject project, String[] paths)
+ throws CoreException
+ {
// Get the build info for the project
IStandardBuildInfo info = getBuildInfo(project);
if (info != null) {
@@ -177,25 +168,10 @@
* information is then associated with the resource for the duration of
* the session.
*/
- private static IStandardBuildInfo loadBuildInfo(IProject project) {
- IStandardBuildInfo buildInfo = null;
- IFile file = project.getFile(FILE_NAME);
- if (!file.exists())
- return null;
-
- try {
- InputStream stream = file.getContents();
- DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
- Document document = parser.parse(stream);
- Node rootElement = document.getFirstChild();
- if (rootElement.getNodeName().equals(ROOT_ELEM_NAME)) {
- buildInfo = BuildInfoFactory.create(project, (Element)rootElement);
- project.setSessionProperty(buildInfoProperty, buildInfo);
- }
- } catch (Exception e) {
- buildInfo = null;
- }
-
+ private static IStandardBuildInfo loadBuildInfo(IProject project) throws CoreException {
+ ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
+ IStandardBuildInfo buildInfo = BuildInfoFactory.create(project, descriptor.getProjectData(ID));
+ project.setSessionProperty(buildInfoProperty, buildInfo);
return buildInfo;
}
@@ -224,38 +200,25 @@
*
* @param project
*/
- public static void saveBuildInfo(IProject project) {
- // Create document
- Document doc = new DocumentImpl();
- Element rootElement = doc.createElement(ROOT_ELEM_NAME);
- doc.appendChild(rootElement);
-
+ public static void saveBuildInfo(IProject project) throws CoreException {
+ ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project);
+
+ Element rootElement = descriptor.getProjectData(ID);
+
+ // Clear out all current children
+ // Note: Probably would be a better idea to merge in the data
+ NodeList nodes = rootElement.getChildNodes();
+ for (int i = 0; i < nodes.getLength(); ++i) {
+ Node node = nodes.item(i);
+ if (node instanceof Element)
+ rootElement.removeChild(nodes.item(i));
+ }
+
// Save the build info
IStandardBuildInfo buildInfo = getBuildInfo(project);
if (buildInfo != null)
- buildInfo.serialize(doc, rootElement);
-
- // Save the document
- ByteArrayOutputStream s = new ByteArrayOutputStream();
- OutputFormat format = new OutputFormat();
- format.setIndenting(true);
- format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$
- String xml = null;
- try {
- Serializer serializer = SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(new OutputStreamWriter(s, "UTF8"), format);
- serializer.asDOMSerializer().serialize(doc);
- xml = s.toString("UTF8"); //$NON-NLS-1$
- IFile rscFile = project.getFile(FILE_NAME);
- InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
- // update the resource content
- if (rscFile.exists()) {
- rscFile.setContents(inputStream, IResource.FORCE, null);
- } else {
- rscFile.create(inputStream, IResource.FORCE, null);
- }
- } catch (Exception e) {
- return;
- }
+ buildInfo.serialize(rootElement.getOwnerDocument(), rootElement);
+ descriptor.saveProjectData();
}
/* (non-Javadoc)
Index: parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java,v
retrieving revision 1.1
diff -u -r1.1 IScannerInfoProvider.java
--- parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java 4 Jul 2003 18:36:45 -0000 1.1
+++ parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java 8 Jul 2003 02:06:40 -0000
@@ -1,6 +1,7 @@
package org.eclipse.cdt.core.parser;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
@@ -31,7 +32,7 @@
* @param resource
* @return
*/
- public boolean managesResource(IResource resource);
+ public boolean managesResource(IResource resource) throws CoreException;
/**
* The receiver will no longer notify the listener specified in
Index: src/org/eclipse/cdt/core/CProjectNature.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CProjectNature.java,v
retrieving revision 1.5
diff -u -r1.5 CProjectNature.java
--- src/org/eclipse/cdt/core/CProjectNature.java 4 Jul 2003 18:36:45 -0000 1.5
+++ src/org/eclipse/cdt/core/CProjectNature.java 8 Jul 2003 02:06:44 -0000
@@ -296,8 +296,11 @@
* @see IProjectNature#setProject
*/
public void setProject(IProject project) {
- fProject= project;
- fBuildInfo = StandardBuildManager.getBuildInfo(fProject, true);
+ try {
+ fProject= project;
+ fBuildInfo = StandardBuildManager.getBuildInfo(fProject, true);
+ } catch (CoreException e) {
+ }
}
}
Index: src/org/eclipse/cdt/core/ICDescriptor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICDescriptor.java,v
retrieving revision 1.4
diff -u -r1.4 ICDescriptor.java
--- src/org/eclipse/cdt/core/ICDescriptor.java 28 Mar 2003 21:00:39 -0000 1.4
+++ src/org/eclipse/cdt/core/ICDescriptor.java 8 Jul 2003 02:06:44 -0000
@@ -12,6 +12,7 @@
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
+import org.w3c.dom.Element;
public interface ICDescriptor {
public ICOwnerInfo getProjectOwner();
@@ -27,4 +28,7 @@
public void setPathEntries(ICPathEntry[] entries) throws CoreException;
public ICPathEntry[] getPathEntries();
+
+ public Element getProjectData(String id) throws CoreException;
+ public void saveProjectData() throws CoreException;
}
Index: src/org/eclipse/cdt/internal/core/CDescriptor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CDescriptor.java,v
retrieving revision 1.9
diff -u -r1.9 CDescriptor.java
--- src/org/eclipse/cdt/internal/core/CDescriptor.java 3 Apr 2003 04:28:54 -0000 1.9
+++ src/org/eclipse/cdt/internal/core/CDescriptor.java 8 Jul 2003 02:06:45 -0000
@@ -23,6 +23,7 @@
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
import org.apache.xerces.dom.DocumentImpl;
import org.apache.xml.serialize.Method;
@@ -60,6 +61,7 @@
private IProject fProject;
private HashMap extMap = new HashMap(4);
private HashMap extInfoMap = new HashMap(4);
+ private Document dataDoc;
static final String DESCRIPTION_FILE_NAME = ".cdtproject";
private static final char[][] NO_CHAR_CHAR = new char[0][];
@@ -67,6 +69,9 @@
private static final String PROJECT_EXTENSION = "extension";
private static final String PROJECT_EXTENSION_ATTRIBUTE = "attribute";
private static final String PATH_ENTRY = "cpathentry";
+ private static final String PROJECT_DATA = "data";
+ private static final String PROJECT_DATA_ITEM = "item";
+ private static final String PROJECT_DATA_ID = "id";
private boolean fDirty;
private boolean autoSave;
@@ -328,6 +333,8 @@
if (entry != null) {
pathEntries.add(entry);
}
+ } else if (childNode.getNodeName().equals(PROJECT_DATA)) {
+ decodeProjectData((Element)childNode);
}
}
}
@@ -450,6 +457,7 @@
configRootElement.setAttribute("id", fOwner.getID()); //$NON-NLS-1$
encodeProjectExtensions(doc, configRootElement);
encodePathEntries(doc, configRootElement);
+ encodeProjectData(doc, configRootElement);
return serializeDocument(doc);
}
@@ -544,5 +552,56 @@
}
}
return (ICExtension) cExtension;
+ }
+
+ // The project data allows for the storage of any structured information
+ // into the cdtproject file.
+ private Document getProjectDataDoc() throws CoreException {
+ if (dataDoc == null) {
+ try {
+ dataDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ } catch (ParserConfigurationException e) {
+ throw new CoreException(
+ new Status(
+ IStatus.ERROR,
+ CCorePlugin.PLUGIN_ID,
+ IStatus.ERROR,
+ "getProjectDataDoc",
+ e));
+ }
+ Element rootElem = dataDoc.createElement(PROJECT_DATA);
+ dataDoc.appendChild(rootElem);
+ }
+ return dataDoc;
+ }
+
+ private void decodeProjectData(Element data) throws CoreException {
+ Document doc = getProjectDataDoc();
+ doc.getDocumentElement().appendChild(doc.importNode(data, true));
+ }
+
+ public Element getProjectData(String id) throws CoreException {
+ NodeList nodes = getProjectDataDoc().getDocumentElement().getElementsByTagName(PROJECT_DATA_ITEM);
+ for (int i = 0; i < nodes.getLength(); ++i) {
+ Element element = (Element)nodes.item(i);
+ if (element.getAttribute(PROJECT_DATA_ID).equals(id))
+ return element;
+ }
+
+ // Not found, make a new one
+ Element element = dataDoc.createElement(PROJECT_DATA_ITEM);
+ element.setAttribute(PROJECT_DATA_ID, id);
+ dataDoc.getDocumentElement().appendChild(element);
+ return element;
+ }
+
+ public void saveProjectData() throws CoreException {
+ setDirty();
+ }
+
+ private void encodeProjectData(Document doc, Element root) {
+ // Don't create or encode the doc if it isn't there already
+ if (dataDoc != null)
+ root.appendChild(doc.importNode(dataDoc.getDocumentElement(), true));
}
}
Index: build/org/eclipse/cdt/core/build/managed/tests/StandardBuildTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/build/org/eclipse/cdt/core/build/managed/tests/StandardBuildTests.java,v
retrieving revision 1.1
diff -u -r1.1 StandardBuildTests.java
--- build/org/eclipse/cdt/core/build/managed/tests/StandardBuildTests.java 4 Jul 2003 18:36:47 -0000 1.1
+++ build/org/eclipse/cdt/core/build/managed/tests/StandardBuildTests.java 8 Jul 2003 02:07:57 -0000
@@ -107,7 +107,7 @@
return suite;
}
- private void checkDefaultProjectSettings(IProject project) {
+ private void checkDefaultProjectSettings(IProject project) throws Exception {
assertNotNull(project);
// There should not be any include path or defined symbols for the project
@@ -128,7 +128,7 @@
assertEquals(EMPTY_STRING, info.getIncrementalBuildArguments());
}
- private void checkOverriddenProjectSettings(IProject project) {
+ private void checkOverriddenProjectSettings(IProject project) throws Exception {
assertNotNull(project);
// Check that the new stuff is there
@@ -232,7 +232,7 @@
removeProject(PROJECT_NAME);
}
- public void testProjectConversion() {
+ public void testProjectConversion() throws Exception {
// Open the project
IProject project = null;
try {
@@ -280,7 +280,7 @@
/**
*
*/
- public void testProjectCreation () {
+ public void testProjectCreation() throws Exception {
// Create a new project
IProject project = null;
try {
@@ -303,7 +303,7 @@
checkDefaultProjectSettings(project);
}
- public void testProjectSettings() {
+ public void testProjectSettings() throws Exception {
// Get the project
IProject project = null;
try {
@@ -342,7 +342,7 @@
checkOverriddenProjectSettings(project);
}
- public void testScannerListenerInterface() {
+ public void testScannerListenerInterface() throws Exception {
// Get the project
IProject project = null;
try {
Index: src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java,v
retrieving revision 1.2
diff -u -r1.2 BuildPathInfoBlock.java
--- src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java 4 Jul 2003 18:36:42 -0000 1.2
+++ src/org/eclipse/cdt/ui/wizards/BuildPathInfoBlock.java 8 Jul 2003 02:09:06 -0000
@@ -265,14 +265,18 @@
monitor = new NullProgressMonitor();
}
if (project != null) {
- // Store the paths and symbols
- monitor.beginTask("Setting Include Paths", 1);
- StandardBuildManager.setIncludePaths(project, getPathListContents());
-
- monitor.beginTask("Setting Defined Symbols", 1);
- StandardBuildManager.setPreprocessorSymbols(project, getSymbolListContents());
-
- StandardBuildManager.saveBuildInfo(project);
+ try {
+ // Store the paths and symbols
+ monitor.beginTask("Setting Include Paths", 1);
+ StandardBuildManager.setIncludePaths(project, getPathListContents());
+
+ monitor.beginTask("Setting Defined Symbols", 1);
+ StandardBuildManager.setPreprocessorSymbols(project, getSymbolListContents());
+
+ StandardBuildManager.saveBuildInfo(project);
+ } catch (CoreException e) {
+ // Should probably tell someone
+ }
}
}
@@ -589,15 +593,21 @@
private void setPathListContents() {
if (project != null) {
- IStandardBuildInfo info = StandardBuildManager.getBuildInfo(project);
- pathList.setItems(info.getIncludePaths());
+ try {
+ IStandardBuildInfo info = StandardBuildManager.getBuildInfo(project);
+ pathList.setItems(info.getIncludePaths());
+ } catch (CoreException e) {
+ }
}
}
private void setSymbolListContents() {
if (project != null) {
- IStandardBuildInfo info = StandardBuildManager.getBuildInfo(project);
- symbolList.setItems(info.getPreprocessorSymbols());
+ try {
+ IStandardBuildInfo info = StandardBuildManager.getBuildInfo(project);
+ symbolList.setItems(info.getPreprocessorSymbols());
+ } catch (CoreException e) {
+ }
}
}