1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 09:25:31 +02:00

added new Generic Extension creation machanism that uses the

.cptproject file to find which plugin contains the extension point
This commit is contained in:
David Inglis 2002-09-06 20:16:04 +00:00
parent b128851cc3
commit cb8243d3ef
22 changed files with 796 additions and 592 deletions

View file

@ -2,6 +2,7 @@ package org.eclipse.cdt.core.builder;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
@ -26,6 +27,8 @@ public class CIncrementalBuilder extends IncrementalProjectBuilder {
Map args;
IProgressMonitor monitor;
private ICBuilder fCurrentBuilder;
public int getkind() {
return kind;
}
@ -38,11 +41,9 @@ public class CIncrementalBuilder extends IncrementalProjectBuilder {
return monitor;
}
//FIXME: Not implemented
public IConsole getConsole() {
ICBuilder builder = getCBuilder();
String id = builder.getID();
return null;
String id = fCurrentBuilder.getID();
return CCorePlugin.getDefault().getConsole(id);
}
//FIXME: Not implemented
@ -63,14 +64,15 @@ public class CIncrementalBuilder extends IncrementalProjectBuilder {
this.monitor = monitor;
// Get the ICBuilder
ICBuilder cbuilder = getCBuilder();
ICBuilder cbuilder[] = getCBuilder();
// FIXME: Check preference for non-modal builds
return cbuilder.build(this);
fCurrentBuilder = cbuilder[0];
return fCurrentBuilder.build(this);
}
//FIXME: Not implemented
private ICBuilder getCBuilder () {
return null;
private ICBuilder[] getCBuilder () throws CoreException {
return CCorePlugin.getDefault().getBuilders(getProject());
}
}

View file

@ -8,5 +8,8 @@ CProblemMarker.name=C Problem
CBuildCommand.name=C Builder Command
CBuildConsole.name=C Builder Console
CProjectInfo.name=C Project Info
projectinfo.name=Core Make Project
CBuilder.name=C Build Model
makeprojectowner.name=Make Project
genericmake.name=Generic Make
makebuildmodel.name=Make Builder

View file

@ -29,6 +29,7 @@
<extension-point id="CBuildCommand" name="%CBuildCommand.name"/>
<extension-point id="CBuildConsole" name="%CBuildConsole.name"/>
<extension-point id="CProjectOwner" name="%CProjectOwner.name"/>
<extension-point id="CBuildModel" name="%CBuilder.name"/>
<extension
id="cbuilder"
@ -40,6 +41,17 @@
</run>
</builder>
</extension>
<extension
id="newcbuilder"
name="C Builder"
point="org.eclipse.core.resources.builders">
<builder>
<run
class="org.eclipse.cdt.core.builder.CIncrementalBuilder">
</run>
</builder>
</extension>
<extension
id="problem"
name="%CProblemMarker.name"
@ -78,13 +90,25 @@
</buildcommand>
</extension>
<extension
point="org.eclipse.cdt.core.CProjectOwner"
name="%projectowner.name"
id="make">
<platform id="*"
name="%genericmake.name" architecture="*"/>
<run
class = "org.eclipse.cdt.internal.core.make.MakeProject">
</run>
id="make"
name="%makeprojectowner.name"
point="org.eclipse.cdt.core.CProjectOwner">
<platform
architecture="*"
name="%genericmake.name"
id="*">
</platform>
<run
class="org.eclipse.cdt.internal.core.make.MakeProject">
</run>
</extension>
<extension
id="makeBuilder"
name="%makebuildmodel.name"
point="org.eclipse.cdt.core.CBuildModel">
<run
class="org.eclipse.cdt.internal.core.make.MakeBuilder">
</run>
</extension>
</plugin>

View file

@ -0,0 +1,24 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.core;
import org.eclipse.cdt.internal.core.InternalCExtension;
import org.eclipse.core.resources.IProject;
public abstract class AbstractCExtension extends InternalCExtension implements ICExtension {
/**
* Returns the project for which this extrension is defined.
*
* @return the project
*/
public final IProject getProject() {
return super.getProject();
}
public final ICExtensionReference getExtensionReference() {
return super.getExtensionReference();
}
}

View file

@ -9,10 +9,11 @@ import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.cdt.core.builder.ICBuilder;
import org.eclipse.cdt.core.index.IndexModel;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.internal.core.CProjectDescriptor;
import org.eclipse.cdt.internal.core.CDescriptorManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspace;
@ -34,13 +35,17 @@ import org.eclipse.core.runtime.SubProgressMonitor;
public class CCorePlugin extends Plugin {
public static final int STATUS_CDTPROJECT_EXISTS = 1;
public static final int STATUS_CDTPROJECT_MISMATCH = 2;
public static final String PLUGIN_ID= "org.eclipse.cdt.core";
public static final String BUILDER_ID= PLUGIN_ID + ".cbuilder";
public static final String BUILDER_MODEL_ID= PLUGIN_ID + ".CBuildModel";
private static CCorePlugin fgCPlugin;
private static ResourceBundle fgResourceBundle;
private CDescriptorManager fDescriptorManager;
// -------- static methods --------
static {
@ -101,6 +106,7 @@ public class CCorePlugin extends Plugin {
*/
public void shutdown() throws CoreException {
super.shutdown();
fDescriptorManager.shutdown();
}
/**
@ -113,31 +119,43 @@ public class CCorePlugin extends Plugin {
getCoreModel();
// Fired up the indexer. It should delay itself for 10 seconds
getIndexModel();
fDescriptorManager = new CDescriptorManager();
fDescriptorManager.startup();
}
public IConsole getConsole(String id) {
IConsole consoleDocument = null;
try {
IExtensionPoint extension = getDescriptor().getExtensionPoint("CBuildConsole");
if (extension != null) {
IExtension[] extensions = extension.getExtensions();
for(int i = 0; i < extensions.length; i++){
IConfigurationElement [] configElements = extensions[i].getConfigurationElements();
for( int j = 0; j < configElements.length; j++ ) {
String builderID = configElements[j].getAttribute("builderID");
if ( (id == null && builderID == null) ||
( id != null && builderID.equals(id))) {
return consoleDocument = (IConsole)configElements[j].createExecutableExtension("class");
}
}
}
}
} catch (CoreException e) {
}
return new IConsole() {
public void clear() {
}
public void start(IProject project) {
}
public ConsoleOutputStream getOutputStream() {
return new ConsoleOutputStream();
}
};
}
public IConsole getConsole() throws CoreException {
IConsole consoleDocument = null;
IExtensionPoint extension = getDescriptor().getExtensionPoint("CBuildConsole");
if (extension != null) {
IExtension[] extensions = extension.getExtensions();
for(int i = 0; i < extensions.length; i++){
IConfigurationElement [] configElements = extensions[i].getConfigurationElements();
consoleDocument = (IConsole)configElements[0].createExecutableExtension("class");
}
}
if ( consoleDocument == null ) {
return new IConsole() {
public void clear() {
}
public void start(IProject project) {
}
public ConsoleOutputStream getOutputStream() {
return new ConsoleOutputStream();
}
};
}
return consoleDocument;
return getConsole(null);
}
public CoreModel getCoreModel() {
@ -148,12 +166,12 @@ public class CCorePlugin extends Plugin {
return IndexModel.getDefault();
}
public ICProjectDescriptor getCProjectDescription(IProject project) throws CoreException {
return CProjectDescriptor.getDescription(project);
public ICDescriptor getCProjectDescription(IProject project) throws CoreException {
return fDescriptorManager.getDescriptor(project);
}
public void mapCProjectOwner(IProject project, String id) throws CoreException {
CProjectDescriptor.configure(project, id);
fDescriptorManager.configure(project, id);
}
/**
@ -295,4 +313,11 @@ public class CCorePlugin extends Plugin {
convertProjectFromCtoCC(projectHandle, monitor);
addDefaultCBuilder(projectHandle, monitor);
}
public ICBuilder[] getBuilders(IProject project) throws CoreException {
ICExtension extensions[] = fDescriptorManager.createExtensions(BUILDER_MODEL_ID, project);
ICBuilder builders[] = new ICBuilder[extensions.length];
System.arraycopy(extensions, 0, builders, 0, extensions.length);
return builders;
}
}

View file

@ -0,0 +1,16 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.core;
import org.eclipse.core.resources.IProject;
public interface ICDescriptor {
public ICOwnerInfo getProjectOwner();
public String getPlatform();
public IProject getProject();
public ICExtensionReference[] get(String name);
public ICExtensionReference create(String name, String id);
public void remove(ICExtensionReference extension);
}

View file

@ -0,0 +1,12 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.core;
import org.eclipse.core.resources.IProject;
public interface ICExtension {
public IProject getProject();
public ICExtensionReference getExtensionReference();
}

View file

@ -0,0 +1,12 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.core;
public interface ICExtensionReference {
public String getExtension();
public String getID();
public void setExtensionData(String key, String value);
public String getExtensionData(String key);
}

View file

@ -0,0 +1,10 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.core;
public interface ICOwner {
public void configure(ICDescriptor cproject);
public void update(ICDescriptor cproject);
}

View file

@ -4,7 +4,7 @@
*/
package org.eclipse.cdt.core;
public interface ICProjectOwnerInfo {
public interface ICOwnerInfo {
public String getID();
public String getName();
public String[] getPlatforms();

View file

@ -1,19 +0,0 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.core;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
public interface ICProjectDescriptor {
public static final String DESCRIPTION_FILE_NAME = ".cdtproject";
public ICProjectOwnerInfo getProjectOwner();
public String getPlatform();
public IProject getProject();
// public IBuilderInfo getBuilderInfo();
// public setBuilder(String id) or should this be add... ?
public void saveInfo() throws CoreException;
}

View file

@ -1,9 +0,0 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.core;
public interface ICProjectOwner {
public void configure(ICProjectDescriptor cproject);
}

View file

@ -0,0 +1,309 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.core;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
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;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.Serializer;
import org.apache.xml.serialize.SerializerFactory;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.ICOwnerInfo;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class CDescriptor implements ICDescriptor {
/* constants */
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private ICOwnerInfo fOwner;
private IProject fProject;
private String fPlatform = "*";
private HashMap extMap = new HashMap(4);
private HashMap extInfoMap = new HashMap(4);
private final String DESCRIPTION_FILE_NAME = ".cdtproject";
private final String PROJECT_DESCRIPTION = "cdtproject";
private final String PROJECT_PLATFORM = "platform";
private final String PROJECT_EXTENSION = "extension";
private final String PROJECT_EXTENSION_ATTRIBUTE = "attribute";
protected void readCDTProject(IPath projectLocation) {
FileInputStream file = null;
try {
file = new FileInputStream(projectLocation.toFile());
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(file);
Node node = document.getFirstChild();
if (node.getNodeName().equals(PROJECT_DESCRIPTION))
fOwner = readProjectDescription(node);
}
catch (IOException e) {
}
catch (SAXException e) {
}
catch (ParserConfigurationException e) {
}
finally {
if (file != null) {
try {
file.close();
}
catch (IOException e) {
}
}
}
}
protected CDescriptor(IProject project, String id) throws CoreException {
fProject = project;
IPath projectLocation = project.getDescription().getLocation();
final boolean isDefaultLocation = projectLocation == null;
if (isDefaultLocation) {
projectLocation = getProjectDefaultLocation(project);
}
IPath descriptionPath = projectLocation.append(DESCRIPTION_FILE_NAME);
if (descriptionPath.toFile().exists()) {
IStatus status;
readCDTProject(descriptionPath);
if ( fOwner.getID().equals(id)) {
status = new Status(IStatus.WARNING, CCorePlugin.getDefault().PLUGIN_ID, CCorePlugin.STATUS_CDTPROJECT_EXISTS, "CDTProject already exisits", (Throwable)null);
} else {
status = new Status(IStatus.ERROR, CCorePlugin.getDefault().PLUGIN_ID, CCorePlugin.STATUS_CDTPROJECT_MISMATCH, "CDTProject already exisits but does not match owner ID of creator", (Throwable)null);
}
throw new CoreException(status);
}
fOwner = new COwner(id);
}
protected CDescriptor(IProject project) throws CoreException {
fProject = project;
IPath projectLocation = project.getDescription().getLocation();
final boolean isDefaultLocation = projectLocation == null;
if (isDefaultLocation) {
projectLocation = getProjectDefaultLocation(project);
}
IPath descriptionPath = projectLocation.append(DESCRIPTION_FILE_NAME);
if (!descriptionPath.toFile().exists()) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.getDefault().PLUGIN_ID, -1, "CDTProject file not found", (Throwable)null);
throw new CoreException(status);
}
readCDTProject(descriptionPath);
}
protected IPath getProjectDefaultLocation(IProject project) {
return Platform.getLocation().append(project.getFullPath());
}
public ICOwnerInfo getProjectOwner() {
return fOwner;
}
public String getPlatform() {
return fPlatform;
}
public IProject getProject() {
return fProject;
}
public ICExtensionReference[] get(String name) {
return (CExtensionReference[]) extMap.get(name);
}
public ICExtensionReference create(String name, String id) {
CExtensionReference extensions[] = (CExtensionReference[]) extMap.get(name);
if ( extensions == null ) {
extensions = new CExtensionReference[1];
extMap.put(name, extensions);
} else {
CExtensionReference[] newExtensions = new CExtensionReference[extensions.length + 1];
System.arraycopy(extensions, 0, newExtensions, 0, extensions.length);
extensions = newExtensions;
extMap.put(name, extensions);
}
extensions[extensions.length-1] = new CExtensionReference(this, name, id);
return extensions[extensions.length-1];
}
public void remove(ICExtensionReference ext) {
CExtensionReference extensions[] = (CExtensionReference[]) extMap.get(ext.getExtension());
for( int i = 0; i < extensions.length; i++ ) {
if ( extensions[i] == ext ) {
System.arraycopy(extensions, i, extensions, i+1, extensions.length - 1 - i);
CExtensionReference[] newExtensions = new CExtensionReference[extensions.length - 1];
System.arraycopy(extensions, 0, newExtensions, 0, extensions.length);
extensions = newExtensions;
if ( extensions.length == 0 ) {
extMap.put(ext.getExtension(), null);
} else {
extMap.put(ext.getExtension(), extensions);
}
}
}
}
public CExtensionInfo getInfo(CExtensionReference cProjectExtension) {
CExtensionInfo info = (CExtensionInfo) extInfoMap.get(cProjectExtension);
if ( info == null ) {
info = new CExtensionInfo();
extInfoMap.put(cProjectExtension, info);
}
return info;
}
protected Node searchNode(Node target, String tagName) {
NodeList list = target.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if (list.item(i).getNodeName().equals(tagName))
return list.item(i);
}
return null;
}
protected String getString(Node target, String tagName) {
Node node = searchNode(target, tagName);
return node != null ? (node.getFirstChild() == null ? null : node.getFirstChild().getNodeValue()) : null;
}
private ICOwnerInfo readProjectDescription(Node node) {
ICOwnerInfo owner = null;
NamedNodeMap attrib = node.getAttributes();
try {
owner = new COwner(attrib.getNamedItem("id").getNodeValue());
}
catch (CoreException e) {
return null;
}
fPlatform = getString(node, PROJECT_PLATFORM);
if ( fPlatform == null )
fPlatform = "*";
readProjectExtensions(node);
return owner;
}
private void readProjectExtensions(Node node) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if ( list.item(i).getNodeName().equals(PROJECT_EXTENSION) ) {
NamedNodeMap attrib = list.item(i).getAttributes();
ICExtensionReference ext = create(attrib.getNamedItem("point").getNodeValue(), attrib.getNamedItem("id").getNodeValue());
NodeList extAttrib = list.item(i).getChildNodes();
for( int j = 0; j < extAttrib.getLength(); j++) {
if ( extAttrib.item(j).getNodeName().equals(PROJECT_EXTENSION_ATTRIBUTE) ) {
attrib = extAttrib.item(j).getAttributes();
ext.setExtensionData(attrib.getNamedItem("key").getNodeValue(), attrib.getNamedItem("value").getNodeValue());
}
}
}
}
}
protected void saveInfo() throws CoreException {
String xml;
if ( !isDirty() ) {
return;
}
try {
xml = getAsXML();
}
catch (IOException e) {
IStatus s= new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, e.getMessage(), e);
throw new CoreException(s);
}
IFile rscFile = getProject().getFile(DESCRIPTION_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);
}
}
private boolean isDirty() {
return true;
}
protected String serializeDocument(Document doc) throws IOException {
ByteArrayOutputStream s= new ByteArrayOutputStream();
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$
Serializer serializer =
SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(
new OutputStreamWriter(s, "UTF8"), //$NON-NLS-1$
format);
serializer.asDOMSerializer().serialize(doc);
return s.toString("UTF8"); //$NON-NLS-1$
}
protected String getAsXML() throws IOException {
Element element;
Document doc = new DocumentImpl();
Element configRootElement = doc.createElement(PROJECT_DESCRIPTION);
doc.appendChild(configRootElement);
configRootElement.setAttribute("id", fOwner.getID()); //$NON-NLS-1$
element= doc.createElement(PROJECT_PLATFORM);
element.appendChild(doc.createTextNode(fPlatform));
if ( element != null )
configRootElement.appendChild(element);
Iterator extIterator = extMap.values().iterator();
while( extIterator.hasNext() ) {
CExtensionReference extension[] = (CExtensionReference[]) extIterator.next();
for( int i = 0; i < extension.length; i ++ ) {
configRootElement.appendChild(element = doc.createElement(PROJECT_EXTENSION));
element.setAttribute("point", extension[i].getExtension());
element.setAttribute("id", extension[i].getID());
CExtensionInfo info = (CExtensionInfo) extInfoMap.get(extension[i]);
if ( info != null ) {
Iterator attribIterator = info.getAttributes().entrySet().iterator();
while( attribIterator.hasNext() ) {
Entry entry = (Entry) attribIterator.next();
Element extAttributes = doc.createElement(PROJECT_EXTENSION_ATTRIBUTE);
extAttributes.setAttribute("key", (String)entry.getKey());
extAttributes.setAttribute("value", (String)entry.getValue());
element.appendChild(extAttributes);
}
}
}
}
return serializeDocument(doc);
}
}

