diff options
Diffstat (limited to 'bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java')
-rw-r--r-- | bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java | 808 |
1 files changed, 0 insertions, 808 deletions
diff --git a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java b/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java deleted file mode 100644 index ad698885c0..0000000000 --- a/bundles/org.eclipse.wst.xml.core/src-validation/org/eclipse/wst/xml/core/internal/validation/XMLValidator.java +++ /dev/null @@ -1,808 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2009 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * David Carver - STAR - [205989] - [validation] validate XML after XInclude resolution - *******************************************************************************/ - -package org.eclipse.wst.xml.core.internal.validation; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.io.StringReader; -import java.net.ConnectException; -import java.net.URL; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; - -import org.apache.xerces.impl.XMLErrorReporter; -import org.apache.xerces.impl.msg.XMLMessageFormatter; -import org.apache.xerces.parsers.XIncludeAwareParserConfiguration; -import org.apache.xerces.xni.Augmentations; -import org.apache.xerces.xni.NamespaceContext; -import org.apache.xerces.xni.QName; -import org.apache.xerces.xni.XMLAttributes; -import org.apache.xerces.xni.XMLLocator; -import org.apache.xerces.xni.XMLResourceIdentifier; -import org.apache.xerces.xni.XNIException; -import org.apache.xerces.xni.parser.XMLEntityResolver; -import org.apache.xerces.xni.parser.XMLInputSource; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.eclipse.osgi.util.NLS; -import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver; -import org.eclipse.wst.common.uriresolver.internal.util.URIHelper; -import org.eclipse.wst.validation.ValidationResult; -import org.eclipse.wst.xml.core.internal.Logger; -import org.eclipse.wst.xml.core.internal.validation.core.LazyURLInputStream; -import org.eclipse.wst.xml.core.internal.validation.core.NestedValidatorContext; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; -import org.xml.sax.ext.DeclHandler; -import org.xml.sax.helpers.DefaultHandler; - -/** - * This class performs validation using a xerces sax parser. - * Here's a quick overview of the details : - * - an ErrorHandler is used to collect errors into a list (so they may be displayed by the UI) - * - an EntityResolver is used along with the xerces "external-schemaLocation" property to implement XML Catalog support - */ -public class XMLValidator -{ - protected URIResolver uriResolver = null; - protected Hashtable ingoredErrorKeyTable = new Hashtable(); - protected Set adjustLocationErrorKeySet = new TreeSet(); - - protected static final String IGNORE_ALWAYS = "IGNORE_ALWAYS"; //$NON-NLS-1$ - protected static final String IGNORE_IF_DTD_WITHOUT_ELEMENT_DECL = "IGNORE_IF_DTD_WITHOUT_ELEMENT_DECL"; //$NON-NLS-1$ - protected static final String PREMATURE_EOF = "PrematureEOF"; //$NON-NLS-1$ - protected static final String ROOT_ELEMENT_TYPE_MUST_MATCH_DOCTYPEDECL = "RootElementTypeMustMatchDoctypedecl"; //$NON-NLS-1$ - protected static final String MSG_ELEMENT_NOT_DECLARED = "MSG_ELEMENT_NOT_DECLARED"; //$NON-NLS-1$ - - // WTP XML validator specific key. - protected static final String NO_GRAMMAR_FOUND = "NO_GRAMMAR_FOUND"; //$NON-NLS-1$ - - private static final String FILE_NOT_FOUND_KEY = "FILE_NOT_FOUND"; //$NON-NLS-1$ - - /** - * Constructor. - */ - public XMLValidator() - { - // Here we add some error keys that we need to filter out when we're validation - // against a DTD without any element declarations. - ingoredErrorKeyTable.put(PREMATURE_EOF, IGNORE_ALWAYS); - ingoredErrorKeyTable.put(ROOT_ELEMENT_TYPE_MUST_MATCH_DOCTYPEDECL, IGNORE_IF_DTD_WITHOUT_ELEMENT_DECL); - ingoredErrorKeyTable.put(MSG_ELEMENT_NOT_DECLARED, IGNORE_IF_DTD_WITHOUT_ELEMENT_DECL); - - // Here we add some error keys that we need to adjust the location information for. - // The location information will be adjusted to place the message on the line of the starting - // element instead of on the line of the closing element. - adjustLocationErrorKeySet.add("MSG_CONTENT_INVALID"); - adjustLocationErrorKeySet.add("MSG_CONTENT_INCOMPLETE"); - adjustLocationErrorKeySet.add("cvc-complex-type.2.4.b"); - adjustLocationErrorKeySet.add("cvc-complex-type.2.3"); - } - - /** - * Set the URI Resolver to use. - * - * @param uriResolver The URI Resolver to use. - */ - public void setURIResolver(URIResolver uriResolver) - { - this.uriResolver = uriResolver; - //entityResolver = new MyEntityResolver(uriResolver); - } - - - /** - * Create an XML Reader. - * - * @return The newly created XML reader or null if unsuccessful. - * @throws Exception - */ - protected XMLReader createXMLReader(final XMLValidationInfo valinfo, XMLEntityResolver entityResolver) throws Exception - { - XMLReader reader = null; - // move to Xerces-2... add the contextClassLoader stuff - ClassLoader prevClassLoader = Thread.currentThread().getContextClassLoader(); - try - { - Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); - MyStandardParserConfiguration configuration = new MyStandardParserConfiguration(valinfo); - reader = new org.apache.xerces.parsers.SAXParser(configuration) - { - private XMLLocator locator = null; - - /* (non-Javadoc) - * @see org.apache.xerces.parsers.AbstractSAXParser#startDocument(org.apache.xerces.xni.XMLLocator, java.lang.String, org.apache.xerces.xni.NamespaceContext, org.apache.xerces.xni.Augmentations) - */ - public void startDocument(org.apache.xerces.xni.XMLLocator theLocator, java.lang.String encoding, NamespaceContext nscontext, org.apache.xerces.xni.Augmentations augs) - { - locator = theLocator; - valinfo.setXMLLocator(theLocator); - super.startDocument(theLocator, encoding, nscontext, augs); - } - - /* (non-Javadoc) - * @see org.apache.xerces.parsers.AbstractSAXParser#startElement(org.apache.xerces.xni.QName, org.apache.xerces.xni.XMLAttributes, org.apache.xerces.xni.Augmentations) - */ - public void startElement(QName arg0, XMLAttributes arg1, Augmentations arg2) throws XNIException - { - valinfo.getStartElementLocations().push(new LocationCoordinate(locator.getLineNumber(), locator.getColumnNumber())); - super.startElement(arg0, arg1, arg2); - } - - /* (non-Javadoc) - * @see org.apache.xerces.parsers.AbstractSAXParser#endElement(org.apache.xerces.xni.QName, org.apache.xerces.xni.Augmentations) - */ - public void endElement(QName arg0, Augmentations arg1) throws XNIException { - super.endElement(arg0, arg1); - valinfo.getStartElementLocations().pop(); - } - }; - - reader.setFeature("http://apache.org/xml/features/continue-after-fatal-error", false); //$NON-NLS-1$ - reader.setFeature("http://xml.org/sax/features/namespace-prefixes", valinfo.isNamespaceEncountered()); //$NON-NLS-1$ - reader.setFeature("http://xml.org/sax/features/namespaces", valinfo.isNamespaceEncountered()); //$NON-NLS-1$ - reader.setFeature("http://xml.org/sax/features/validation", valinfo.isGrammarEncountered()); //$NON-NLS-1$ - reader.setFeature("http://apache.org/xml/features/validation/schema", valinfo.isGrammarEncountered()); //$NON-NLS-1$ - reader.setContentHandler(new DefaultHandler() - { - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - valinfo.getErrorCustomizationManager().startElement(uri, localName); - } - - public void endElement(String uri, String localName, String qName) throws SAXException { - valinfo.getErrorCustomizationManager().endElement(uri, localName); - } - }); - - // MH make sure validation works even when a customer entityResolver is note set (i.e. via setURIResolver()) - if (entityResolver != null) - { - reader.setProperty("http://apache.org/xml/properties/internal/entity-resolver", entityResolver); //$NON-NLS-1$ - } - reader.setProperty("http://xml.org/sax/properties/declaration-handler", new MyDeclHandler()); //$NON-NLS-1$ - } - catch(Exception e) - { - Logger.logException(e); - //e.printStackTrace(); - } - finally - { - Thread.currentThread().setContextClassLoader(prevClassLoader); - } - return reader; - } - - /** - * Validate the file located at the given URI. - * - * @param uri The URI of the file to validate. - * @return Returns an XML validation report. - */ - public XMLValidationReport validate(String uri) - { - return validate(uri, null, new XMLValidationConfiguration()); - } - - final String createStringForInputStream(InputStream inputStream) - { - // Here we are reading the file and storing to a stringbuffer. - StringBuffer fileString = new StringBuffer(); - try - { - InputStreamReader inputReader = new InputStreamReader(inputStream, "UTF-8"); - BufferedReader reader = new BufferedReader(inputReader); - char[] chars = new char[1024]; - int numberRead = reader.read(chars); - while (numberRead != -1) - { - fileString.append(chars, 0, numberRead); - numberRead = reader.read(chars); - } - } - catch (Exception e) - { - //TODO: log error message - //e.printStackTrace(); - } - return fileString.toString(); - } - /** - * Validate the inputStream - * - * @param uri The URI of the file to validate. - * @param the inputStream of the file to validate - * @return Returns an XML validation report. - */ - public XMLValidationReport validate(String uri, InputStream inputStream) - { - return validate(uri, inputStream, new XMLValidationConfiguration()); - } - /** - * Validate the inputStream - * - * @param uri - * The URI of the file to validate. - * @param inputstream - * The inputStream of the file to validate - * @param configuration - * A configuration for this validation session. - * @return - * Returns an XML validation report. - */ - public XMLValidationReport validate(String uri, InputStream inputStream, XMLValidationConfiguration configuration) - { - return validate(uri, inputStream, configuration, null); - } - - /** - * Validate the inputStream - * - * @param uri - * The URI of the file to validate. - * @param inputstream - * The inputStream of the file to validate - * @param configuration - * A configuration for this validation session. - * @param result - * The validation result - * @return - * Returns an XML validation report. - */ - public XMLValidationReport validate(String uri, InputStream inputStream, XMLValidationConfiguration configuration, ValidationResult result) - { - return validate(uri, inputStream, configuration, null, null); - } - - /** - * Validate the inputStream - * - * @param uri - * The URI of the file to validate. - * @param inputstream - * The inputStream of the file to validate - * @param configuration - * A configuration for this validation session. - * @param result - * The validation result - * @param context - * The validation context - * @return - * Returns an XML validation report. - */ - public XMLValidationReport validate(String uri, InputStream inputStream, XMLValidationConfiguration configuration, ValidationResult result, NestedValidatorContext context) - { - String grammarFile = ""; - Reader reader1 = null; // Used for the preparse. - Reader reader2 = null; // Used for validation parse. - - if (inputStream != null) - { - String string = createStringForInputStream(inputStream); - reader1 = new StringReader(string); - reader2 = new StringReader(string); - } - - XMLValidationInfo valinfo = new XMLValidationInfo(uri); - MyEntityResolver entityResolver = new MyEntityResolver(uriResolver, context); - ValidatorHelper helper = new ValidatorHelper(); - try - { - helper.computeValidationInformation(uri, reader1, uriResolver); - valinfo.setDTDEncountered(helper.isDTDEncountered); - valinfo.setElementDeclarationCount(helper.numDTDElements); - valinfo.setNamespaceEncountered(helper.isNamespaceEncountered); - valinfo.setGrammarEncountered(helper.isGrammarEncountered); - - XMLReader reader = createXMLReader(valinfo, entityResolver); - // Set the configuration option - if (configuration.getFeature(XMLValidationConfiguration.HONOUR_ALL_SCHEMA_LOCATIONS)) - { - reader.setFeature("http://apache.org/xml/features/honour-all-schemaLocations", true); //$NON-NLS-1$ - } - if (configuration.getFeature(XMLValidationConfiguration.USE_XINCLUDE)) - { - reader.setFeature("http://apache.org/xml/features/xinclude", true); //$NON-NLS-1$ - } - XMLErrorHandler errorhandler = new XMLErrorHandler(valinfo); - reader.setErrorHandler(errorhandler); - - InputSource inputSource = new InputSource(uri); - inputSource.setCharacterStream(reader2); - reader.parse(inputSource); - if(configuration.getIntFeature(XMLValidationConfiguration.INDICATE_NO_GRAMMAR) > 0 && - valinfo.isValid() && !helper.isGrammarEncountered) - { - if(configuration.getIntFeature(XMLValidationConfiguration.INDICATE_NO_GRAMMAR) == 1) - valinfo.addWarning(XMLValidationMessages._WARN_NO_GRAMMAR, 1, 0, uri, NO_GRAMMAR_FOUND, null); - else // 2 - valinfo.addError(XMLValidationMessages._WARN_NO_GRAMMAR, 1, 0, uri, NO_GRAMMAR_FOUND, null); - } - - if (helper.isDTDEncountered) - grammarFile = entityResolver.getLocation(); - else - grammarFile = helper.schemaLocationString; - } - catch (SAXParseException saxParseException) - { - // These errors are caught by the error handler. - //addValidationMessage(valinfo, saxParseException); - } - catch (IOException ioException) - { - addValidationMessage(valinfo, ioException); - } - catch (Exception exception) - { - Logger.logException(exception.getLocalizedMessage(), exception); - } - - // Now set up the dependencies - // Wrap with try catch so that if something wrong happens, validation can - // still proceed as before - if (result != null) - { - try - { - IResource resource = getWorkspaceFileFromLocation(grammarFile); - ArrayList resources = new ArrayList(); - if (resource != null) - resources.add(resource); - result.setDependsOn((IResource [])resources.toArray(new IResource [0])); - } - catch (Exception e) - { - Logger.logException(e.getLocalizedMessage(), e); - } - } - - return valinfo; - - } - - /** - * Add a validation message to the specified list. - * - * @param valinfo The validation info object to add the error to. - * @param exception The exception that contains the validation information. - */ - protected void addValidationMessage(XMLValidationInfo valinfo, IOException exception) - { - String validationMessageStr = exception.getMessage(); - Throwable cause = exception.getCause() != null ? exception.getCause() : exception; - while(validationMessageStr == null && cause != null){ - String localizedMessage = cause.getLocalizedMessage(); - cause = cause.getCause(); - if(cause == null && localizedMessage != null ) - { - validationMessageStr = localizedMessage; - } - } - - if (validationMessageStr != null) - { - if (cause instanceof FileNotFoundException) - { - validationMessageStr = NLS.bind(XMLValidationMessages._UI_PROBLEMS_VALIDATING_FILE_NOT_FOUND, new Object [] { validationMessageStr }); - } - else if (cause instanceof UnknownHostException) - { - validationMessageStr = NLS.bind(XMLValidationMessages._UI_PROBLEMS_VALIDATING_UNKNOWN_HOST, new Object [] { validationMessageStr }); - } - else if(cause instanceof ConnectException) - { - validationMessageStr = XMLValidationMessages._UI_PROBLEMS_CONNECTION_REFUSED; - } - } - - if (validationMessageStr != null) - { - XMLLocator locator = valinfo.getXMLLocator(); - valinfo.addWarning(validationMessageStr, locator != null ? locator.getLineNumber() : 1, locator != null ? locator.getColumnNumber() : 0, valinfo.getFileURI(), FILE_NOT_FOUND_KEY, null); - } - } - - /** - * Add a validation message to the specified list. - * - * @param valinfo The validation info object to add the error to. - * @param exception The exception that contains the validation information. - */ - protected void addValidationMessage(XMLValidationInfo valinfo, SAXParseException exception) - { - if (exception.getMessage() != null) - { - valinfo.addError(exception.getLocalizedMessage(), exception.getLineNumber(), exception.getColumnNumber(), exception.getSystemId()); - } - } - - - /** - * A custom entity resolver that uses the URI resolver specified to resolve entities. - */ - protected class MyEntityResolver implements XMLEntityResolver - { - private URIResolver uriResolver; - private String resolvedDTDLocation; - private NestedValidatorContext context; - - /** - * Constructor. - * - * @param uriResolver The URI resolver to use with this entity resolver. - * @param context The XML validator context. - */ - public MyEntityResolver(URIResolver uriResolver, NestedValidatorContext context) - { - this.uriResolver = uriResolver; - this.context = context; - } - - /* (non-Javadoc) - * @see org.apache.xerces.xni.parser.XMLEntityResolver#resolveEntity(org.apache.xerces.xni.XMLResourceIdentifier) - */ - public XMLInputSource resolveEntity(XMLResourceIdentifier rid) throws XNIException, IOException - { - XMLInputSource inputSource = _internalResolveEntity(uriResolver, rid, context); - if (inputSource != null) - { - resolvedDTDLocation = inputSource.getSystemId(); - } - return inputSource; - } - - public String getLocation() - { - return resolvedDTDLocation; - } - } - - // cs : I've refactored the common SAX based resolution code into this method for use by other validators - // (i.e. XML Schema, WSDL etc). The other approach is maintain a copy for each validator that has - // identical code. In any case we should strive to ensure that the validators perform resolution consistently. - public static XMLInputSource _internalResolveEntity(URIResolver uriResolver, XMLResourceIdentifier rid) throws IOException - { - return _internalResolveEntity(uriResolver, rid, null); - } - - public static XMLInputSource _internalResolveEntity(URIResolver uriResolver, XMLResourceIdentifier rid, NestedValidatorContext context) throws IOException - { - XMLInputSource is = null; - - if (uriResolver != null) - { - String id = rid.getPublicId(); - if(id == null) - { - id = rid.getNamespace(); - } - - String location = null; - if (id != null || rid.getLiteralSystemId() != null) - { - location = uriResolver.resolve(rid.getBaseSystemId(), id, rid.getLiteralSystemId()); - } - - if (location != null) - { - String physical = uriResolver.resolvePhysicalLocation(rid.getBaseSystemId(), id, location); - - // if physical is already a known bad uri, just go ahead and throw an exception - if (context instanceof XMLNestedValidatorContext) - { - XMLNestedValidatorContext xmlContext = ((XMLNestedValidatorContext)context); - - if (xmlContext.isURIMarkedInaccessible(physical)) - { - throw new FileNotFoundException(physical); - } - } - - is = new XMLInputSource(rid.getPublicId(), location, location); - - // This block checks that the file exists. If it doesn't we need to throw - // an exception so Xerces will report an error. note: This may not be - // necessary with all versions of Xerces but has specifically been - // experienced with the version included in IBM's 1.4.2 JDK. - InputStream isTemp = null; - try - { - isTemp = new URL(physical).openStream(); - } - catch (IOException e) - { - // physical was a bad url, so cache it so we know next time - if (context instanceof XMLNestedValidatorContext) - { - XMLNestedValidatorContext xmlContext = ((XMLNestedValidatorContext)context); - xmlContext.markURIInaccessible(physical); - } - throw e; - } - finally - { - if(isTemp != null) - { - isTemp.close(); - } - } - is.setByteStream(new LazyURLInputStream(physical)); - } - } - return is; - } - - /** - * An error handler to catch errors encountered while parsing the XML document. - */ - protected class XMLErrorHandler implements org.xml.sax.ErrorHandler - { - - private final int ERROR = 0; - private final int WARNING = 1; - private XMLValidationInfo valinfo; - - /** - * Constructor. - * - * @param valinfo The XML validation info object that will hold the validation messages. - */ - public XMLErrorHandler(XMLValidationInfo valinfo) - { - this.valinfo = valinfo; - } - - /** - * Add a validation message with the given severity. - * - * @param exception The exception that contains the message. - * @param severity The severity of the message. - */ - - protected void addValidationMessage(SAXParseException exception, int severity) - { - if(exception.getSystemId() != null) - { - int lineNumber = exception.getLineNumber(); - int columnNumber = exception.getColumnNumber(); - - // For the following three errors the line number will be modified to use that of the start - // tag instead of the end tag. - String currentErrorKey = valinfo.currentErrorKey; - if (currentErrorKey != null && adjustLocationErrorKeySet.contains(currentErrorKey)) - { - LocationCoordinate adjustedCoordinates = (LocationCoordinate)valinfo.getStartElementLocations().peek(); - lineNumber = adjustedCoordinates.getLineNumber(); - columnNumber = adjustedCoordinates.getColumnNumner(); - } - - if(severity == WARNING) - { - valinfo.addWarning(exception.getLocalizedMessage(), lineNumber, columnNumber, exception.getSystemId()); - } - else - { - valinfo.addError(exception.getLocalizedMessage(), lineNumber, columnNumber, exception.getSystemId(), valinfo.getCurrentErrorKey(), valinfo.getMessageArguments()); - } - } - } - - /* (non-Javadoc) - * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException) - */ - public void error(SAXParseException exception) throws SAXException - { - addValidationMessage(exception, ERROR); - } - - /* (non-Javadoc) - * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException) - */ - public void fatalError(SAXParseException exception) throws SAXException - { - addValidationMessage(exception, ERROR); - } - - /* (non-Javadoc) - * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException) - */ - public void warning(SAXParseException exception) throws SAXException - { - addValidationMessage(exception, WARNING); - } - } - - /** - * This class is used to count the elementDecls that are encountered in a DTD. - */ - protected class MyDeclHandler implements DeclHandler - { - - /** - * Constructor. - * - * @param valinfo The XMLValidationInfo object that will count the declarations. - */ - public MyDeclHandler() - { - } - - /* (non-Javadoc) - * @see org.xml.sax.ext.DeclHandler#attributeDecl(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) - */ - public void attributeDecl(String eName, String aName, String type, String valueDefault, String value) - { - } - - /* (non-Javadoc) - * @see org.xml.sax.ext.DeclHandler#elementDecl(java.lang.String, java.lang.String) - */ - public void elementDecl(String name, String model) - { - //valinfo.increaseElementDeclarationCount(); - } - - /* (non-Javadoc) - * @see org.xml.sax.ext.DeclHandler#externalEntityDecl(java.lang.String, java.lang.String, java.lang.String) - */ - public void externalEntityDecl(String name, String publicId, String systemId) - { - } - - /* (non-Javadoc) - * @see org.xml.sax.ext.DeclHandler#internalEntityDecl(java.lang.String, java.lang.String) - */ - public void internalEntityDecl(String name, String value) - { - } - } - - /** - * A XIncludeAwareParserConfiguration that creates an error reporter which can ignore - * DTD error messages for DTD's with no elements defined. - */ - - protected class MyStandardParserConfiguration extends XIncludeAwareParserConfiguration - { - XMLValidationInfo valinfo = null; - List reportedExceptions = new ArrayList(); - - /** - * Constructor. - * - * @param valinfo The XMLValidationInfo object to use. - */ - public MyStandardParserConfiguration(XMLValidationInfo valinfo) - { - this.valinfo = valinfo; - - XMLErrorReporter errorReporter = createErrorReporter(); - if (errorReporter.getMessageFormatter(XMLMessageFormatter.XML_DOMAIN) == null) { - XMLMessageFormatter xmft = new XMLMessageFormatter(); - errorReporter.putMessageFormatter(XMLMessageFormatter.XML_DOMAIN, xmft); - errorReporter.putMessageFormatter(XMLMessageFormatter.XMLNS_DOMAIN, xmft); - } - fErrorReporter = errorReporter; - setProperty(ERROR_REPORTER, errorReporter); - fCommonComponents.remove(fErrorReporter); - fCommonComponents.add(fErrorReporter); - } - - /* (non-Javadoc) - * @see org.apache.xerces.parsers.DTDConfiguration#createErrorReporter() - */ - protected XMLErrorReporter createErrorReporter() - { - return new XMLErrorReporter() - { - /* (non-Javadoc) - * @see org.apache.xerces.impl.XMLErrorReporter#reportError(java.lang.String, java.lang.String, java.lang.Object[], short) - */ - public void reportError(String domain, String key, Object[] arguments, short severity) throws XNIException - { - boolean reportError = true; - valinfo.setCurrentErrorKey(key); - valinfo.setMessageArguments(arguments); - String ignoreCondition = (String)ingoredErrorKeyTable.get(key); - if (ignoreCondition != null) - { - if (ignoreCondition.equals(XMLValidator.IGNORE_IF_DTD_WITHOUT_ELEMENT_DECL)) - { - boolean isDTDWithoutElementDeclarationEncountered = valinfo.isDTDWithoutElementDeclarationEncountered(); - reportError = !isDTDWithoutElementDeclarationEncountered; - } - else - { - reportError = false; - } - } - if ("schema_reference.4".equals(key) && arguments.length > 0) //$NON-NLS-1$ - { - Object location = arguments[0]; - if (location != null) - { - if(reportedExceptions.contains(location)) - { - reportError = false; - } - else - { - reportedExceptions.add(location); - } - } - } - if (reportError) - { - super.reportError(domain, key, arguments, severity); - valinfo.getErrorCustomizationManager().considerReportedError(valinfo, key, arguments); - } - } - }; - } - } - - /** - * A line and column number coordinate. - */ - protected class LocationCoordinate - { - private int lineNo = -1; - private int columnNo = -1; - - public LocationCoordinate(int lineNumber, int columnNumber) - { - this.lineNo = lineNumber; - this.columnNo = columnNumber; - } - - public int getLineNumber() - { - return this.lineNo; - } - - public int getColumnNumner() - { - return this.columnNo; - } - } - - protected IResource getWorkspaceFileFromLocation(String location) - { - if (location == null) return null; - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - // To canonicalize the EMF URI - IPath canonicalForm = new Path(location); - // Need to convert to absolute location... - IPath pathLocation = new Path(URIHelper.removeProtocol(canonicalForm.toString())); - // ...to find the resource file that is in the workspace - IResource resourceFile = workspace.getRoot().getFileForLocation(pathLocation); - // If the resource is resolved to a file from http, or a file outside - // the workspace, then we will just ignore it. - return resourceFile; - } -} |