Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Schema.pm @ 102:cf3b6ef2be22
Schema beta version
| author | wizard |
|---|---|
| date | Fri, 07 May 2010 08:05:23 +0400 |
| parents | d8dc6cad3f55 |
| children | c289ed9662ca |
comparison
equal
deleted
inserted
replaced
| 101:d8dc6cad3f55 | 102:cf3b6ef2be22 |
|---|---|
| 34 | 34 |
| 35 sub resolveType { | 35 sub resolveType { |
| 36 $_[0]->{$_TypesMap}->{$_[1]}; | 36 $_[0]->{$_TypesMap}->{$_[1]}; |
| 37 } | 37 } |
| 38 | 38 |
| 39 sub CTOR { | |
| 40 my ($this,%args) = @_; | |
| 41 | |
| 42 $this->{$baseDir} = ($args{baseDir} || '.'); | |
| 43 } | |
| 44 | |
| 39 sub Create { | 45 sub Create { |
| 40 my ($this,$nodeName,$class,$refArgs) = @_; | 46 my ($this,$nodeName,$class,$refArgs) = @_; |
| 41 | 47 |
| 42 die new IMPL::Exception('Invalid node class') unless $class->isa('IMPL::DOM::Node'); | 48 die new IMPL::Exception('Invalid node class') unless $class->isa('IMPL::DOM::Node'); |
| 43 | 49 |
| 44 if ($class->isa('IMPL::DOM::Schema::Validator')) { | 50 if ($class->isa('IMPL::DOM::Schema::Validator')) { |
| 45 $class = "IMPL::DOM::Schema::Validator::$nodeName"; | 51 $class = "IMPL::DOM::Schema::Validator::$nodeName"; |
| 46 local $@; | |
| 47 unless (eval {$class->can('new')}) { | 52 unless (eval {$class->can('new')}) { |
| 48 eval "require $class; 1;"; | 53 eval "require $class; 1;"; |
| 49 my $e = $@; | 54 my $e = $@; |
| 50 die new IMPL::Exception("Invalid validator",$class,$e) if $e; | 55 die new IMPL::Exception("Invalid validator",$class,$e) if $e; |
| 51 } | 56 } |
| 65 } | 70 } |
| 66 | 71 |
| 67 sub Include { | 72 sub Include { |
| 68 my ($this,$file) = @_; | 73 my ($this,$file) = @_; |
| 69 | 74 |
| 70 my $schema = $this->LoadSchema($file); | 75 my $schema = $this->LoadSchema(File::Spec->catfile($this->baseDir, $file)); |
| 71 | 76 |
| 72 $this->appendRange( $schema->childNodes ); | 77 $this->appendRange( $schema->childNodes ); |
| 73 } | 78 } |
| 74 | 79 |
| 75 sub LoadSchema { | 80 sub LoadSchema { |
| 76 my ($this,$file,$base) = @_; | 81 my ($this,$file) = @_; |
| 82 | |
| 83 $file = File::Spec->rel2abs($file); | |
| 77 | 84 |
| 78 my $class = ref $this || $this; | 85 my $class = ref $this || $this; |
| 79 | 86 |
| 80 my $reader = new IMPL::DOM::XMLReader( | 87 my $reader = new IMPL::DOM::XMLReader( |
| 81 Navigator => new IMPL::DOM::Navigator::Builder( | 88 Navigator => new IMPL::DOM::Navigator::Builder( |
| 82 $class, | 89 $class, |
| 83 $class->MetaSchema | 90 $class->MetaSchema |
| 84 ) | 91 ) |
| 85 ); | 92 ); |
| 86 | 93 |
| 87 $reader->ParseFile($file) or die new IMPL::Exception("Failed to load a schema",$file); | 94 $reader->ParseFile($file); |
| 88 | 95 |
| 89 my $schema = $reader->Navigator->Document; | 96 my $schema = $reader->Navigator->Document; |
| 90 | 97 |
| 91 my ($vol,$dir) = File::Spec->splitpath($file); | 98 my ($vol,$dir) = File::Spec->splitpath($file); |
| 92 | 99 |
| 163 IMPL::DOM::Schema::NodeList->new()->appendRange( | 170 IMPL::DOM::Schema::NodeList->new()->appendRange( |
| 164 IMPL::DOM::Schema::SwitchNode->new()->appendRange( | 171 IMPL::DOM::Schema::SwitchNode->new()->appendRange( |
| 165 IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'), | 172 IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'), |
| 166 IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'), | 173 IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'), |
| 167 ), | 174 ), |
| 175 IMPL::DOM::Schema::Node->new(name => 'Property', type=>'Property', maxOccur=>'unbounded', minOccur=>0), | |
| 168 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') | 176 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') |
| 169 ), | 177 ), |
| 170 new IMPL::DOM::Schema::Property(name => 'type') | 178 new IMPL::DOM::Schema::Property(name => 'type') |
| 171 ), | 179 ), |
| 172 IMPL::DOM::Schema::ComplexType->new(type => 'ComplexNode', nativeType => 'IMPL::DOM::Schema::ComplexNode')->appendRange( | 180 IMPL::DOM::Schema::ComplexType->new(type => 'ComplexNode', nativeType => 'IMPL::DOM::Schema::ComplexNode')->appendRange( |
| 173 IMPL::DOM::Schema::NodeList->new()->appendRange( | 181 IMPL::DOM::Schema::NodeList->new()->appendRange( |
| 174 IMPL::DOM::Schema::SwitchNode->new()->appendRange( | 182 IMPL::DOM::Schema::SwitchNode->new()->appendRange( |
| 175 IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'), | 183 IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'), |
| 176 IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'), | 184 IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'), |
| 177 ), | 185 ), |
| 186 IMPL::DOM::Schema::Node->new(name => 'Property', type=>'Property', maxOccur=>'unbounded', minOccur=>0), | |
| 178 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') | 187 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') |
| 179 ), | 188 ), |
| 180 new IMPL::DOM::Schema::Property(name => 'name') | 189 new IMPL::DOM::Schema::Property(name => 'name') |
| 181 ), | 190 ), |
| 182 IMPL::DOM::Schema::ComplexType->new(type => 'SimpleType', nativeType => 'IMPL::DOM::Schema::SimpleType')->appendRange( | 191 IMPL::DOM::Schema::ComplexType->new(type => 'SimpleType', nativeType => 'IMPL::DOM::Schema::SimpleType')->appendRange( |
| 183 IMPL::DOM::Schema::NodeSet->new()->appendRange( | 192 IMPL::DOM::Schema::NodeList->new()->appendRange( |
| 193 IMPL::DOM::Schema::Node->new(name => 'Property', type=>'Property', maxOccur=>'unbounded', minOccur=>0), | |
| 184 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') | 194 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') |
| 185 ), | 195 ), |
| 186 new IMPL::DOM::Schema::Property(name => 'type') | 196 new IMPL::DOM::Schema::Property(name => 'type') |
| 187 ), | 197 ), |
| 188 IMPL::DOM::Schema::ComplexType->new(type => 'SimpleNode', nativeType => 'IMPL::DOM::Schema::SimpleNode')->appendRange( | 198 IMPL::DOM::Schema::ComplexType->new(type => 'SimpleNode', nativeType => 'IMPL::DOM::Schema::SimpleNode')->appendRange( |
| 189 IMPL::DOM::Schema::NodeSet->new()->appendRange( | 199 IMPL::DOM::Schema::NodeList->new()->appendRange( |
| 200 IMPL::DOM::Schema::Node->new(name => 'Property', type=>'Property', maxOccur=>'unbounded', minOccur=>0), | |
| 190 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') | 201 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator') |
| 191 ), | 202 ), |
| 192 new IMPL::DOM::Schema::Property(name => 'name') | 203 new IMPL::DOM::Schema::Property(name => 'name') |
| 193 ), | 204 ), |
| 194 IMPL::DOM::Schema::ComplexType->new(type => 'Validator', nativeType => 'IMPL::DOM::Schema::Validator')->appendRange( | 205 IMPL::DOM::Schema::ComplexType->new(type => 'Validator', nativeType => 'IMPL::DOM::Schema::Validator')->appendRange( |
| 195 IMPL::DOM::Schema::NodeList->new()->appendRange( | 206 IMPL::DOM::Schema::NodeList->new()->appendRange( |
| 196 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0) | 207 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0) |
| 197 ) | 208 ) |
| 209 ), | |
| 210 IMPL::DOM::Schema::ComplexType->new(type => 'Property', nativeType => 'IMPL::DOM::Schema::Property' )->appendRange( | |
| 211 IMPL::DOM::Schema::NodeList->new()->appendRange( | |
| 212 IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0) | |
| 213 ), | |
| 214 IMPL::DOM::Schema::Property->new(name => 'name') | |
| 198 ) | 215 ) |
| 199 ); | 216 ); |
| 200 | 217 |
| 201 $schema->Process; | 218 $schema->Process; |
| 202 | 219 |
