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:
parent
b128851cc3
commit
cb8243d3ef
22 changed files with 796 additions and 592 deletions
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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();
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
*/
|
||||
package org.eclipse.cdt.core;
|
||||
|
||||
public interface ICProjectOwnerInfo {
|
||||
public interface ICOwnerInfo {
|
||||
public String getID();
|
||||
public String getName();
|
||||
public String[] getPlatforms();
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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()]);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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()]);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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) {
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue