From dd9c59cc23aa4788996931654d4be465ae2649ce Mon Sep 17 00:00:00 2001 From: buraq Date: Sat, 18 Jun 2005 15:58:26 +0000 Subject: added the ElementValidator class --- sources/scala/xml/dtd/ContentModel.scala | 32 ++--------------- sources/scala/xml/dtd/ElementValidator.scala | 52 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 29 deletions(-) create mode 100644 sources/scala/xml/dtd/ElementValidator.scala (limited to 'sources') diff --git a/sources/scala/xml/dtd/ContentModel.scala b/sources/scala/xml/dtd/ContentModel.scala index 4875dad14b..9b9c86fe49 100644 --- a/sources/scala/xml/dtd/ContentModel.scala +++ b/sources/scala/xml/dtd/ContentModel.scala @@ -20,6 +20,9 @@ object ContentModel extends WordExp { override def toString() = "ElemName(\""+name+"\")"; } + def isMixed(cm: ContentModel) = cm.isInstanceOf[MIXED]; + def containsText(cm: ContentModel) = (cm == PCDATA) || isMixed(cm); + def parse(s: String): ContentModel = ContentModelParser.parse( s ); def getLabels(r: RegExp): scala.collection.Set[String] = { @@ -139,35 +142,6 @@ abstract class DFAContentModel extends ContentModel { } _dfa } - /* - def getIterator(ns:NodeSeq): Iterator[String]; - def runDFA(ns:NodeSeq): Boolean = { - if(null == _dfa) { - val nfa = ContentModel.Translator.automatonFrom(r, 1); - _dfa = new SubsetConstruction(nfa).determinize; - } - var q = 0; - val it = getIterator(ns); - Console.println("it empty from the start? "+(!it.hasNext)); - while( it.hasNext ) { - val e = it.next; - Console.println("next = "+e); - if(null == e) { - return _dfa.isFinal(q) - } else { - Console.println(" got :"+ElemName(e)); - Console.println("delta:" + _dfa.delta(q)); - - _dfa.delta(q).get(ElemName(e)).match { - case Some(p) => q = p; - case _ => throw ValidationException("element "+e+" not allowed here") - } - Console.println("q now " + q); - } - } - _dfa.isFinal(q) - } - */ } case class MIXED(r:ContentModel.RegExp) extends DFAContentModel { import ContentModel.{ Alt, Eps, RegExp }; diff --git a/sources/scala/xml/dtd/ElementValidator.scala b/sources/scala/xml/dtd/ElementValidator.scala new file mode 100644 index 0000000000..f301bebd87 --- /dev/null +++ b/sources/scala/xml/dtd/ElementValidator.scala @@ -0,0 +1,52 @@ +package scala.xml.dtd; + +import ContentModel.ElemName ; +import scala.util.automata._ ; + +class ElementValidator() extends Function1[Node,Boolean] { + + protected var _dfa: DetWordAutom[ElemName] = _; + + def setContentModel(cm:ContentModel) = cm match { + //case ANY => true ; + //case EMPTY => //@todo + //case PCDATA => + //case m@MIXED(r) => + case ELEMENTS( r ) => + val nfa = ContentModel.Translator.automatonFrom(r, 1); + _dfa = new SubsetConstruction(nfa).determinize; + } + + def getIterator(ns: Seq[Node]): Iterator[ElemName] = + ns . toList + . filter { x => x.namespace == null } + . map { x => ElemName(x.label) } + . elements; + /** @pre _dfa != null + */ + def runDFA(ns: Seq[Node]): Boolean = { + var q = 0; + val it = getIterator(ns); + //Console.println("it empty from the start? "+(!it.hasNext)); + while( it.hasNext ) { + val e = it.next; + // Console.println("next = "+e); + // Console.println(" got :"+ElemName(e)); + // Console.println("delta:" + _dfa.delta(q)); + + _dfa.delta(q).get(e).match { + case Some(p) => q = p; + case _ => throw ValidationException("element "+e+" not allowed here") + } + //Console.println("q now " + q); + } + _dfa.isFinal(q) + } + + def apply(n: Node): Boolean = { + var res = (null == _dfa) || runDFA(n.child); + // res = ... // @todo attributes + res + } + +} -- cgit v1.2.3