1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-18 13:45:45 +02:00

finish up target manager/target

This commit is contained in:
David Inglis 2003-08-20 20:55:27 +00:00
parent 1f7bb3b6ab
commit fa4ec73cb8
6 changed files with 224 additions and 117 deletions

View file

@ -19,8 +19,6 @@ public interface IMakeTarget {
String getName();
String getTargetBuilderID();
String getBuilderID();
boolean isStopOnError();
void setStopOnError(boolean stopOnError);

View file

@ -14,7 +14,7 @@ import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
public interface IMakeTargetProvider {
public interface IMakeTargetManager {
IMakeTarget addTarget(IContainer container, String targetBuilderID, String targetName) throws CoreException;
void removeTarget(IMakeTarget target) throws CoreException;
void renameTarget(IMakeTarget target, String name) throws CoreException;
@ -22,6 +22,8 @@ public interface IMakeTargetProvider {
IMakeTarget[] getTargets(IContainer container) throws CoreException;
IProject[] getTargetBuilderProjects() throws CoreException;
String getBuilderID(String targetBuilderID);
void addListener(IMakeTargetListener listener);
void removeListener(IMakeTargetListener listener);
}

View file

@ -10,6 +10,7 @@
***********************************************************************/
package org.eclipse.cdt.make.core;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.Map;
import java.util.MissingResourceException;
@ -17,19 +18,22 @@ import java.util.ResourceBundle;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.make.internal.core.BuildInfoFactory;
import org.eclipse.cdt.make.internal.core.MakeTargetProvider;
import org.eclipse.cdt.make.internal.core.MakeTargetManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.Status;
/**
* The main plugin class to be used in the desktop.
*/
public class MakeCorePlugin extends Plugin {
private IMakeTargetProvider fTargetProvider;
private MakeTargetManager fTargetManager;
public static final String OLD_BUILDER_ID = "org.eclipse.cdt.core.cbuilder"; //$NON-NLS-1$
//The shared instance.
private static MakeCorePlugin plugin;
@ -56,6 +60,21 @@ public class MakeCorePlugin extends Plugin {
return plugin;
}
public static void log(Throwable e) {
if (e instanceof InvocationTargetException)
e = ((InvocationTargetException) e).getTargetException();
IStatus status = null;
if (e instanceof CoreException)
status = ((CoreException) e).getStatus();
else
status = new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.OK, e.getMessage(), e);
log(status);
}
public static void log(IStatus status) {
ResourcesPlugin.getPlugin().getLog().log(status);
}
/**
* Returns the string from the plugin's resource bundle,
* or 'key' if not found.
@ -120,10 +139,18 @@ public class MakeCorePlugin extends Plugin {
return BuildInfoFactory.create(args, builderID);
}
public IMakeTargetProvider getTargetProvider() {
if ( fTargetProvider == null) {
fTargetProvider = new MakeTargetProvider();
public IMakeTargetManager getTargetProvider() {
if ( fTargetManager == null) {
fTargetManager = new MakeTargetManager();
fTargetManager.startup();
}
return fTargetManager;
}
public void shutdown() throws CoreException {
super.shutdown();
if ( fTargetManager != null) {
fTargetManager.shutdown();
fTargetManager = null;
}
return fTargetProvider;
}
}

View file

@ -8,94 +8,93 @@
***********************************************************************/
package org.eclipse.cdt.make.internal.core;
import java.util.HashMap;
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.IMakeTarget;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
public class MakeTarget implements IMakeTarget {
private boolean bDirty;
private String buildArguments;
private IPath buildCommand;
private boolean isDefaultBuildCmd;
private boolean isStopOnError;
private String name;
private String targetBuilderID;
private IContainer container;
MakeTarget(IContainer container, String targetBuilderID, String targetName) {
// dinglis-TODO Auto-generated constructor stub
MakeTarget(IContainer container, String targetBuilderID, String name) {
this.container = container;
this.targetBuilderID = targetBuilderID;
this.name = name;
}
void setName(String name) {
// dinglis-TODO Auto-generated method stub
}
void setContainer(IContainer container) {
// dinglis-TODO Auto-generated method stub
this.name = name;
}
public String getName() {
// dinglis-TODO Auto-generated method stub
return null;
return name;
}
public String getTargetBuilderID() {
// dinglis-TODO Auto-generated method stub
return null;
}
public String getBuilderID() {
// dinglis-TODO Auto-generated method stub
return null;
return targetBuilderID;
}
public boolean isStopOnError() {
// dinglis-TODO Auto-generated method stub
return false;
return isStopOnError;
}
public void setStopOnError(boolean stopOnError) {
// dinglis-TODO Auto-generated method stub
isStopOnError = stopOnError;
}
public boolean isDefaultBuildCmd() {
// dinglis-TODO Auto-generated method stub
return false;
return isDefaultBuildCmd;
}
public void setUseDefaultBuildCmd(boolean useDefault) {
// dinglis-TODO Auto-generated method stub
isDefaultBuildCmd = useDefault;
}
public IPath getBuildCommand() {
// dinglis-TODO Auto-generated method stub
return null;
return buildCommand;
}
public void setBuildCommand(IPath command) {
// dinglis-TODO Auto-generated method stub
buildCommand = command;
}
public String getBuildArguments() {
// dinglis-TODO Auto-generated method stub
return null;
return buildArguments;
}
public void setBuildArguments(String arguments) {
// dinglis-TODO Auto-generated method stub
buildArguments = arguments;
}
public IContainer getContainer() {
// dinglis-TODO Auto-generated method stub
return null;
return container;
}
public void build(IProgressMonitor monitor) throws CoreException {
// dinglis-TODO Auto-generated method stub
}
public boolean isDirty() {
return bDirty;
IProject project = container.getProject();
String builderID = MakeCorePlugin.getDefault().getTargetProvider().getBuilderID(targetBuilderID);
HashMap infoMap = new HashMap();
IMakeBuilderInfo info = MakeCorePlugin.createBuildInfo(infoMap, builderID);
info.setBuildArguments(buildArguments);
info.setBuildCommand(buildCommand);
info.setUseDefaultBuildCmd(isDefaultBuildCmd);
info.setStopOnError(isStopOnError);
info.setFullBuildEnable(true);
info.setFullBuildTarget(buildArguments);
project.build(IncrementalProjectBuilder.FULL_BUILD, builderID, infoMap, monitor);
}
}

View file

@ -11,21 +11,27 @@
package org.eclipse.cdt.make.internal.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Vector;
import org.eclipse.cdt.make.core.IMakeTarget;
import org.eclipse.cdt.make.core.IMakeTargetListener;
import org.eclipse.cdt.make.core.IMakeTargetProvider;
import org.eclipse.cdt.make.core.IMakeTargetManager;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.MakeTargetEvent;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
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.IResourceDeltaVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
@ -36,56 +42,59 @@ import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeListener {
private static String TARGET_BUILD_EXT = MakeCorePlugin.getUniqueIdentifier() + ".MakeTargetBuilder"; //$NON-NLS-1$
public class MakeTargetManager implements IMakeTargetManager, IResourceChangeListener {
private static String TARGET_BUILD_EXT = "MakeTargetBuilder"; //$NON-NLS-1$
private ListenerList listeners = new ListenerList();
private HashMap projectMap = new HashMap();
private HashMap builderMap;
private Vector fProjects = new Vector();
public MakeTargetProvider() {
public MakeTargetManager() {
}
public IMakeTarget addTarget(IContainer container, String targetBuilderID, String targetName) throws CoreException {
if (container instanceof IWorkspaceRoot) {
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetProvider.add_to_workspace_root"), null)); //$NON-NLS-1$
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetManager.add_to_workspace_root"), null)); //$NON-NLS-1$
}
ProjectTargets projectTargets = (ProjectTargets)projectMap.get(container.getProject());
ProjectTargets projectTargets = (ProjectTargets) projectMap.get(container.getProject());
if (projectTargets == null) {
projectTargets = readTargets(container.getProject());
}
MakeTarget target = new MakeTarget(container, targetBuilderID, targetName);
projectTargets.add(target);
writeTargets(projectTargets);
notifyListeners(new MakeTargetEvent(this, MakeTargetEvent.TARGET_ADD, target));
return target;
}
public void removeTarget(IMakeTarget target) throws CoreException {
IProject project = target.getContainer().getProject();
ProjectTargets projectTargets = (ProjectTargets)projectMap.get(project);
ProjectTargets projectTargets = (ProjectTargets) projectMap.get(project);
if (projectTargets == null) {
projectTargets = readTargets(project);
}
projectTargets.remove(target);
writeTargets(projectTargets);
notifyListeners(new MakeTargetEvent(this, MakeTargetEvent.TARGET_REMOVED, target));
}
public void renameTarget(IMakeTarget target, String name) throws CoreException {
IProject project = target.getContainer().getProject();
ProjectTargets projectTargets = (ProjectTargets)projectMap.get(project);
ProjectTargets projectTargets = (ProjectTargets) projectMap.get(project);
if (projectTargets == null) {
projectTargets = readTargets(project);
}
if (!projectTargets.contains((MakeTarget)target)) {
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetProvider.target_exists"), null)); //$NON-NLS-1$
if (!projectTargets.contains((MakeTarget) target)) {
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetManager.target_exists"), null)); //$NON-NLS-1$
}
((MakeTarget)target).setName(name);
projectTargets.setDirty();
((MakeTarget) target).setName(name);
writeTargets(projectTargets);
notifyListeners(new MakeTargetEvent(this, MakeTargetEvent.TARGET_CHANGED, target));
}
public IMakeTarget[] getTargets(IContainer container) throws CoreException {
ProjectTargets projectTargets = (ProjectTargets)projectMap.get(container.getProject());
ProjectTargets projectTargets = (ProjectTargets) projectMap.get(container.getProject());
if (projectTargets == null) {
projectTargets = readTargets(container.getProject());
}
@ -93,23 +102,32 @@ public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeL
}
public IProject[] getTargetBuilderProjects() throws CoreException {
Vector tProj = new Vector();
IProject project[] = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for (int i = 0; i < project.length; i++) {
IProjectDescription description = project[i].getDescription();
ICommand builder[] = description.getBuildSpec();
for (int j = 0; j < builder.length; j++) {
if (builderMap.containsValue(builder[j].getBuilderName())) {
tProj.add(project[i]);
break;
}
return (IProject[]) fProjects.toArray(new IProject[fProjects.size()]);
}
protected boolean hasTargetBuilder(IProject project) throws CoreException {
IProjectDescription description = project.getDescription();
ICommand builder[] = description.getBuildSpec();
for (int j = 0; j < builder.length; j++) {
if (builderMap.containsValue(builder[j].getBuilderName())) {
return true;
}
}
return (IProject[])tProj.toArray(new IProject[tProj.size()]);
return false;
}
public void startup() {
initializeBuilders();
IProject project[] = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for (int i = 0; i < project.length; i++) {
try {
if (hasTargetBuilder(project[i])) {
fProjects.add(project[i]);
break;
}
} catch (CoreException e) {
}
}
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
}
@ -118,17 +136,86 @@ public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeL
}
public void resourceChanged(IResourceChangeEvent event) {
// dinglis-TODO listen for project that add/remove a target type builder
IResourceDelta delta = event.getDelta();
if (delta != null) {
try {
delta.accept(new MakeTargetVisitor());
} catch (CoreException e) {
MakeCorePlugin.log(e);
}
}
}
protected void writeTargets(ProjectTargets projectTargets) {
class MakeTargetVisitor implements IResourceDeltaVisitor {
/**
* @see IResourceDeltaVisitor#visit(IResourceDelta)
*/
public boolean visit(IResourceDelta delta) {
if (delta == null) {
return false;
}
IResource resource = delta.getResource();
if (resource.getType() == IResource.PROJECT) {
IProject project = (IProject) resource;
int flags = delta.getFlags();
int deltaKind = delta.getKind();
if (deltaKind == IResourceDelta.ADDED) {
try {
if (hasTargetBuilder(project)) {
fProjects.add(project);
notifyListeners(new MakeTargetEvent(MakeTargetManager.this, MakeTargetEvent.PROJECT_ADDED, project));
}
} catch (CoreException e) {
}
} else if (deltaKind == IResourceDelta.REMOVED) {
if (fProjects.contains(project)) {
fProjects.remove(project);
notifyListeners(new MakeTargetEvent(MakeTargetManager.this, MakeTargetEvent.PROJECT_REMOVED, project));
}
} else if (deltaKind == IResourceDelta.CHANGED) {
try {
if (0 != (flags & IResourceDelta.DESCRIPTION)) {
if (fProjects.contains(project) && !hasTargetBuilder(project)) {
fProjects.remove(project);
notifyListeners(
new MakeTargetEvent(MakeTargetManager.this, MakeTargetEvent.PROJECT_REMOVED, project));
} else if (!fProjects.contains(project) && hasTargetBuilder(project)) {
fProjects.add(project);
notifyListeners(
new MakeTargetEvent(MakeTargetManager.this, MakeTargetEvent.PROJECT_ADDED, project));
}
}
if (0 != (flags & IResourceDelta.OPEN)) {
if (!project.isOpen() && fProjects.contains(project)) {
fProjects.remove(project);
notifyListeners(
new MakeTargetEvent(MakeTargetManager.this, MakeTargetEvent.PROJECT_REMOVED, project));
} else if (project.isOpen() && hasTargetBuilder(project) && !fProjects.contains(project)) {
fProjects.add(project);
notifyListeners(
new MakeTargetEvent(MakeTargetManager.this, MakeTargetEvent.PROJECT_ADDED, project));
}
}
} catch (CoreException e) {
}
}
return false;
}
return resource instanceof IWorkspaceRoot;
}
}
protected void writeTargets(ProjectTargets projectTargets) throws CoreException {
IPath targetFilePath = MakeCorePlugin.getDefault().getStateLocation().append(projectTargets.getProject().getName());
File targetFile = targetFilePath.toFile();
try {
FileOutputStream file = new FileOutputStream(targetFile);
} catch (Exception e) {
projectTargets.saveTargets(file);
} catch (IOException e) {
throw new CoreException(
new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, "Error writing target file", e));
}
}
protected ProjectTargets readTargets(IProject project) throws CoreException {
@ -136,8 +223,10 @@ public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeL
File targetFile = targetFilePath.toFile();
if (targetFile.exists()) {
try {
return new ProjectTargets(project, targetFile);
} catch (Exception e) {
return new ProjectTargets(project, new FileInputStream(targetFile));
} catch (FileNotFoundException e) {
throw new CoreException(
new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, "Error reading target file", e));
}
}
return new ProjectTargets(project);
@ -145,8 +234,7 @@ public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeL
protected void initializeBuilders() {
builderMap = new HashMap();
IExtensionPoint point = MakeCorePlugin.getDefault().getDescriptor().getExtensionPoint(MakeTargetProvider.TARGET_BUILD_EXT);
IExtensionPoint point = MakeCorePlugin.getDefault().getDescriptor().getExtensionPoint(MakeTargetManager.TARGET_BUILD_EXT);
IExtension[] ext = point.getExtensions();
for (int i = 0; i < ext.length; i++) {
IConfigurationElement[] element = ext[i].getConfigurationElements();
@ -163,7 +251,7 @@ public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeL
protected void notifyListeners(MakeTargetEvent event) {
Object[] list = listeners.getListeners();
for (int i = 0; i < list.length; i++) {
((IMakeTargetListener)list[i]).targetChanged(event);
((IMakeTargetListener) list[i]).targetChanged(event);
}
}
@ -174,4 +262,8 @@ public class MakeTargetProvider implements IMakeTargetProvider, IResourceChangeL
public void removeListener(IMakeTargetListener listener) {
listeners.remove(listeners);
}
public String getBuilderID(String targetBuilderID) {
return (String) builderMap.get(targetBuilderID);
}
}

View file

@ -1,9 +1,8 @@
package org.eclipse.cdt.make.internal.core;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
@ -34,7 +33,6 @@ public class ProjectTargets {
private static String BUILD_TARGET_ELEMENT = "buildTargets"; //$NON-NLS-1$
private static String TARGET_ELEMENT = "target"; //$NON-NLS-1$
private boolean isDirty;
private HashMap targetMap = new HashMap();
private IProject project;
@ -42,14 +40,14 @@ public class ProjectTargets {
this.project = project;
}
public ProjectTargets(IProject project, File targetFile) throws CoreException {
public ProjectTargets(IProject project, InputStream input) throws CoreException {
Document document = null;
try {
FileInputStream file = new FileInputStream(targetFile);
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = parser.parse(file);
document = parser.parse(input);
} catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, "Error reading target file", e));
throw new CoreException(
new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, "Error reading target file", e));
}
Node node = document.getFirstChild();
if (node.getNodeName().equals(BUILD_TARGET_ELEMENT)) {
@ -103,17 +101,17 @@ public class ProjectTargets {
}
public IMakeTarget[] get(IContainer container) {
ArrayList list = (ArrayList)targetMap.get(container);
ArrayList list = (ArrayList) targetMap.get(container);
if (list != null) {
return (IMakeTarget[])list.toArray(new IMakeTarget[list.size()]);
return (IMakeTarget[]) list.toArray(new IMakeTarget[list.size()]);
}
return new IMakeTarget[0];
}
public void add(MakeTarget target) throws CoreException {
ArrayList list = (ArrayList)targetMap.get(target.getContainer());
ArrayList list = (ArrayList) targetMap.get(target.getContainer());
if (list != null && list.contains(target)) {
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetProvider.target_exists"), null)); //$NON-NLS-1$
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1, MakeCorePlugin.getResourceString("MakeTargetManager.target_exists"), null)); //$NON-NLS-1$
}
if (list == null) {
list = new ArrayList();
@ -123,7 +121,7 @@ public class ProjectTargets {
}
public boolean contains(MakeTarget target) {
ArrayList list = (ArrayList)targetMap.get(target.getContainer());
ArrayList list = (ArrayList) targetMap.get(target.getContainer());
if (list != null && list.contains(target)) {
return true;
}
@ -131,7 +129,7 @@ public class ProjectTargets {
}
public void remove(IMakeTarget target) {
ArrayList list = (ArrayList)targetMap.get(target.getContainer());
ArrayList list = (ArrayList) targetMap.get(target.getContainer());
if (list != null && !list.contains(target)) {
return;
}
@ -141,35 +139,26 @@ public class ProjectTargets {
}
}
public void setDirty() {
isDirty = true;
}
public boolean isDirty() {
return isDirty;
}
public IProject getProject() {
return project;
}
protected String getAsXML() throws IOException {
protected Document getAsXML() throws IOException {
Document doc = new DocumentImpl();
Element configRootElement = doc.createElement(BUILD_TARGET_ELEMENT);
doc.appendChild(configRootElement);
return serializeDocument(doc);
return doc;
}
protected String serializeDocument(Document doc) throws IOException {
ByteArrayOutputStream s = new ByteArrayOutputStream();
public void saveTargets(OutputStream output) throws IOException {
Document doc = getAsXML();
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setPreserveSpace(true);
format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$
Serializer serializer =
SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(new OutputStreamWriter(s, "UTF8"), format);
SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(new OutputStreamWriter(output, "UTF8"), format);
serializer.asDOMSerializer().serialize(doc);
return s.toString("UTF8"); //$NON-NLS-1$
}
}