View file

@ -0,0 +1,128 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.core;
import java.util.ArrayList;
import java.util.HashMap;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICExtension;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IPluginRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
public class CDescriptorManager implements IResourceChangeListener {
private static HashMap fDescriptorMap;
private IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
public void shutdown() {
getWorkspace().removeResourceChangeListener(this);
}
public void startup() {
getWorkspace().addResourceChangeListener(this);
}
/**
* Traverses the delta looking for added/removed/changed launch
* configuration files.
*
* @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
if ( fDescriptorMap == null ) {
return;
}
IResource resource = event.getResource();
IResourceDelta delta = event.getDelta();
if ( event.getType() == IResourceChangeEvent.PRE_DELETE ) {
if(resource.getType() == IResource.PROJECT ) {
fDescriptorMap.remove(resource);
}
}
}
public synchronized ICDescriptor getDescriptor(IProject project) throws CoreException {
if ( fDescriptorMap == null ) {
fDescriptorMap = new HashMap();
}
CDescriptor cproject;
cproject = (CDescriptor)fDescriptorMap.get(project) ;
if ( cproject == null ) {
cproject = new CDescriptor(project);
fDescriptorMap.put(project, cproject);
}
return cproject;
}
public synchronized void configure(IProject project, String id) throws CoreException {
CDescriptor cproject;
if ( fDescriptorMap == null ) {
fDescriptorMap = new HashMap();
}
if ( fDescriptorMap.get(project) != null ) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.getDefault().PLUGIN_ID, CCorePlugin.STATUS_CDTPROJECT_EXISTS, "CDTProject already configured", (Throwable)null);
throw new CoreException(status);
}
try {
cproject = new CDescriptor(project, id);
}
catch (CoreException e) { // if .cdtproject already exists will use that
IStatus status = e.getStatus();
if ( status.getCode() == CCorePlugin.STATUS_CDTPROJECT_EXISTS ) {
cproject = new CDescriptor(project);
fDescriptorMap.put(project, cproject);
return;
}
else
throw e;
}
COwner cowner = new COwner(id);
cowner.configure(project, cproject);
cproject.saveInfo();
fDescriptorMap.put(project, cproject);
}
public ICExtension[] createExtensions(String extensionID, IProject project) throws CoreException {
ArrayList extensionList = new ArrayList(1);
ICDescriptor cDescriptor = getDescriptor(project);
ICExtensionReference ext[] = cDescriptor.get(extensionID);
IPluginRegistry pluginRegistry = Platform.getPluginRegistry();
for( int i = 0; i < ext.length; i++ ) {
IExtensionPoint extensionPoint = pluginRegistry.getExtensionPoint(ext[i].getExtension());
IExtension extension = extensionPoint.getExtension(ext[i].getID());
IConfigurationElement element[] = extension.getConfigurationElements();
for( int j = 0; j < element.length; j++ ) {
if ( element[j].getName().equalsIgnoreCase("run") ) {
InternalCExtension cExtension = (InternalCExtension) element[i].createExecutableExtension("class");
cExtension.setExtenionReference(ext[i]);
cExtension.setProject(project);
extensionList.add(cExtension);
break;
}
}
}
return (ICExtension[]) extensionList.toArray(new ICExtension[extensionList.size()]);
}
}

View file

@ -0,0 +1,24 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/package org.eclipse.cdt.internal.core;
import java.util.HashMap;
public class CExtensionInfo {
protected HashMap attribMap = new HashMap(4);
protected HashMap getAttributes() {
return attribMap;
}
public void setAttribute(String key, String value) {
attribMap.put(key, value);
}
public String getAttribute(String key) {
return (String) attribMap.get(key);
}
}

View file

@ -0,0 +1,40 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.core;
import org.eclipse.cdt.core.ICExtensionReference;
public class CExtensionReference implements ICExtensionReference {
private CDescriptor fDescriptor;
private String fName;
private String fId;
public CExtensionReference(CDescriptor descriptor, String name, String id) {
fDescriptor = descriptor;
fName = name;
fId = id;
}
public String getExtension() {
return fName;
}
public String getID() {
return fId;
}
private CExtensionInfo getInfo() {
return fDescriptor.getInfo(this);
}
public void setExtensionData(String key, String value) {
getInfo().setAttribute(key, value);
}
public String getExtensionData(String key) {
return getInfo().getAttribute(key);
}
}

View file

@ -7,9 +7,9 @@ package org.eclipse.cdt.internal.core;
import java.util.StringTokenizer;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICProjectDescriptor;
import org.eclipse.cdt.core.ICProjectOwner;
import org.eclipse.cdt.core.ICProjectOwnerInfo;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICOwner;
import org.eclipse.cdt.core.ICOwnerInfo;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
@ -18,15 +18,15 @@ import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
public class CProjectOwner implements ICProjectOwnerInfo {
String pluginId;
public class COwner implements ICOwnerInfo {
String ownerID;
IExtension extension;
public CProjectOwner(String id) throws CoreException {
pluginId = id;
public COwner(String id) throws CoreException {
ownerID = id;
IExtensionPoint extpoint = CCorePlugin.getDefault().getDescriptor().getExtensionPoint("CProjectOwner");
if (extpoint != null) {
extension = extpoint.getExtension(pluginId);
extension = extpoint.getExtension(ownerID);
} else {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.getDefault().PLUGIN_ID, -1, "Invalid CDTProject owner ID", (Throwable)null);
throw new CoreException(status);
@ -34,7 +34,7 @@ public class CProjectOwner implements ICProjectOwnerInfo {
}
public String getID() {
return pluginId;
return ownerID;
}
public String getName() {
@ -76,11 +76,11 @@ public class CProjectOwner implements ICProjectOwnerInfo {
return new String[0];
}
void configure(IProject project, ICProjectDescriptor cproject) throws CoreException {
void configure(IProject project, ICDescriptor cproject) throws CoreException {
IConfigurationElement element[] = extension.getConfigurationElements();
for( int i = 0; i < element.length; i++ ) {
if ( element[i].getName().equalsIgnoreCase("run") ) {
ICProjectOwner owner = (ICProjectOwner) element[i].createExecutableExtension("class");
ICOwner owner = (ICOwner) element[i].createExecutableExtension("class");
owner.configure(cproject);
return;
}
@ -88,4 +88,18 @@ public class CProjectOwner implements ICProjectOwnerInfo {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.getDefault().PLUGIN_ID, -1, "Invalid CDTProject owner extension", (Throwable)null);
throw new CoreException(status);
}
void update(IProject project, ICDescriptor cproject) throws CoreException {
IConfigurationElement element[] = extension.getConfigurationElements();
for( int i = 0; i < element.length; i++ ) {
if ( element[i].getName().equalsIgnoreCase("run") ) {
ICOwner owner = (ICOwner) element[i].createExecutableExtension("class");
owner.update(cproject);
return;
}
}
IStatus status = new Status(IStatus.ERROR, CCorePlugin.getDefault().PLUGIN_ID, -1, "Invalid CDTProject owner extension", (Throwable)null);
throw new CoreException(status);
}
}

View file

@ -1,270 +0,0 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.core;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
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;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.Serializer;
import org.apache.xml.serialize.SerializerFactory;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICProjectDescriptor;
import org.eclipse.cdt.core.ICProjectOwner;
import org.eclipse.cdt.core.ICProjectOwnerInfo;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class CProjectDescriptor implements ICProjectDescriptor {
/** constants */
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private ICProjectOwnerInfo fOwner;
private IProject fProject;
private String fPlatform = "*";
private static final String PROJECT_DESCRIPTION = "cdtproject";
private static final String PROJECT_PLATFORM = "platform";
private CProjectDescriptor(IProject project, String id) throws CoreException {
fProject = project;
fOwner = new CProjectOwner(id);
IPath projectLocation = project.getDescription().getLocation();
final boolean isDefaultLocation = projectLocation == null;
if (isDefaultLocation) {
projectLocation = getProjectDefaultLocation(project);
}
IPath descriptionPath = projectLocation.append(ICProjectDescriptor.DESCRIPTION_FILE_NAME);
if (descriptionPath.toFile().exists()) {
IStatus status = new Status(IStatus.WARNING, CCorePlugin.getDefault().PLUGIN_ID, CCorePlugin.STATUS_CDTPROJECT_EXISTS, "CDTProject already exisits", (Throwable)null);
throw new CoreException(status);
}
}
private CProjectDescriptor(IProject project) throws CoreException {
fProject = project;
FileInputStream file = null;
IPath projectLocation = project.getDescription().getLocation();
final boolean isDefaultLocation = projectLocation == null;
if (isDefaultLocation) {
projectLocation = getProjectDefaultLocation(project);
}
IPath descriptionPath = projectLocation.append(ICProjectDescriptor.DESCRIPTION_FILE_NAME);
if (!descriptionPath.toFile().exists()) {
IStatus status = new Status(IStatus.ERROR, CCorePlugin.getDefault().PLUGIN_ID, -1, "CDTProject file not found", (Throwable)null);
throw new CoreException(status);
}
try {
file = new FileInputStream(projectLocation.toFile());
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(file);
Node node = document.getFirstChild();
if (node.getNodeName().equals(PROJECT_DESCRIPTION))
fOwner = readProjectDescription(node);
}
catch (IOException e) {
}
catch (SAXException e) {
}
catch (ParserConfigurationException e) {
}
finally {
if (file != null) {
try {
file.close();
}
catch (IOException e) {
}
}
}
}
protected IPath getProjectDefaultLocation(IProject project) {
return Platform.getLocation().append(project.getFullPath());
}
public ICProjectOwnerInfo getProjectOwner() {
return fOwner;
}
public String getPlatform() {
return fPlatform;
}
protected String getString(Node target, String tagName) {
Node node = searchNode(target, tagName);
return node != null ? (node.getFirstChild() == null ? null : node.getFirstChild().getNodeValue()) : null;
}
protected String[] getStrings(Node target) {
if (target == null)
return null;
NodeList list = target.getChildNodes();
if (list.getLength() == 0)
return EMPTY_STRING_ARRAY;
List result = new ArrayList(list.getLength());
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE)
result.add((String) read(node.getChildNodes().item(0)));
}
return (String[]) result.toArray(new String[result.size()]);
}
protected Object read(Node node) {
if (node == null)
return null;
switch (node.getNodeType()) {
case Node.ELEMENT_NODE :
/*
if (node.getNodeName().equals(BUILDER))
return readBuildSpec(node);
if (node.getNodeName().equals(DEBUGGER)
return readProjectDescription(node);
*/
case Node.TEXT_NODE :
String value = node.getNodeValue();
return value == null ? null : value.trim();
default :
return node.toString();
}
}
private ICProjectOwnerInfo readProjectDescription(Node node) {
ICProjectOwnerInfo owner = null;
NamedNodeMap attrib = node.getAttributes();
try {
owner = new CProjectOwner(attrib.getNamedItem("id").getNodeValue());
}
catch (CoreException e) {
return null;
}
fPlatform = getString(node, PROJECT_PLATFORM);
return owner;
}
protected Node searchNode(Node target, String tagName) {
NodeList list = target.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
if (list.item(i).getNodeName().equals(tagName))
return list.item(i);
}
return null;
}
public IProject getProject() {
return fProject;
}
public void saveInfo() throws CoreException {
String xml;
try {
xml = getAsXML();
}
catch (IOException e) {
IStatus s= new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, -1, e.getMessage(), e);
throw new CoreException(s);
}
IFile rscFile = getProject().getFile(ICProjectDescriptor.DESCRIPTION_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);
}
}
protected String serializeDocument(Document doc) throws IOException {
ByteArrayOutputStream s= new ByteArrayOutputStream();
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$
Serializer serializer =
SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(
new OutputStreamWriter(s, "UTF8"), //$NON-NLS-1$
format);
serializer.asDOMSerializer().serialize(doc);
return s.toString("UTF8"); //$NON-NLS-1$
}
protected String getAsXML() throws IOException {
Element element;
Document doc = new DocumentImpl();
Element configRootElement = doc.createElement(PROJECT_DESCRIPTION);
doc.appendChild(configRootElement);
configRootElement.setAttribute("id", fOwner.getID()); //$NON-NLS-1$
element= createBuilderElement(doc);
if ( element != null )
configRootElement.appendChild(element);
return serializeDocument(doc);
}
protected Element createBuilderElement(Document doc) {
/*
if ( builderID != null ) {
Element element = doc.createElement("cdtBuilder");
element.setAttribute("id", builderID);
return element;
}
*/
return null;
}
public static synchronized ICProjectDescriptor getDescription(IProject project) throws CoreException {
return new CProjectDescriptor(project);
}
public static synchronized void configure(IProject project, String id) throws CoreException {
CProjectDescriptor cproject;
try {
cproject = new CProjectDescriptor(project, id);
}
catch (CoreException e) { // if .cdtproject already exists will use that
IStatus status = e.getStatus();
if ( status.getCode() == CCorePlugin.STATUS_CDTPROJECT_EXISTS )
return;
else
throw e;
}
CProjectOwner cowner = new CProjectOwner(id);
cowner.configure(project, cproject);
cproject.saveInfo();
}
}

