blob: aa46e81bbfa2b6dc5242e25e91d230e96600c965 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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
*******************************************************************************/
package org.eclipse.wst.wsdl.validation.internal.wsdl11;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Vector;
import javax.wsdl.Definition;
import javax.wsdl.WSDLException;
import org.apache.xerces.xs.XSModel;
import org.eclipse.wst.wsdl.validation.internal.IWSDLValidator;
import org.eclipse.wst.wsdl.validation.internal.IValidationInfo;
import org.eclipse.wst.wsdl.validation.internal.exception.ValidateWSDLException;
import org.eclipse.wst.wsdl.validation.internal.util.MessageGenerator;
import org.w3c.dom.Document;
import com.ibm.wsdl.Constants;
/**
* The validator controller is the head of validation.
*/
public class WSDL11ValidatorController implements IWSDLValidator
{
protected final String _WARN_NO_VALDIATOR = "_WARN_NO_VALDIATOR";
// protected final int ERROR_MESSAGE = 0;
// protected final int WARNING_MESSAGE = 1;
// protected String fileURI;
// protected List schemas = new Vector();
// protected Definition wsdlDefinition;
protected MessageGenerator messagegenerator = null;
//protected ValidationController validationController;
protected ValidatorRegistry ver = ValidatorRegistry.getInstance();
/**
* Constructor.
*/
public WSDL11ValidatorController()
{
}
/* (non-Javadoc)
* @see org.eclipse.wsdl.validate.IWSDLValidator#validate(org.w3c.dom.Document, org.eclipse.wsdl.validate.ValidationInfo)
*/
public void validate(Document domModel, IValidationInfo valInfo) throws ValidateWSDLException
{
// reset the variables
// reset();
// fileURI = valInfo.getFileURI();
//this.validationController = validationcontroller;
IWSDL11ValidationInfo wsdlvalinfo = new WSDL11ValidationInfoImpl(valInfo);
WSDLDocument[] wsdlDocs = readWSDLDocument(domModel, valInfo.getFileURI(), getMessageGenerator(), wsdlvalinfo);
// Don't validate an null definitions element. Either the file is emtpy and valid or
// had an error when reading.
if(wsdlDocs != null)
{
int numWSDLDocs = wsdlDocs.length;
for(int i = 0; i < numWSDLDocs; i++)
{
WSDLDocument tempDoc = wsdlDocs[i];
Definition wsdlDefinition = tempDoc.getDefinition();
// Register the schemas.
List xsdList = tempDoc.getSchemas();
Iterator xsdIter = xsdList.iterator();
while (xsdIter.hasNext())
{
wsdlvalinfo.addSchema((XSModel)xsdIter.next());
}
// Set the element locations table.
wsdlvalinfo.setElementLocations(tempDoc.getElementLocations());
// Set any reader errors. This needs to be done after the element locations table is set.
List readerErrors = tempDoc.getReaderErrors();
if (readerErrors != null)
{
Iterator readerErrorsI = readerErrors.iterator();
while (readerErrorsI.hasNext())
{
ReaderError re = (ReaderError)readerErrorsI.next();
wsdlvalinfo.addError(re.getError(), re.getObject());
}
}
List readerWarnings = tempDoc.getReaderWarnings();
if (readerWarnings != null)
{
Iterator readerWarningsI = readerWarnings.iterator();
while (readerWarningsI.hasNext())
{
ReaderError re = (ReaderError)readerWarningsI.next();
wsdlvalinfo.addWarning(re.getError(), re.getObject());
}
}
validateWSDLElement(Constants.NS_URI_WSDL, wsdlDefinition, new Vector(), wsdlvalinfo);
wsdlvalinfo.clearSchemas();
}
}
}
/**
* Validate an imported WSDL document. Allows the calling class to have access to the internal
* components of the validation.
*
* @param wsdlvalinfo The WSDL 1.1 validation info object to use.
* @return The definitions element for the import.
* @throws ValidateWSDLException
*/
// protected Definition validateImport(WSDL11ValidationInfo wsdlvalinfo)
// {
// WSDLDocument[] wsdlDocs = null;
// try
// {
// wsdlDocs = readWSDLDocument(null, wsdlvalinfo.getFileURI(), getMessageGenerator(), wsdlvalinfo);
// }
// catch(ValidateWSDLException e)
// {
// // supress any validation issues with imported documents
// }
// // Don't validate an null definitions element. Either the file is emtpy and valid or
// // had an error when reading.
// if(wsdlDocs != null)
// {
// validateWSDLElement(Constants.NS_URI_WSDL, wsdlDefinition, new Vector(), wsdlvalinfo);
// }
// return wsdlDefinition;
// }
/**
* Read in the WSDL document and set the model and imported schemas.
*
* @param domModel A DOM model of the document to be read.
* @param file The file to read.
* @param messagegenerator The messagegenerator the reader should use for any messages produced.
* @param wsdlvalinfo The validation information for the current validation.
* @return The definitions element for the WSDL document.
* @throws ValidateWSDLException
*/
protected WSDLDocument[] readWSDLDocument(Document domModel, String file, MessageGenerator messagegenerator, IWSDL11ValidationInfo wsdlvalinfo) throws ValidateWSDLException
{
WSDLDocument[] wsdlDocs = null;
try
{
WSDLReaderImpl wsdlReader = new WSDLReaderImpl(wsdlvalinfo);
wsdlReader.setMessageGenerator(messagegenerator);
if(domModel != null)
{
wsdlDocs = wsdlReader.readWSDL(file, domModel);
}
else
{
wsdlDocs = wsdlReader.readWSDL(file);
}
//wsdlvalinfo.setElementLocations(wsdlReader.getElementLocationsHashtable());
// List readerErrors = wsdlReader.getReaderErrors();
// if (readerErrors != null)
// {
// Iterator readerErrorsI = readerErrors.iterator();
// while (readerErrorsI.hasNext())
// {
// ReaderError re = (ReaderError)readerErrorsI.next();
// wsdlvalinfo.addError(re.getError(), re.getObject());
// }
// }
// if (wsdlReader.hasImportSchemas())
// {
// List xsdList = wsdlReader.getImportSchemas();
// Iterator xsdIter = xsdList.iterator();
// while (xsdIter.hasNext())
// {
// wsdlvalinfo.addSchema((XSModel)xsdIter.next());
// }
//
// }
}
catch (WSDLException e)
{
throw new ValidateWSDLException(e.getMessage() + " " + e.getFaultCode());
}
catch (Exception e)
{
throw new ValidateWSDLException("unable to read file" + e.getMessage() + " " + e.toString());
}
return wsdlDocs;
}
/**
* Given a WSDL element, call ValidateElement for it.
*
* @param namespace The namespace of the element to validate.
* @param element The element to validate.
* @param parents The list of parents for this element.
*/
public void validateWSDLElement(String namespace, Object element, List parents, IWSDL11ValidationInfo wsdlvalinfo)
{
IWSDL11Validator val = ver.queryValidatorRegistry(namespace);
if (val != null)
{
val.validate(element, parents, wsdlvalinfo);
}
else
{
//TODO: Add this as a preference.
//wsdlvalinfo.addWarning(messagegenerator.getString(_WARN_NO_VALDIATOR, namespace), element);
}
}
/**
* Add a schema to the list of schemas.
*
* @param xsModel The schema to add.
*/
// public void addSchema(XSModel xsModel)
// {
// if (xsModel != null)
// {
// schemas.add(xsModel);
// }
// }
/**
* Return the list containing the schemas.
*
* @return The list of schemas.
*/
// public List getSchemas()
// {
// return schemas;
// }
/**
* Get the ResourceBundle for this ValidatorManager.
*
* @return The resource bundle registered for this controller.
* @see #setResourceBundle
*/
// public ResourceBundle getResourceBundle()
// {
// return resourcebundle;
// }
/**
* Set the ResourceBundle for this ValidatorManager.
*
* @param rb The resource bundle to set.
* @see #getResourceBundle
*/
public void setResourceBundle(ResourceBundle rb)
{
if (messagegenerator == null)
{
messagegenerator = new MessageGenerator(rb);
}
}
/**
* Set the message generator for this controller.
*
* @param mesgen The message generator to set for this controller.
*/
public void setMessageGenerator(MessageGenerator mesgen)
{
messagegenerator = mesgen;
}
/**
* Get the message generator registered for this controller.
*
* @return The message generator registered for this controller.
*/
public MessageGenerator getMessageGenerator()
{
return messagegenerator;
}
/**
* Return the filename for the file currently being validated. Some validators require this.
*
* @return The filename for the file being validated.
*/
// public String getFilename()
// {
// return fileURI;
// }
/**
* Convenience method for extensibly validators to add error messages.
*
* @param object The object to add the error for.
* @param error The error to add.
*/
// public void addErrorMessage(Object object, String error)
// {
// addValidationMessage(ERROR_MESSAGE, object, error);
// errors = true;
// }
/**
* Method for extensibly validators to add error messages when they know
* line and column numbers.
*
* @param line The line where the error message is located.
* @param column The column where the error message is located.
* @param error The error message.
*/
// public void addErrorMessage(int line, int column, String error)
// {
// addValidationMessage(ERROR_MESSAGE, line, column, error);
// errors = true;
// }
/**
* Convenience method for extensibly validators to add warning messages.
*
* @param object The object to add the warning message.
* @param warning The warning message.
*/
// public void addWarningMessage(Object object, String warning)
// {
// addValidationMessage(WARNING_MESSAGE, object, warning);
// }
/**
* Method for extensibly validators to add warning messages when they know
* line and column numbers.
*
* @param line The line where the error message is located.
* @param column The column where the error message is located.
* @param warning The warning message.
*/
// public void addWarningMessage(int line, int column, String warning)
// {
// addValidationMessage(WARNING_MESSAGE, line, column, warning);
// }
/**
* If you have an object read in by the reader for this
* validatorcontroller the object can be passed in here and the line and column
* information will be abstracted from it.
*
* @param type The type of message to add.
* @param o The object that has the error (used to get the location).
* @param message The message to add.
*/
// protected void addValidationMessage(int type, Object o, String message)
// {
// int[] location;
// if (elementLocations.containsKey(o))
// {
// location = (int[])elementLocations.get(o);
// }
// // if we give it an element that hasn't been defined we'll set the location
// // at (0,0) so the error shows up but no line marker in the editor
// else
// {
// location = new int[] { 0, 0 };
// }
// addValidationMessage(type, location[0], location[1], message);
// }
/**
* Creates a validation message of the specified type.
*
* @param type The type of validation message to add.
* @param line The line where the error message is located.
* @param column The line where the column message is located.
* @param message The message to add.
*/
// protected void addValidationMessage(int type, int line, int column, String message)
// {
// if (message != null)
// {
// if (type == ERROR_MESSAGE)
// {
// validationController.addErrorMessage(line, column, message);
// }
// else if (type == WARNING_MESSAGE)
// {
// validationController.addWarningMessage(line, column, message);
// }
// }
// }
/**
* @see org.eclipse.wsdl.validate.controller.IWSDLValidator#isValid()
*/
// public boolean isValid()
// {
// return !errors;
// }
/**
* Reset the validator controller.
*/
// protected void reset()
// {
// schemas = new Vector();
// fileURI = "";
// wsdlDefinition = null;
// elementLocations = null;
// resourcebundle = null;
// //validationController = null;
// errors = false;
// }
}