File: rexml/validation/validation.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: REXML#3
  module: Validation#4
  module: Validator#5
has properties
constant: NILEVENT #6
method: reset #7
method: dump #14
method: validate / 1 #17
  class: Event#79
inherits from
  Object ( Builtin-Module )
has properties
method: initialize / 2 #80
attribute: event_type [R] #85
attribute: event_arg [RW] #86
method: done? #88
method: single? #92
method: matches? / 1 #96
method: == / 1 #141
method: to_s #146
method: inspect #150

Class Hierarchy

Code

   1  require 'rexml/validation/validationexception'
   2 
   3  module REXML
   4    module Validation
   5      module Validator
   6        NILEVENT = [ nil ]
   7        def reset
   8          @current = @root
   9          @root.reset
  10          @root.previous = true
  11          @attr_stack = []
  12          self
  13        end
  14        def dump
  15          puts @root.inspect
  16        end
  17        def validate( event ) 
  18          #puts "Current: #@current"
  19          #puts "Event: #{event.inspect}"
  20          @attr_stack = [] unless defined? @attr_stack
  21          match = @current.next(event)
  22          raise ValidationException.new( "Validation error.  Expected: "+
  23            @current.expected.join( " or " )+" from #{@current.inspect} "+
  24            " but got #{Event.new( event[0], event[1] ).inspect}" ) unless match
  25          @current = match
  26 
  27          # Check for attributes
  28          case event[0]
  29          when :start_element
  30            #puts "Checking attributes"
  31            @attr_stack << event[2]
  32            begin
  33              sattr = [:start_attribute, nil]
  34              eattr = [:end_attribute]
  35              text = [:text, nil]
  36              k,v = event[2].find { |k,v| 
  37                sattr[1] = k
  38                #puts "Looking for #{sattr.inspect}"
  39                m = @current.next( sattr )
  40                #puts "Got #{m.inspect}"
  41                if m 
  42                  # If the state has text children...
  43                  #puts "Looking for #{eattr.inspect}"
  44                  #puts "Expect #{m.expected}"
  45                  if m.matches?( eattr )
  46                    #puts "Got end"
  47                    @current = m
  48                  else
  49                    #puts "Didn't get end"
  50                    text[1] = v
  51                    #puts "Looking for #{text.inspect}"
  52                    m = m.next( text )
  53                    #puts "Got #{m.inspect}"
  54                    text[1] = nil
  55                    return false unless m
  56                    @current = m if m
  57                  end
  58                  m = @current.next( eattr )
  59                  if m
  60                    @current = m
  61                    true
  62                  else
  63                    false
  64                  end
  65                else
  66                  false
  67                end
  68              }
  69              event[2].delete(k) if k
  70            end while k
  71          when :end_element
  72            attrs = @attr_stack.pop
  73            raise ValidationException.new( "Validation error.  Illegal "+
  74              " attributes: #{attrs.inspect}") if attrs.length > 0
  75          end
  76        end
  77      end
  78 
  79      class Event
  80        def initialize(event_type, event_arg=nil )
  81          @event_type = event_type
  82          @event_arg = event_arg
  83        end
  84 
  85        attr_reader :event_type
  86        attr_accessor :event_arg
  87 
  88        def done?
  89          @done
  90        end
  91 
  92        def single?
  93          return (@event_type != :start_element and @event_type != :start_attribute)
  94        end
  95 
  96        def matches?( event )
  97          #puts "#@event_type =? #{event[0]} && #@event_arg =? #{event[1]} "
  98          return false unless event[0] == @event_type
  99          case event[0]
 100          when nil
 101            return true
 102          when :start_element
 103            return true if event[1] == @event_arg
 104          when :end_element
 105            return true
 106          when :start_attribute
 107            return true if event[1] == @event_arg
 108          when :end_attribute
 109            return true
 110          when :end_document
 111            return true
 112          when :text
 113            return (@event_arg.nil? or @event_arg == event[1])
 114  =begin
 115          when :processing_instruction
 116            false
 117          when :xmldecl
 118            false
 119          when :start_doctype
 120            false
 121          when :end_doctype
 122            false
 123          when :externalentity
 124            false
 125          when :elementdecl
 126            false
 127          when :entity
 128            false
 129          when :attlistdecl
 130            false
 131          when :notationdecl
 132            false
 133          when :end_doctype
 134            false
 135  =end
 136          else
 137            false
 138          end
 139        end
 140 
 141        def ==( other )
 142          return false unless other.kind_of? Event
 143          @event_type == other.event_type and @event_arg == other.event_arg
 144        end
 145 
 146        def to_s
 147          inspect
 148        end
 149 
 150        def inspect
 151          "#{@event_type.inspect}( #@event_arg )"
 152        end
 153      end
 154    end
 155  end