View file

@ -1,233 +0,0 @@
package org.eclipse.cdt.internal.core;
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
import java.io.File;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Properties;
import java.util.ArrayList;
import java.util.Enumeration;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.cdt.utils.spawner.EnvironmentReader;
import org.eclipse.cdt.utils.spawner.ProcessFactory;
public class CommonMkInfo {
public final static String COMMON_MK = "common.mk";
IPath dir;
long modification;
IPath[] includePaths = new IPath[0];
IPath[] libs = new IPath[0];
IPath[] libPaths = new IPath[0];
public CommonMkInfo(IPath dir) {
this.dir = dir;
modification = 0;
}
public CommonMkInfo () {
dir = new Path("");
String def = EnvironmentReader.getEnvVar("QNX_TARGET");
if (def != null) {
IPath defaultPath = new Path(def);
includePaths = new IPath[] {defaultPath.append("/usr/include")};
libPaths = new IPath[] {defaultPath.append("/usr/lib"),
defaultPath.append("/x86/usr/lib")};
}
libs = new IPath[] {new Path("libc.so")};
}
public IPath[] getIncludePaths() {
parse();
return includePaths;
}
public IPath[] getLibs() {
boolean hasLibC = false;
parse();
for (int i = 0; i < libs.length; i++) {
String name = libs[i].toOSString();
if (!(name.indexOf(IPath.SEPARATOR) != -1
|| name.indexOf(IPath.DEVICE_SEPARATOR) != -1
|| name.indexOf('.') != -1)) {
if (!name.startsWith("lib")) {
libs[i] = new Path("lib" + name + ".so");
}
}
if (libs[i].toOSString().equals("libc.so"))
hasLibC = true;
}
if (!hasLibC) {
IPath[] newlibs = new IPath[libs.length + 1];
int i = 0;;
for (; i < libs.length; i++) {
newlibs[i] = libs[i];
}
newlibs[i] = new Path("libc.so");
libs = newlibs;
}
return libs;
}
public IPath[] getLibPaths() {
parse();
return libPaths;
}
public boolean hasChanged() {
File prj = new File(dir.toOSString());
File common = new File(prj, COMMON_MK);
if (!prj.exists() || prj.isFile() || !common.exists())
return false;
long modif = common.lastModified();
return (modif > modification);
}
void parse() {
File makefile = null;
try {
if (hasChanged()) {
File prj = new File(dir.toOSString());
File common = new File(prj, COMMON_MK);
modification = common.lastModified();
makefile = File.createTempFile("QMakefile", null, prj);
OutputStream fout = new FileOutputStream(makefile);
DataOutputStream out = new DataOutputStream(fout);
out.writeBytes("LIST=OS CPU VARIANT\n");
out.writeBytes("include common.mk\n");
out.writeBytes("\n");
out.writeBytes("LIBS:\n");
out.writeBytes("\t@echo $(LIBS)\n");
out.writeBytes("\n");
out.writeBytes("INCVPATH:\n");
out.writeBytes("\t@echo $(INCVPATH)\n");
out.writeBytes("\n");
out.writeBytes("SRCVPATH:\n");
out.writeBytes("\t@echo $(SRCVPATH)\n");
out.writeBytes("\n");
out.writeBytes("LIBVPATH:\n");
out.writeBytes("\t@echo $(LIBVPATH)\n");
out.writeBytes("\n");
out.flush();
out.close();
// FIXME: Use the proper os and CPU
Properties envp = EnvironmentReader.getEnvVars();
envp.setProperty("OS", "nto");
envp.setProperty("CPU", "x86");
IPath[] incVPath = spawn("INCVPATH", envp, makefile, prj);
parseIncVPath(incVPath);
IPath[] libNames = spawn("LIBS", envp, makefile, prj);
parseLibs(libNames);
IPath[] libVPath = spawn("LIBVPATH", envp, makefile, prj);
parseLibVPath(libVPath);
}
} catch (IllegalArgumentException e) {
} catch (IOException e) {
} finally {
try {
if (makefile != null)
makefile.delete();
} catch (SecurityException e) {
}
}
}
IPath[] spawn (String target, Properties envp, File makefile, File dir) {
// FIXME: Use the proper MakeCommand from the builder.
String[] args = new String[] {"make", "-f", makefile.getName(), target};
BufferedReader stdout = null;
Process make = null;
StringBuffer buffer = new StringBuffer();
try {
ArrayList envList = new ArrayList();
// Turn the environment Property to an Array.
Enumeration names = envp.propertyNames();
if (names != null) {
while (names.hasMoreElements()) {
String key = (String) names.nextElement();
envList.add(key + "=" + envp.getProperty(key));
}
}
String[] env = (String[]) envList.toArray(new String[envList.size()]);
make = ProcessFactory.getFactory().exec(args, env, dir);
stdout = new BufferedReader(new InputStreamReader(make.getInputStream()));
String s;
while ((s = stdout.readLine ()) != null) {
buffer.append(s);
}
stdout.close();
} catch (SecurityException e) {
} catch (IndexOutOfBoundsException e) {
} catch (NullPointerException e) {
} catch (IOException e) {
} finally {
if (make != null) {
make.destroy();
}
}
// FIXME: This not quite right some of the include may contains
// things like double quotes with spaces.
StringTokenizer st = new StringTokenizer(buffer.toString());
IPath[] p = new IPath[st.countTokens()];
for(int i = 0; st.hasMoreTokens(); i++) {
p[i] = new Path((String)st.nextToken());
}
return p;
}
void parseLibVPath(IPath[] array) {
ArrayList list = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
if (array[i].toString().charAt(0) != '-') {
list.add (array[i]);
}
}
libPaths = (IPath[])list.toArray(new IPath[list.size()]);
}
void parseIncVPath(IPath[] array){
ArrayList list = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
if (array[i].toString().charAt(0) != '-') {
list.add (array[i]);
}
}
includePaths = (IPath[])list.toArray(new IPath[list.size()]);
}
void parseLibs(IPath[] array){
ArrayList list = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
if (array[i].toString().charAt(0) != '-') {
list.add (array[i]);
}
}
libs = (IPath[])list.toArray(new IPath[list.size()]);
}
}

