blob: 9e7c6e70d02c83f121f8de425f4e642b6d1130c0 [file] [log] [blame]
david_williams49d24fb2005-04-08 21:16:59 +00001/*******************************************************************************
amywu32bdd412007-02-14 08:12:56 +00002 * Copyright (c) 2001, 2007 IBM Corporation and others.
david_williams49d24fb2005-04-08 21:16:59 +00003 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
david_williams96643dd2005-04-13 04:35:24 +000011package org.eclipse.wst.html.internal.validation;
paverye6107e62005-02-23 18:01:10 +000012
13import java.io.IOException;
14import java.io.UnsupportedEncodingException;
nitinda9458e52006-11-02 00:59:27 +000015import java.util.ArrayList;
16import java.util.List;
paverye6107e62005-02-23 18:01:10 +000017
paverya0e2eae2005-10-20 20:24:29 +000018import org.eclipse.core.filebuffers.ITextFileBuffer;
paverye6107e62005-02-23 18:01:10 +000019import org.eclipse.core.resources.IContainer;
20import org.eclipse.core.resources.IFile;
21import org.eclipse.core.resources.IProject;
22import org.eclipse.core.resources.IResource;
23import org.eclipse.core.resources.ResourcesPlugin;
24import org.eclipse.core.runtime.CoreException;
nitinda9458e52006-11-02 00:59:27 +000025import org.eclipse.core.runtime.IConfigurationElement;
26import org.eclipse.core.runtime.IExecutableExtension;
nitind7780ed62007-12-18 04:45:17 +000027import org.eclipse.core.runtime.IPath;
nitind3b1ac312008-04-21 20:41:30 +000028import org.eclipse.core.runtime.IProgressMonitor;
pavery9e4a23d2006-03-13 20:28:03 +000029import org.eclipse.core.runtime.IStatus;
paverye6107e62005-02-23 18:01:10 +000030import org.eclipse.core.runtime.NullProgressMonitor;
31import org.eclipse.core.runtime.OperationCanceledException;
32import org.eclipse.core.runtime.Path;
david_williamse6ed7322005-10-10 17:32:24 +000033import org.eclipse.core.runtime.Platform;
pavery9e4a23d2006-03-13 20:28:03 +000034import org.eclipse.core.runtime.Status;
nitinda06daf82005-11-01 22:42:33 +000035import org.eclipse.core.runtime.content.IContentDescription;
david_williamse6ed7322005-10-10 17:32:24 +000036import org.eclipse.core.runtime.content.IContentType;
37import org.eclipse.core.runtime.content.IContentTypeManager;
pavery9e4a23d2006-03-13 20:28:03 +000038import org.eclipse.core.runtime.jobs.ISchedulingRule;
paverya0e2eae2005-10-20 20:24:29 +000039import org.eclipse.jface.text.IDocument;
40import org.eclipse.jface.text.IRegion;
nitinda9458e52006-11-02 00:59:27 +000041import org.eclipse.wst.html.core.internal.document.HTMLDocumentTypeConstants;
david_williams56777022005-04-11 06:21:55 +000042import org.eclipse.wst.html.core.internal.validate.HTMLValidationAdapterFactory;
nitindde5d5aa2007-02-14 22:58:32 +000043import org.eclipse.wst.html.ui.internal.Logger;
david_williamsb5d05632006-02-27 09:24:00 +000044import org.eclipse.wst.sse.core.StructuredModelManager;
paverya0e2eae2005-10-20 20:24:29 +000045import org.eclipse.wst.sse.core.internal.FileBufferModelManager;
david_williams4ad020f2005-04-18 08:00:30 +000046import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
47import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
paverya0e2eae2005-10-20 20:24:29 +000048import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
david_williams4ad020f2005-04-18 08:00:30 +000049import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
paverya0e2eae2005-10-20 20:24:29 +000050import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
pavery99e577e2006-03-16 21:28:46 +000051import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
52import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
david_williams2aecf082005-04-13 05:03:21 +000053import org.eclipse.wst.sse.core.internal.util.URIResolver;
david_williams3bcfe392005-04-13 04:49:36 +000054import org.eclipse.wst.sse.core.internal.validate.ValidationAdapter;
nitinda9458e52006-11-02 00:59:27 +000055import org.eclipse.wst.sse.core.utils.StringUtils;
paverya0e2eae2005-10-20 20:24:29 +000056import org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator;
nitind3b1ac312008-04-21 20:41:30 +000057import org.eclipse.wst.validation.AbstractValidator;
58import org.eclipse.wst.validation.ValidationResult;
59import org.eclipse.wst.validation.ValidationState;
vbhadrir0b14da32005-04-18 15:40:15 +000060import org.eclipse.wst.validation.internal.core.Message;
pavery9e4a23d2006-03-13 20:28:03 +000061import org.eclipse.wst.validation.internal.core.ValidationException;
vbhadrir271d28a2005-04-12 19:36:05 +000062import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
paverye6107e62005-02-23 18:01:10 +000063import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
david_williams49d24fb2005-04-08 21:16:59 +000064import org.eclipse.wst.validation.internal.provisional.core.IMessage;
65import org.eclipse.wst.validation.internal.provisional.core.IReporter;
66import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
pavery9e4a23d2006-03-13 20:28:03 +000067import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
david_williams646a5e22005-04-02 07:16:27 +000068import org.eclipse.wst.xml.core.internal.document.DocumentTypeAdapter;
david_williams4ad020f2005-04-18 08:00:30 +000069import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
70import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
paverydc8b3062005-10-24 20:43:42 +000071import org.w3c.dom.Text;
paverye6107e62005-02-23 18:01:10 +000072
nitind3b1ac312008-04-21 20:41:30 +000073public class HTMLValidator extends AbstractValidator implements IValidatorJob, ISourceValidator, IExecutableExtension {
nitind73e76412005-11-10 01:50:19 +000074 private static final String ORG_ECLIPSE_WST_HTML_CORE_HTMLSOURCE = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
david_williamse6ed7322005-10-10 17:32:24 +000075
nitind165498a2005-07-12 18:47:49 +000076 static boolean shouldValidate(IFile file) {
77 IResource resource = file;
78 do {
79 if (resource.isDerived() || resource.isTeamPrivateMember() || !resource.isAccessible() || (resource.getName().charAt(0) == '.' && resource.getType() == IResource.FOLDER)) {
80 return false;
81 }
82 resource = resource.getParent();
83 }
84 while ((resource.getType() & IResource.PROJECT) == 0);
85 return true;
86 }
87
paverya0e2eae2005-10-20 20:24:29 +000088 private IDocument fDocument;
nitinda9458e52006-11-02 00:59:27 +000089 private IContentTypeManager fContentTypeManager;
90 private IContentType[] fOtherSupportedContentTypes = null;
91 private String[] fAdditionalContentTypesIDs = null;
92 private IContentType fHTMLContentType;
paverya0e2eae2005-10-20 20:24:29 +000093
paverye6107e62005-02-23 18:01:10 +000094 public HTMLValidator() {
95 super();
nitinda9458e52006-11-02 00:59:27 +000096 fContentTypeManager = Platform.getContentTypeManager();
97 fHTMLContentType = fContentTypeManager.getContentType(ORG_ECLIPSE_WST_HTML_CORE_HTMLSOURCE);
paverye6107e62005-02-23 18:01:10 +000098 }
99
100 /**
101 */
102 public void cleanup(IReporter reporter) {
103 // nothing to do
104 }
105
106 /**
nitinda9458e52006-11-02 00:59:27 +0000107 * Gets list of content types this validator is interested in
108 *
109 * @return All HTML-related content types
110 */
111 private IContentType[] getOtherSupportedContentTypes() {
112 if (fOtherSupportedContentTypes == null) {
113 List contentTypes = new ArrayList(3);
nitinda9458e52006-11-02 00:59:27 +0000114 if (fAdditionalContentTypesIDs != null) {
115 for (int i = 0; i < fAdditionalContentTypesIDs.length; i++) {
116 IContentType type = Platform.getContentTypeManager().getContentType(fAdditionalContentTypesIDs[i]);
117 if (type != null) {
118 contentTypes.add(type);
119 }
120 }
121 }
122 fOtherSupportedContentTypes = (IContentType[]) contentTypes.toArray(new IContentType[contentTypes.size()]);
123 }
124 return fOtherSupportedContentTypes;
125 }
126
127
128 /**
paverye6107e62005-02-23 18:01:10 +0000129 */
david_williamsc39caaf2005-04-05 06:07:16 +0000130 protected IDOMModel getModel(IProject project, IFile file) {
paverye6107e62005-02-23 18:01:10 +0000131 if (project == null || file == null)
132 return null;
133 if (!file.exists())
134 return null;
135 if (!canHandle(file))
136 return null;
137
138 IStructuredModel model = null;
139 IModelManager manager = StructuredModelManager.getModelManager();
nitindde5d5aa2007-02-14 22:58:32 +0000140 try {
141 file.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
142 }
143 catch (CoreException e) {
144 Logger.logException(e);
145 }
paverye6107e62005-02-23 18:01:10 +0000146 try {
147 try {
148 model = manager.getModelForRead(file);
149 }
150 catch (UnsupportedEncodingException ex) {
david_williams49d24fb2005-04-08 21:16:59 +0000151 // retry ignoring META charset for invalid META charset
152 // specification
paverye6107e62005-02-23 18:01:10 +0000153 // recreate input stream, because it is already partially read
154 model = manager.getModelForRead(file, new String(), null);
155 }
156 }
157 catch (UnsupportedEncodingException ex) {
158 }
159 catch (IOException ex) {
160 }
nitindde5d5aa2007-02-14 22:58:32 +0000161 catch (CoreException e) {
162 Logger.logException(e);
paverye6107e62005-02-23 18:01:10 +0000163 }
164
165 if (model == null)
166 return null;
david_williamsc39caaf2005-04-05 06:07:16 +0000167 if (!(model instanceof IDOMModel)) {
paverye6107e62005-02-23 18:01:10 +0000168 releaseModel(model);
169 return null;
170 }
david_williamsc39caaf2005-04-05 06:07:16 +0000171 return (IDOMModel) model;
paverye6107e62005-02-23 18:01:10 +0000172 }
173
174 /**
175 */
david_williamsc39caaf2005-04-05 06:07:16 +0000176 protected HTMLValidationReporter getReporter(IReporter reporter, IFile file, IDOMModel model) {
paverye6107e62005-02-23 18:01:10 +0000177 return new HTMLValidationReporter(this, reporter, file, model);
178 }
179
180 /**
181 * Check file extension to validate
182 */
183 private boolean canHandle(IFile file) {
david_williamse6ed7322005-10-10 17:32:24 +0000184 boolean result = false;
185 if (file != null) {
186 try {
nitinda06daf82005-11-01 22:42:33 +0000187 IContentDescription contentDescription = file.getContentDescription();
nitinda06daf82005-11-01 22:42:33 +0000188 if (contentDescription != null) {
189 IContentType fileContentType = contentDescription.getContentType();
nitinda9458e52006-11-02 00:59:27 +0000190 if (fileContentType.isKindOf(fHTMLContentType)) {
191 result = true;
192 }
193 else {
194 IContentType[] otherTypes = getOtherSupportedContentTypes();
195 for (int i = 0; i < otherTypes.length; i++) {
196 result = result || fileContentType.isKindOf(otherTypes[i]);
david_williamse6ed7322005-10-10 17:32:24 +0000197 }
198 }
199 }
nitinda9458e52006-11-02 00:59:27 +0000200 else if (fHTMLContentType != null) {
201 result = fHTMLContentType.isAssociatedWith(file.getName());
nitinda06daf82005-11-01 22:42:33 +0000202 }
david_williamse6ed7322005-10-10 17:32:24 +0000203 }
204 catch (CoreException e) {
205 // should be rare, but will ignore to avoid logging "encoding
206 // exceptions" and the like here.
207 // Logger.logException(e);
208 }
209 }
210 return result;
paverye6107e62005-02-23 18:01:10 +0000211 }
212
213 /**
214 */
david_williamsc39caaf2005-04-05 06:07:16 +0000215 private boolean hasHTMLFeature(IDOMDocument document) {
paverye6107e62005-02-23 18:01:10 +0000216 DocumentTypeAdapter adapter = (DocumentTypeAdapter) document.getAdapterFor(DocumentTypeAdapter.class);
217 if (adapter == null)
218 return false;
nitinda9458e52006-11-02 00:59:27 +0000219 return adapter.hasFeature(HTMLDocumentTypeConstants.HTML);
paverye6107e62005-02-23 18:01:10 +0000220 }
221
222 /**
223 */
224 protected void releaseModel(IStructuredModel model) {
225 if (model != null)
226 model.releaseFromRead();
227 }
228
229 /**
230 */
vbhadrir271d28a2005-04-12 19:36:05 +0000231 public void validate(IValidationContext helper, IReporter reporter) {
paverye6107e62005-02-23 18:01:10 +0000232 if (helper == null)
233 return;
234 if ((reporter != null) && (reporter.isCancelled() == true)) {
235 throw new OperationCanceledException();
236 }
vbhadrir271d28a2005-04-12 19:36:05 +0000237 String[] deltaArray = helper.getURIs();
paverye6107e62005-02-23 18:01:10 +0000238 if (deltaArray != null && deltaArray.length > 0) {
vbhadrir271d28a2005-04-12 19:36:05 +0000239 validateDelta(helper, reporter);
paverye6107e62005-02-23 18:01:10 +0000240 }
241 else {
vbhadrir271d28a2005-04-12 19:36:05 +0000242 validateFull(helper, reporter);
paverye6107e62005-02-23 18:01:10 +0000243 }
244 }
pavery9e4a23d2006-03-13 20:28:03 +0000245
paverya0e2eae2005-10-20 20:24:29 +0000246 /**
pavery9e4a23d2006-03-13 20:28:03 +0000247 * This validate call is for the ISourceValidator partial document
248 * validation approach
249 *
paverya0e2eae2005-10-20 20:24:29 +0000250 * @param dirtyRegion
251 * @param helper
252 * @param reporter
pavery9e4a23d2006-03-13 20:28:03 +0000253 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
paverya0e2eae2005-10-20 20:24:29 +0000254 */
255 public void validate(IRegion dirtyRegion, IValidationContext helper, IReporter reporter) {
pavery9e4a23d2006-03-13 20:28:03 +0000256
paverya0e2eae2005-10-20 20:24:29 +0000257 if (helper == null || fDocument == null)
258 return;
pavery9e4a23d2006-03-13 20:28:03 +0000259
paverya0e2eae2005-10-20 20:24:29 +0000260 if ((reporter != null) && (reporter.isCancelled() == true)) {
261 throw new OperationCanceledException();
262 }
pavery9e4a23d2006-03-13 20:28:03 +0000263
paverya0e2eae2005-10-20 20:24:29 +0000264 IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
265 if (model == null)
266 return; // error
pavery9e4a23d2006-03-13 20:28:03 +0000267
paverya0e2eae2005-10-20 20:24:29 +0000268 try {
pavery9e4a23d2006-03-13 20:28:03 +0000269
paverya0e2eae2005-10-20 20:24:29 +0000270 IDOMDocument document = null;
pavery9e4a23d2006-03-13 20:28:03 +0000271 if (model instanceof IDOMModel) {
272 document = ((IDOMModel) model).getDocument();
paverya0e2eae2005-10-20 20:24:29 +0000273 }
paverye6107e62005-02-23 18:01:10 +0000274
nitind7780ed62007-12-18 04:45:17 +0000275 if (document == null || !hasHTMLFeature(document)) {
276 model.releaseFromRead();
277 return; //ignore
278 }
279
280 IPath filePath = null;
281 IFile file = null;
pavery9e4a23d2006-03-13 20:28:03 +0000282
paverya0e2eae2005-10-20 20:24:29 +0000283 ITextFileBuffer fb = FileBufferModelManager.getInstance().getBuffer(fDocument);
nitind7780ed62007-12-18 04:45:17 +0000284 if (fb != null) {
285 filePath = fb.getLocation();
pavery9e4a23d2006-03-13 20:28:03 +0000286
nitind7780ed62007-12-18 04:45:17 +0000287 if (filePath.segmentCount() > 1) {
288 file = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
289 if (!file.isAccessible()) {
290 file = null;
291 }
292 }
293 }
294 else {
295 filePath = new Path(model.getId());
296 }
pavery9e4a23d2006-03-13 20:28:03 +0000297
paverydc8b3062005-10-24 20:43:42 +0000298 // this will be the wrong region if it's Text (instead of Element)
299 // we don't know how to validate Text
pavery99e577e2006-03-16 21:28:46 +0000300 IndexedRegion ir = getCoveringNode(dirtyRegion); // model.getIndexedRegion(dirtyRegion.getOffset());
pavery9e4a23d2006-03-13 20:28:03 +0000301 if (ir instanceof Text) {
302 while (ir != null && ir instanceof Text) {
paverydc8b3062005-10-24 20:43:42 +0000303 // it's assumed that this gets the IndexedRegion to
304 // the right of the end offset
305 ir = model.getIndexedRegion(ir.getEndOffset());
306 }
307 }
pavery99e577e2006-03-16 21:28:46 +0000308
pavery9e4a23d2006-03-13 20:28:03 +0000309 if (ir instanceof INodeNotifier) {
310
paverya0e2eae2005-10-20 20:24:29 +0000311 INodeAdapterFactory factory = HTMLValidationAdapterFactory.getInstance();
pavery9e4a23d2006-03-13 20:28:03 +0000312 ValidationAdapter adapter = (ValidationAdapter) factory.adapt((INodeNotifier) ir);
paverya0e2eae2005-10-20 20:24:29 +0000313 if (adapter == null)
314 return; // error
pavery9e4a23d2006-03-13 20:28:03 +0000315
paverya0e2eae2005-10-20 20:24:29 +0000316 if (reporter != null) {
317 HTMLValidationReporter rep = null;
pavery9e4a23d2006-03-13 20:28:03 +0000318 rep = getReporter(reporter, file, (IDOMModel) model);
paverya0e2eae2005-10-20 20:24:29 +0000319 rep.clear();
320 adapter.setReporter(rep);
pavery9e4a23d2006-03-13 20:28:03 +0000321
nitind7780ed62007-12-18 04:45:17 +0000322 Message mess = new LocalizedMessage(IMessage.LOW_SEVERITY, filePath.toString().substring(1));
paverya0e2eae2005-10-20 20:24:29 +0000323 reporter.displaySubtask(this, mess);
324 }
325 adapter.validate(ir);
326 }
327 }
328 finally {
pavery9e4a23d2006-03-13 20:28:03 +0000329 if (model != null)
paverya0e2eae2005-10-20 20:24:29 +0000330 model.releaseFromRead();
331 }
332 }
333
pavery99e577e2006-03-16 21:28:46 +0000334 private IndexedRegion getCoveringNode(IRegion dirtyRegion) {
335
336 IndexedRegion largestRegion = null;
337 if(fDocument instanceof IStructuredDocument) {
nitindd7870fd2006-09-13 01:57:38 +0000338 IStructuredDocumentRegion[] regions = ((IStructuredDocument) fDocument).getStructuredDocumentRegions(dirtyRegion.getOffset(), dirtyRegion.getLength());
339 largestRegion = getLargest(regions);
pavery99e577e2006-03-16 21:28:46 +0000340 }
341 return largestRegion;
342 }
343 protected IndexedRegion getLargest(IStructuredDocumentRegion[] sdRegions) {
344
345 if(sdRegions == null || sdRegions.length == 0)
346 return null;
347
348 IndexedRegion currentLargest = getCorrespondingNode(sdRegions[0]);
349 for (int i = 0; i < sdRegions.length; i++) {
350 if(!sdRegions[i].isDeleted()) {
351 IndexedRegion corresponding = getCorrespondingNode(sdRegions[i]);
352
353 if(currentLargest instanceof Text)
354 currentLargest = corresponding;
355
356 if(corresponding != null) {
357 if(!(corresponding instanceof Text)) {
358 if (corresponding.getStartOffset() <= currentLargest.getStartOffset()
359 && corresponding.getEndOffset() >= currentLargest.getEndOffset() )
360 currentLargest = corresponding;
361 }
362 }
363
364 }
365 }
366 return currentLargest;
367 }
368 protected IndexedRegion getCorrespondingNode(IStructuredDocumentRegion sdRegion) {
369 IStructuredModel sModel = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
370 IndexedRegion indexedRegion = null;
371 try {
372 if (sModel != null)
373 indexedRegion = sModel.getIndexedRegion(sdRegion.getStart());
374 } finally {
375 if (sModel != null)
376 sModel.releaseFromRead();
377 }
378 return indexedRegion;
379 }
380
paverya0e2eae2005-10-20 20:24:29 +0000381 /**
382 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
383 */
384 public void connect(IDocument document) {
385 fDocument = document;
386 }
pavery9e4a23d2006-03-13 20:28:03 +0000387
paverya0e2eae2005-10-20 20:24:29 +0000388 /**
389 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
390 */
391 public void disconnect(IDocument document) {
nitindd7870fd2006-09-13 01:57:38 +0000392 fDocument = null;
paverya0e2eae2005-10-20 20:24:29 +0000393 }
pavery9e4a23d2006-03-13 20:28:03 +0000394
paverye6107e62005-02-23 18:01:10 +0000395 /**
396 */
david_williamsc39caaf2005-04-05 06:07:16 +0000397 protected HTMLValidationResult validate(IDOMModel model, IFile file) {
paverye6107e62005-02-23 18:01:10 +0000398 IProject prj = null;
399 if (file != null) {
400 prj = file.getProject();
401 }
david_williams49d24fb2005-04-08 21:16:59 +0000402 if ((prj == null) && (model != null)) {
paverye6107e62005-02-23 18:01:10 +0000403 URIResolver res = model.getResolver();
404 if (res != null) {
405 prj = res.getProject();
406 }
407 }
408 final WorkbenchReporter reporter = new WorkbenchReporter(prj, new NullProgressMonitor());
david_williams49d24fb2005-04-08 21:16:59 +0000409 return validate(reporter, file, model);
paverye6107e62005-02-23 18:01:10 +0000410 }
411
412 /**
413 */
david_williamsc39caaf2005-04-05 06:07:16 +0000414 private HTMLValidationResult validate(IReporter reporter, IFile file, IDOMModel model) {
paverye6107e62005-02-23 18:01:10 +0000415 if (file == null || model == null)
416 return null; // error
david_williamsc39caaf2005-04-05 06:07:16 +0000417 IDOMDocument document = model.getDocument();
paverye6107e62005-02-23 18:01:10 +0000418 if (document == null)
419 return null; // error
420 if (!hasHTMLFeature(document))
421 return null; // ignore
422
david_williams285ee2d2005-04-10 18:21:21 +0000423 INodeAdapterFactory factory = HTMLValidationAdapterFactory.getInstance();
paverye6107e62005-02-23 18:01:10 +0000424 ValidationAdapter adapter = (ValidationAdapter) factory.adapt(document);
425 if (adapter == null)
426 return null; // error
427
428 HTMLValidationReporter rep = getReporter(reporter, file, model);
429 rep.clear();
430 adapter.setReporter(rep);
paverye6107e62005-02-23 18:01:10 +0000431 adapter.validate(document);
432 return rep.getResult();
433 }
434
435 /**
436 */
david_williams43271672005-04-01 05:19:26 +0000437 private void validateContainer(IValidationContext helper, IReporter reporter, IContainer container) {
paverye6107e62005-02-23 18:01:10 +0000438 try {
439 IResource[] resourceArray = container.members(false);
440 for (int i = 0; i < resourceArray.length; i++) {
441 IResource resource = resourceArray[i];
nitindbcb8cd02006-08-15 21:11:35 +0000442 if (resource == null || reporter.isCancelled())
paverye6107e62005-02-23 18:01:10 +0000443 continue;
444 if (resource instanceof IFile) {
nitinda9458e52006-11-02 00:59:27 +0000445 Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, resource.getFullPath().toString().substring(1));
446 reporter.displaySubtask(this, message);
paverye6107e62005-02-23 18:01:10 +0000447 validateFile(helper, reporter, (IFile) resource);
448 }
449 else if (resource instanceof IContainer) {
450 validateContainer(helper, reporter, (IContainer) resource);
451 }
452 }
453 }
454 catch (CoreException ex) {
455 }
456 }
457
458 /**
459 */
vbhadrir271d28a2005-04-12 19:36:05 +0000460 private void validateDelta(IValidationContext helper, IReporter reporter) {
461 String[] deltaArray = helper.getURIs();
paverye6107e62005-02-23 18:01:10 +0000462 for (int i = 0; i < deltaArray.length; i++) {
vbhadrir271d28a2005-04-12 19:36:05 +0000463 String delta = deltaArray[i];
464 if (delta == null)
paverye6107e62005-02-23 18:01:10 +0000465 continue;
nitinda9458e52006-11-02 00:59:27 +0000466
467 if (reporter != null) {
nitind314005a2008-03-25 03:31:25 +0000468 Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, delta.substring(1));
nitinda9458e52006-11-02 00:59:27 +0000469 reporter.displaySubtask(this, message);
470 }
471
paverye6107e62005-02-23 18:01:10 +0000472 IResource resource = getResource(delta);
473 if (resource == null || !(resource instanceof IFile))
474 continue;
475 validateFile(helper, reporter, (IFile) resource);
476 }
477 }
478
479 /**
480 */
david_williams43271672005-04-01 05:19:26 +0000481 private void validateFile(IValidationContext helper, IReporter reporter, IFile file) {
paverye6107e62005-02-23 18:01:10 +0000482 if ((reporter != null) && (reporter.isCancelled() == true)) {
483 throw new OperationCanceledException();
484 }
nitind165498a2005-07-12 18:47:49 +0000485 if (!shouldValidate(file)) {
486 return;
487 }
david_williamsc39caaf2005-04-05 06:07:16 +0000488 IDOMModel model = getModel(file.getProject(), file);
paverye6107e62005-02-23 18:01:10 +0000489 if (model == null)
490 return;
491
492 try {
493 validate(reporter, file, model);
494 }
495 finally {
496 releaseModel(model);
497 }
498 }
499
500 /**
501 */
vbhadrir271d28a2005-04-12 19:36:05 +0000502 private void validateFull(IValidationContext helper, IReporter reporter) {
paverye6107e62005-02-23 18:01:10 +0000503 IProject project = null;
vbhadrir271d28a2005-04-12 19:36:05 +0000504 String[] fileDelta = helper.getURIs();
505 if (helper instanceof IWorkbenchContext) {
506 IWorkbenchContext wbHelper = (IWorkbenchContext) helper;
paverye6107e62005-02-23 18:01:10 +0000507 project = wbHelper.getProject();
508 }
nitinda9458e52006-11-02 00:59:27 +0000509 else if(fileDelta.length > 0){
paverye6107e62005-02-23 18:01:10 +0000510 // won't work for project validation (b/c nothing in file delta)
511 project = getResource(fileDelta[0]).getProject();
512 }
513 if (project == null)
514 return;
515 validateContainer(helper, reporter, project);
516 }
517
david_williams49d24fb2005-04-08 21:16:59 +0000518 /*
paverye6107e62005-02-23 18:01:10 +0000519 * added to get rid or dependency on IWorkbenchHelper
david_williams49d24fb2005-04-08 21:16:59 +0000520 *
paverye6107e62005-02-23 18:01:10 +0000521 */
vbhadrir271d28a2005-04-12 19:36:05 +0000522 public IResource getResource(String delta) {
david_williamse6ed7322005-10-10 17:32:24 +0000523 return ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(delta));
paverye6107e62005-02-23 18:01:10 +0000524 }
pavery9e4a23d2006-03-13 20:28:03 +0000525
526 public ISchedulingRule getSchedulingRule(IValidationContext helper) {
527 return null;
528 }
529
530 public IStatus validateInJob(IValidationContext helper, IReporter reporter) throws ValidationException {
david_williams2deeabe2006-07-30 03:11:20 +0000531 // Exception catching was removed, see
532 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=123600
pavery9e4a23d2006-03-13 20:28:03 +0000533 IStatus status = Status.OK_STATUS;
david_williams2deeabe2006-07-30 03:11:20 +0000534 validate(helper, reporter);
pavery9e4a23d2006-03-13 20:28:03 +0000535 return status;
536 }
nitinda9458e52006-11-02 00:59:27 +0000537
538 /**
539 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
540 * java.lang.String, java.lang.Object)
541 */
542 public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
543 fAdditionalContentTypesIDs = new String[0];
544 if (data != null) {
545 if (data instanceof String && data.toString().length() > 0) {
546 fAdditionalContentTypesIDs = StringUtils.unpack(data.toString());
547 }
548 }
549 }
nitind3b1ac312008-04-21 20:41:30 +0000550
551 public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
552 if (resource.getType() != IResource.FILE)
553 return null;
554 ValidationResult result = new ValidationResult();
555 IReporter reporter = result.getReporter(monitor);
556 validateFile(null, reporter, (IFile) resource);
557 return result;
558 }
paverye6107e62005-02-23 18:01:10 +0000559}