9fc0ea419a03cb7dddbcfd3a7a2a8ffa85d3ec3c
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / nature / MograsimBuilder.java
1 package net.mograsim.plugin.nature;
2
3 import java.util.Map;
4
5 import javax.xml.parsers.ParserConfigurationException;
6 import javax.xml.parsers.SAXParser;
7 import javax.xml.parsers.SAXParserFactory;
8
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;
22
23 public class MograsimBuilder extends IncrementalProjectBuilder
24 {
25
26         class SampleDeltaVisitor implements IResourceDeltaVisitor
27         {
28                 @Override
29                 public boolean visit(IResourceDelta delta) throws CoreException
30                 {
31                         IResource resource = delta.getResource();
32                         switch (delta.getKind())
33                         {
34                         case IResourceDelta.ADDED:
35                                 // handle added resource
36                                 checkXML(resource);
37                                 break;
38                         case IResourceDelta.REMOVED:
39                                 // handle removed resource
40                                 break;
41                         case IResourceDelta.CHANGED:
42                                 // handle changed resource
43                                 checkXML(resource);
44                                 break;
45                         }
46                         // return true to continue visiting children.
47                         return true;
48                 }
49         }
50
51         class SampleResourceVisitor implements IResourceVisitor
52         {
53                 public boolean visit(IResource resource)
54                 {
55                         checkXML(resource);
56                         // return true to continue visiting children.
57                         return true;
58                 }
59         }
60
61         class XMLErrorHandler extends DefaultHandler
62         {
63
64                 private IFile file;
65
66                 public XMLErrorHandler(IFile file)
67                 {
68                         this.file = file;
69                 }
70
71                 private void addMarker(SAXParseException e, int severity)
72                 {
73                         MograsimBuilder.this.addMarker(file, e.getMessage(), e.getLineNumber(), severity);
74                 }
75
76                 public void error(SAXParseException exception) throws SAXException
77                 {
78                         addMarker(exception, IMarker.SEVERITY_ERROR);
79                 }
80
81                 public void fatalError(SAXParseException exception) throws SAXException
82                 {
83                         addMarker(exception, IMarker.SEVERITY_ERROR);
84                 }
85
86                 public void warning(SAXParseException exception) throws SAXException
87                 {
88                         addMarker(exception, IMarker.SEVERITY_WARNING);
89                 }
90         }
91
92         public static final String BUILDER_ID = "PluginTest.mograsimBuilder";
93
94         private static final String MARKER_TYPE = "PluginTest.xmlProblem";
95
96         private SAXParserFactory parserFactory;
97
98         private void addMarker(IFile file, String message, int lineNumber, int severity)
99         {
100                 try
101                 {
102                         IMarker marker = file.createMarker(MARKER_TYPE);
103                         marker.setAttribute(IMarker.MESSAGE, message);
104                         marker.setAttribute(IMarker.SEVERITY, severity);
105                         if (lineNumber == -1)
106                         {
107                                 lineNumber = 1;
108                         }
109                         marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
110                 }
111                 catch (CoreException e)
112                 {
113                 }
114         }
115
116         @Override
117         protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException
118         {
119                 if (kind == FULL_BUILD)
120                 {
121                         fullBuild(monitor);
122                 } else
123                 {
124                         IResourceDelta delta = getDelta(getProject());
125                         if (delta == null)
126                         {
127                                 fullBuild(monitor);
128                         } else
129                         {
130                                 incrementalBuild(delta, monitor);
131                         }
132                 }
133                 return null;
134         }
135
136         protected void clean(IProgressMonitor monitor) throws CoreException
137         {
138                 // delete markers set and files created
139                 getProject().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE);
140         }
141
142         void checkXML(IResource resource)
143         {
144                 if (resource instanceof IFile && resource.getName().endsWith(".xml"))
145                 {
146                         IFile file = (IFile) resource;
147                         deleteMarkers(file);
148                         XMLErrorHandler reporter = new XMLErrorHandler(file);
149                         try
150                         {
151                                 getParser().parse(file.getContents(), reporter);
152                         }
153                         catch (Exception e1)
154                         {
155                         }
156                 }
157         }
158
159         private void deleteMarkers(IFile file)
160         {
161                 try
162                 {
163                         file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO);
164                 }
165                 catch (CoreException ce)
166                 {
167                 }
168         }
169
170         protected void fullBuild(final IProgressMonitor monitor) throws CoreException
171         {
172                 try
173                 {
174                         getProject().accept(new SampleResourceVisitor());
175                 }
176                 catch (CoreException e)
177                 {
178                 }
179         }
180
181         private SAXParser getParser() throws ParserConfigurationException, SAXException
182         {
183                 if (parserFactory == null)
184                 {
185                         parserFactory = SAXParserFactory.newInstance();
186                 }
187                 return parserFactory.newSAXParser();
188         }
189
190         protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException
191         {
192                 // the visitor does the work.
193                 delta.accept(new SampleDeltaVisitor());
194         }
195 }