1 package net.mograsim.plugin.nature;
5 import javax.xml.parsers.ParserConfigurationException;
6 import javax.xml.parsers.SAXParser;
7 import javax.xml.parsers.SAXParserFactory;
9 import org.eclipse.core.resources.IFile;
10 import org.eclipse.core.resources.IMarker;
11 import org.eclipse.core.resources.IProject;
12 import org.eclipse.core.resources.IResource;
13 import org.eclipse.core.resources.IResourceDelta;
14 import org.eclipse.core.resources.IResourceDeltaVisitor;
15 import org.eclipse.core.resources.IResourceVisitor;
16 import org.eclipse.core.resources.IncrementalProjectBuilder;
17 import org.eclipse.core.runtime.CoreException;
18 import org.eclipse.core.runtime.IProgressMonitor;
19 import org.xml.sax.SAXException;
20 import org.xml.sax.SAXParseException;
21 import org.xml.sax.helpers.DefaultHandler;
23 public class MograsimBuilder extends IncrementalProjectBuilder
25 private MachineContext machineContext;
27 class SampleDeltaVisitor implements IResourceDeltaVisitor
30 public boolean visit(IResourceDelta delta) throws CoreException
32 IResource resource = delta.getResource();
33 switch (delta.getKind())
35 case IResourceDelta.ADDED:
36 // handle added resource
39 case IResourceDelta.REMOVED:
40 // handle removed resource
42 case IResourceDelta.CHANGED:
43 // handle changed resource
47 // return true to continue visiting children.
52 class SampleResourceVisitor implements IResourceVisitor
55 public boolean visit(IResource resource)
58 // return true to continue visiting children.
63 class XMLErrorHandler extends DefaultHandler
68 public XMLErrorHandler(IFile file)
73 private void addMarker(SAXParseException e, int severity)
75 MograsimBuilder.this.addMarker(file, e.getMessage(), e.getLineNumber(), severity);
79 public void error(SAXParseException exception) throws SAXException
81 addMarker(exception, IMarker.SEVERITY_ERROR);
85 public void fatalError(SAXParseException exception) throws SAXException
87 addMarker(exception, IMarker.SEVERITY_ERROR);
91 public void warning(SAXParseException exception) throws SAXException
93 addMarker(exception, IMarker.SEVERITY_WARNING);
97 public static final String BUILDER_ID = "net.mograsim.plugin.core.mograsimBuilder";
99 private static final String MARKER_TYPE = "net.mograsim.plugin.core.asmProblem";
101 private SAXParserFactory parserFactory;
103 private void addMarker(IFile file, String message, int lineNumber, int severity)
107 IMarker marker = file.createMarker(MARKER_TYPE);
108 marker.setAttribute(IMarker.MESSAGE, message);
109 marker.setAttribute(IMarker.SEVERITY, severity);
110 if (lineNumber == -1)
114 marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
116 catch (CoreException e)
122 protected void startupOnInitialize()
124 super.startupOnInitialize();
125 machineContext = ProjectMachineContext.getMachineContextOf(getProject());
129 protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException
131 if (kind == FULL_BUILD)
136 IResourceDelta delta = getDelta(getProject());
142 incrementalBuild(delta, monitor);
149 protected void clean(IProgressMonitor monitor) throws CoreException
151 // delete markers set and files created
152 getProject().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE);
155 void checkXML(IResource resource)
157 if (resource instanceof IFile && resource.getName().endsWith(".asm"))
159 IFile file = (IFile) resource;
161 XMLErrorHandler reporter = new XMLErrorHandler(file);
164 getParser().parse(file.getContents(), reporter);
172 private void deleteMarkers(IFile file)
176 file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO);
178 catch (CoreException ce)
183 protected void fullBuild(final IProgressMonitor monitor) throws CoreException
187 getProject().accept(new SampleResourceVisitor());
189 catch (CoreException e)
194 private SAXParser getParser() throws ParserConfigurationException, SAXException
196 if (parserFactory == null)
198 parserFactory = SAXParserFactory.newInstance();
200 return parserFactory.newSAXParser();
203 protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException
205 // the visitor does the work.
206 delta.accept(new SampleDeltaVisitor());