--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/relaxng/trunk/RNG__ValidatorContext.st Tue Apr 08 19:47:42 2008 +0000
@@ -0,0 +1,209 @@
+"{ Package: 'stx:goodies/xmlsuite/relaxng' }"
+
+"{ NameSpace: RNG }"
+
+Object subclass:#ValidatorContext
+ instanceVariableNames:'remainingAttributes automaton currentPattern owningPattern
+ validator'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Relax NG-Validation'
+!
+
+
+!ValidatorContext class methodsFor:'instance creation'!
+
+for:aContentModelAutomaton
+
+ ^self new pattern:aContentModelAutomaton
+
+ "Created: / 01-05-2005 / 12:50:28 / janfrog"
+ "Modified: / 01-05-2005 / 16:11:36 / janfrog"
+! !
+
+!ValidatorContext methodsFor:'accessing'!
+
+attributes
+ ^ remainingAttributes
+
+ "Created: / 01-05-2005 / 12:46:58 / janfrog"
+!
+
+attributes:something
+ remainingAttributes := something.
+
+ "Created: / 01-05-2005 / 12:46:58 / janfrog"
+!
+
+automaton
+ ^ automaton
+
+ "Created: / 14-05-2005 / 11:30:22 / janfrog"
+!
+
+currentPattern
+ ^ currentPattern
+
+ "Created: / 02-05-2005 / 15:20:30 / janfrog"
+!
+
+pattern
+ ^ owningPattern
+
+ "Created: / 01-05-2005 / 16:11:44 / janfrog"
+ "Modified: / 01-05-2005 / 18:29:05 / janfrog"
+!
+
+pattern:aPattern
+ owningPattern := aPattern.
+ automaton := aPattern contentModelAutomaton
+
+ "Created: / 01-05-2005 / 16:11:44 / janfrog"
+ "Modified: / 01-05-2005 / 18:29:05 / janfrog"
+!
+
+validator
+ ^ validator
+
+ "Created: / 02-05-2005 / 12:19:20 / janfrog"
+!
+
+validator:aValidator
+ validator := aValidator.
+
+ "Created: / 02-05-2005 / 12:19:20 / janfrog"
+! !
+
+!ValidatorContext methodsFor:'initialization'!
+
+initialize
+
+ "Must be called AFTER automaton and remainingAttributes are
+ set up!!!!!!"
+
+ "Created: / 01-05-2005 / 12:51:22 / janfrog"
+! !
+
+!ValidatorContext methodsFor:'printing'!
+
+printOn:aStream
+
+ aStream nextPutAll:
+ 'Validator context for:' , owningPattern nameForPrint
+
+ "Created: / 19-05-2005 / 10:29:49 / masca"
+! !
+
+!ValidatorContext methodsFor:'queries'!
+
+expectedPatterns
+
+ ^automaton expectedPatternsFromState:currentPattern
+
+ "Created: / 14-06-2005 / 12:10:54 / masca"
+!
+
+finished
+
+ ^(automaton isTerminalPattern:currentPattern)
+ and:[remainingAttributes isNilOrEmptyCollection]
+
+ "Created: / 01-05-2005 / 16:18:38 / janfrog"
+ "Modified: / 19-05-2005 / 10:02:59 / masca"
+! !
+
+!ValidatorContext methodsFor:'running'!
+
+nextPutElement:aString
+ "expandedName"
+
+ "Answers pattern for given expanded name or pattern
+ for any attribute if applicable. When no new pattern
+ can be found in transition table, an error is reported"
+
+ | newPattern |
+
+ [self tryAnyAttribute] whileTrue.
+
+ newPattern := (automaton
+ nextStateFrom:currentPattern
+ forTerminal:aString).
+ newPattern
+ ifNil:[^validator
+ validationError:('Unexpected element <',aString,
+ '/>. Expecting: ', (automaton expectedTokensStringFromState:currentPattern)) ].
+ ^currentPattern := newPattern.
+
+ "Created: / 01-05-2005 / 13:02:09 / janfrog"
+ "Modified: / 14-05-2005 / 11:17:36 / janfrog"
+!
+
+nextPutText:aString
+
+ | pcdataPattern |
+
+ [self tryAnyAttribute] whileTrue.
+
+ pcdataPattern := automaton
+ nextStateFrom:currentPattern
+ forTerminal:'#pcdata'.
+ pcdataPattern ifNil:[
+ validator
+ validationError:('Unexpected #pcdata. Expecting: ',
+ (automaton expectedTokensStringFromState:currentPattern))
+ ] ifNotNil:[
+ pcdataPattern validate:aString for:validator.
+ currentPattern := pcdataPattern.
+ ].
+
+ "Created: / 01-05-2005 / 16:05:28 / janfrog"
+ "Modified: / 14-05-2005 / 11:18:35 / janfrog"
+ "Modified: / 19-05-2005 / 09:52:20 / masca"
+!
+
+tryAnyAttribute
+
+ "Answers true, if any attribute was eaten, or false otherwise"
+
+
+ |pattern|
+ remainingAttributes ifNil:[^false].
+ remainingAttributes do:[:attr |
+ (pattern := automaton nextStateFrom:currentPattern forTerminal:attr expandedName)
+ ifNotNil:[
+ currentPattern := pattern.
+ validator processAttribute:attr usingPattern:pattern.
+ currentPattern := pattern.
+ remainingAttributes remove:attr.
+ ^true
+ ]
+ ].
+ ^false
+
+ "Created: / 02-05-2005 / 12:28:53 / janfrog"
+ "Modified: / 19-05-2005 / 09:52:50 / masca"
+!
+
+tryToFinish
+
+ | expectedPatterns |
+
+ [self tryAnyAttribute] whileTrue.
+
+ expectedPatterns := self expectedPatterns.
+
+ expectedPatterns size = 1 ifTrue:[
+ "Maybe a pcdata pattern that accepts empty string?"
+ expectedPatterns first acceptsEmptyStringAsContent ifTrue:[
+ self nextPutText:''.
+ ]
+ ]
+
+ "Created: / 14-06-2005 / 12:19:19 / masca"
+! !
+
+!ValidatorContext class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /opt/data/cvs/stx/goodies/xmlsuite/relaxng/RNG__ValidatorContext.st,v 1.1.1.1 2005-11-01 22:07:16 vranyj1 Exp $'
+! !