module REXML::Validation::Validator

Constants

NILEVENT

Public Instance Methods

dump() click to toggle source
# File lib/rexml/validation/validation.rb, line 14
def dump
  puts @root.inspect
end
reset() click to toggle source
# File lib/rexml/validation/validation.rb, line 7
def reset
  @current = @root
  @root.reset
  @root.previous = true
  @attr_stack = []
  self
end
validate( event ) click to toggle source
# File lib/rexml/validation/validation.rb, line 17
def validate( event )
  #puts "Current: #@current"
  #puts "Event: #{event.inspect}"
  @attr_stack = [] unless defined? @attr_stack
  match = @current.next(event)
  raise ValidationException.new( "Validation error.  Expected: "+
    @current.expected.join( " or " )+" from #{@current.inspect} "+
    " but got #{Event.new( event[0], event[1] ).inspect}" ) unless match
  @current = match

  # Check for attributes
  case event[0]
  when :start_element
    #puts "Checking attributes"
    @attr_stack << event[2]
    begin
      sattr = [:start_attribute, nil]
      eattr = [:end_attribute]
      text = [:text, nil]
      k, = event[2].find { |key,value|
        sattr[1] = key
        #puts "Looking for #{sattr.inspect}"
        m = @current.next( sattr )
        #puts "Got #{m.inspect}"
        if m
          # If the state has text children...
          #puts "Looking for #{eattr.inspect}"
          #puts "Expect #{m.expected}"
          if m.matches?( eattr )
            #puts "Got end"
            @current = m
          else
            #puts "Didn't get end"
            text[1] = value
            #puts "Looking for #{text.inspect}"
            m = m.next( text )
            #puts "Got #{m.inspect}"
            text[1] = nil
            return false unless m
            @current = m if m
          end
          m = @current.next( eattr )
          if m
            @current = m
            true
          else
            false
          end
        else
          false
        end
      }
      event[2].delete(k) if k
    end while k
  when :end_element
    attrs = @attr_stack.pop
    raise ValidationException.new( "Validation error.  Illegal "+
      " attributes: #{attrs.inspect}") if attrs.length > 0
  end
end