View file

@ -0,0 +1,30 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.core;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.core.resources.IProject;
public abstract class InternalCExtension {
private IProject project;
private ICExtensionReference extensionRef;
void setProject(IProject project) {
this.project = project;
}
void setExtenionReference(ICExtensionReference extReference) {
extensionRef = extReference;
}
protected IProject getProject() {
return project;
}
protected ICExtensionReference getExtensionReference() {
return extensionRef;
}
}

View file

@ -0,0 +1,56 @@
/*
* (c) Copyright QNX Software System Ltd. 2002.
* All Rights Reserved.
*/
package org.eclipse.cdt.internal.core.make;
import org.eclipse.cdt.core.AbstractCExtension;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.builder.CIncrementalBuilder;
import org.eclipse.cdt.core.builder.ICBuilder;
import org.eclipse.cdt.core.builder.IOptimization;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
public class MakeBuilder extends AbstractCExtension implements ICBuilder {
public IPath[] getIncludePaths() {
return new IPath[0];
}
public void setIncludePaths(IPath[] incPaths) {
}
public IPath[] getLibraryPaths() {
return new IPath[0];
}
public void setLibraryPaths(IPath[] libPaths) {
}
public String[] getLibraries() {
return new String[0];
}
public void setLibraries(String[] libs) {
}
public IOptimization getOptimization() {
return null;
}
public void setOptimization() {
}
public IProject[] build(CIncrementalBuilder cbuilder) {
ICExtensionReference ref = getExtensionReference();
System.out.println("MakeBuilder!!!!\n Command is:" + ref.getExtensionData("command"));
return null;
}
public String getID() {
return CCorePlugin.getDefault().PLUGIN_ID + ".makeBuilder";
}
}

View file

@ -4,12 +4,18 @@
*/
package org.eclipse.cdt.internal.core.make;
import org.eclipse.cdt.core.ICProjectDescriptor;
import org.eclipse.cdt.core.ICProjectOwner;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.ICOwner;
public class MakeProject implements ICProjectOwner {
public class MakeProject implements ICOwner {
public void configure(ICProjectDescriptor cproject) {
public void configure(ICDescriptor cproject) {
ICExtensionReference ext = cproject.create(CCorePlugin.BUILDER_MODEL_ID, CCorePlugin.getDefault().PLUGIN_ID + ".makeBuilder");
ext.setExtensionData("command", "make");
}
public void update(ICDescriptor cproject) {
}
}