You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlbeans-dev@xml.apache.org by Dutta Satadip <s-...@sbcglobal.net> on 2004/01/13 08:08:42 UTC

Better messages from the validator

Hello 
I made some changes to validator to accomplish the objective of better messages. 

The changes included in this version of the validator include more verbose messages during validation for

- Expected Elements ( message contains the name of the expected element to fix the problem)

- Unexpected Elements 

Some of the future changes that might be useful (probably based on some community feedback) would be verbose messages for missing/wrong attributes, elements that need to match certain patterns and the like.

The changes in the validator would require the changes in the SchemaTypeVisitorImpl that I have emailed earlier

In any case I am attaching 2 files

1. Validator

2. SchemaTypeVistorImpl 

The diff for validator.java is included at the end of this email.

Feedback is greatly appreciated.

With Regards

Dutta:)

 

Diff of the changes to validator.java

130a131

> private boolean _testValidity = false;

290a292

> 

315c317,325

< commit();

---

> 

> if ( ! _testValidity )

> {

> commit();

> }

> else

> {

> rollback();

> }

353a364

> 

357c368

< if (!_top._curPart.canStartWithElement(eltName))

---

> if (!_top._curPart.canStartWithElement(eltName))

360c371

< return notValid();

---

> return notValid();

379c390

< return notValid();

---

> return notValid();

447a459,466

> public boolean testValid(QName eltName)

> {

> _testValidity = true;

> boolean retVal = visit(eltName);

> _testValidity = false;

> return retVal;

> }

> 

480c499

< 

---

> 

489c508

< return _matchedParticle;

---

> return _matchedParticle;

*****CVS exited normally with code 1*****

cvs update Validator.java (in directory D:\OSD\xml-xmlbeans\v2\src\typeimpl\org\apache\xmlbeans\impl\validator\)

M Validator.java

*****CVS exited normally with code 0*****

cvs diff Validator.java (in directory D:\OSD\xml-xmlbeans\v2\src\typeimpl\org\apache\xmlbeans\impl\validator\)

Index: Validator.java

===================================================================

RCS file: /home/cvspublic/xml-xmlbeans/v2/src/typeimpl/org/apache/xmlbeans/impl/validator/Validator.java,v

retrieving revision 1.1

diff -r1.1 Validator.java

5c5

< * Copyright (c) 2003 The Apache Software Foundation. All rights 

---

> * Copyright (c) 2003 The Apache Software Foundation. All rights

13c13

< * notice, this list of conditions and the following disclaimer. 

---

> * notice, this list of conditions and the following disclaimer.

21c21

< * if any, must include the following acknowledgment: 

---

> * if any, must include the following acknowledgment:

27c27

< * 4. The names "Apache" and "Apache Software Foundation" must 

---

> * 4. The names "Apache" and "Apache Software Foundation" must

29c29

< * software without prior written permission. For written 

---

> * software without prior written permission. For written

32,33c32,33

< * 5. Products derived from this software may not be called "Apache 

< * XMLBeans", nor may "Apache" appear in their name, without prior 

---

> * 5. Products derived from this software may not be called "Apache

> * XMLBeans", nor may "Apache" appear in their name, without prior

52c52

< * originally based on software copyright (c) 2000-2003 BEA Systems 

---

> * originally based on software copyright (c) 2000-2003 BEA Systems

99a100,102

> import org.apache.xmlbeans.*;

> 

> import java.util.*;

233a237

> String message = null;

262c266,275

< emitFieldError( event, "Element not allowed:", name );

---

> message = findDetailedErrorBegin(state , name.toString());

> if (message != null)

> {

> emitFieldError(event, message);

> message = null;

> }

> else

> {

> emitFieldError(event, "Element not allowed:", name);

> }

263a277

> 

275c289,291

< emitFieldError( event, "Element not allowed:", name );

---

> // Additional processing may be needed to generate more

> // descriptive messages

> emitFieldError( event, "Element not allowed:", name );

276a293

> 

317c334

< emitFieldError(event, 

---

> emitFieldError(event,

525c542

< 

---

> 

666c683

< emitFieldError(

---

> emitFieldError(

667a685

> 

681,683c699,701

< event, 

< "Default QName values are unsupported for attribute: " + 

< QNameHelper.pretty(sla.getName()), 

---

> event,

> "Default QName values are unsupported for attribute: " +

> QNameHelper.pretty(sla.getName()),

687c705

< else 

---

> else

703c721,723

< State state = topState();

---

> String message = null;

> State state = topState();

> 

708c728,740

< emitFieldError( event, "Expected element(s)" );

---

> {

> 

> message = findDetailedErrorEnd(state);

> 

> if (message != null)

> {

> emitFieldError(event, message);

> }

> else

> {

> emitFieldError(event, "Expected element(s)");

> }

> }

758c790

< if (!emptyContent && !state._canHaveMixedContent && 

---

> if (!emptyContent && !state._canHaveMixedContent &&

761c793

< if (field instanceof SchemaLocalElement) 

---

> if (field instanceof SchemaLocalElement)

773a806,895

> private String findDetailedErrorBegin(State state, String name)

> {

> String elementBefore = null;

> String message = null;

> SchemaType elmtType = state._type;

> List allSeenTypes = new ArrayList();

> 

> allSeenTypes.addAll(Arrays.asList(elmtType.getElementProperties()));

> for (int ii = 0; ii < allSeenTypes.size(); ii++)

> {

> //Get the element from the schema

> SchemaProperty sProp = (SchemaProperty) allSeenTypes.get(ii);

> // if it is a attribute ignore

> if (sProp.isAttribute())

> continue;

> 

> // test if the element is valid

> if (!state.test(sProp.getName()))

> {

> 

> // For scenarios in which element is invalid in the begining of the complex type

> if ( elementBefore != null)

> {

> message = "Element " + name + " is not valid in " +

> _stateStack._field.getName() + " : expected " +

> elementBefore;

> break;

> 

> }

> else if ( ii == allSeenTypes.size()-1 )

> {

> // case in which an unexpected element is present at the end

> message = "Unexpected Element " + name + " after " + sProp.getName();

> break;

> }

> 

> }

> else

> {

> elementBefore =sProp.getName().toString();

> 

> if ( ii == allSeenTypes.size()-1 )

> {

> // case in which an unexpected element is present at the end

> message = "Element " + name + " is not valid in " +

> _stateStack._field.getName() + " : expected " +

> sProp.getName();

> break;

> }

> 

> }

> }

> return message;

> }

> 

> private String findDetailedErrorEnd(State state)

> {

> String elementAfter = null;

> String message = null;

> 

> SchemaType elmtType = state._type;

> 

> 

> List allSeenTypes = new ArrayList();

> allSeenTypes.addAll(Arrays.asList(elmtType.getElementProperties()));

> for (int ii = 0; ii < allSeenTypes.size(); ii++) {

> SchemaProperty sProp = (SchemaProperty) allSeenTypes.get(ii);

> 

> if (sProp.isAttribute())

> continue;

> 

> if (!state.test(sProp.getName()))

> {

> elementAfter = sProp.getName().toString();

> }

> else

> {

> if ( ii == allSeenTypes.size()-1 && elementAfter != null)

> {

> 

> message = _stateStack._field.getName()+ " is invalid after "+

> elementAfter +": expected " + sProp.getName().toString() ;

> }

> }

> }

> 

> return message;

> }

> 

> 

780a903,907

> boolean test( QName name )

> {

> return _canHaveElements && _visitor.testValid( name );

> }

> 

1153c1280