Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Schema.pm @ 381:ced5937ff21a
Custom getters/setters support method names in theirs definitions
Initial support for localizable labels in DOM schemas
| author | cin |
|---|---|
| date | Wed, 22 Jan 2014 16:56:10 +0400 |
| parents | 4ddb27ff4a0b |
| children | 99ac2e19c0cc |
comparison
equal
deleted
inserted
replaced
| 380:1eca08048ba9 | 381:ced5937ff21a |
|---|---|
| 1 package IMPL::DOM::Schema; | 1 package IMPL::DOM::Schema; |
| 2 use strict; | 2 use strict; |
| 3 use warnings; | 3 use warnings; |
| 4 | 4 |
| 5 use IMPL::require { | 5 use File::Spec; |
| 6 ComplexNode => 'IMPL::DOM::Schema::ComplexNode', | 6 use IMPL::Const qw(:prop); |
| 7 ComplexType => 'IMPL::DOM::Schema::ComplexType', | 7 use IMPL::declare { |
| 8 SimpleNode => 'IMPL::DOM::Schema::SimpleNode', | 8 require => { |
| 9 SimpleType => 'IMPL::DOM::Schema::SimpleType', | 9 ComplexNode => 'IMPL::DOM::Schema::ComplexNode', |
| 10 Node => 'IMPL::DOM::Schema::Node', | 10 ComplexType => 'IMPL::DOM::Schema::ComplexType', |
| 11 AnyNode => 'IMPL::DOM::Schema::AnyNode', | 11 SimpleNode => 'IMPL::DOM::Schema::SimpleNode', |
| 12 NodeList => 'IMPL::DOM::Schema::NodeList', | 12 SimpleType => 'IMPL::DOM::Schema::SimpleType', |
| 13 NodeSet => 'IMPL::DOM::Schema::NodeSet', | 13 Node => 'IMPL::DOM::Schema::Node', |
| 14 Property => 'IMPL::DOM::Schema::Property', | 14 AnyNode => 'IMPL::DOM::Schema::AnyNode', |
| 15 SwitchNode => 'IMPL::DOM::Schema::SwitchNode', | 15 NodeList => 'IMPL::DOM::Schema::NodeList', |
| 16 Validator => 'IMPL::DOM::Schema::Validator', | 16 NodeSet => 'IMPL::DOM::Schema::NodeSet', |
| 17 Builder => 'IMPL::DOM::Navigator::Builder', | 17 Property => 'IMPL::DOM::Schema::Property', |
| 18 XMLReader => 'IMPL::DOM::XMLReader', # XMLReader references Schema | 18 SwitchNode => 'IMPL::DOM::Schema::SwitchNode', |
| 19 InflateFactory => 'IMPL::DOM::Schema::InflateFactory', | 19 Validator => 'IMPL::DOM::Schema::Validator', |
| 20 Loader => 'IMPL::Code::Loader' | 20 Builder => 'IMPL::DOM::Navigator::Builder', |
| 21 XMLReader => 'IMPL::DOM::XMLReader', # XMLReader references Schema | |
| 22 InflateFactory => 'IMPL::DOM::Schema::InflateFactory', | |
| 23 Loader => 'IMPL::Code::Loader', | |
| 24 StringMap => 'IMPL::Resources::StringLocaleMap' | |
| 25 }, | |
| 26 base => [ | |
| 27 'IMPL::DOM::Document' => sub { | |
| 28 nodeName => 'schema' | |
| 29 } | |
| 30 ], | |
| 31 props => [ | |
| 32 _TypesMap => PROP_RW | PROP_DIRECT, | |
| 33 baseDir => PROP_RW | PROP_DIRECT, | |
| 34 schemaName => PROP_RW | PROP_DIRECT, | |
| 35 BaseSchemas => PROP_RO | PROP_DIRECT, | |
| 36 stringMap => { | |
| 37 get => '_getStringMap', | |
| 38 direct => 1 | |
| 39 } | |
| 40 ] | |
| 21 }; | 41 }; |
| 22 | |
| 23 use parent qw(IMPL::DOM::Document); | |
| 24 use IMPL::Class::Property; | |
| 25 use File::Spec; | |
| 26 | |
| 27 our %CTOR = ( | |
| 28 'IMPL::DOM::Document' => sub { nodeName => 'schema' } | |
| 29 ); | |
| 30 | |
| 31 BEGIN { | |
| 32 private _direct property _TypesMap => prop_all; | |
| 33 public _direct property baseDir => prop_all; | |
| 34 public _direct property BaseSchemas => prop_get | owner_set; | |
| 35 } | |
| 36 | 42 |
| 37 my $validatorLoader = Loader->new(prefix => Validator, verifyNames => 1); | 43 my $validatorLoader = Loader->new(prefix => Validator, verifyNames => 1); |
| 38 | 44 |
| 39 #TODO rename and remove | 45 #TODO rename and remove |
| 40 sub resolveType { | 46 sub resolveType { |
| 69 } | 75 } |
| 70 | 76 |
| 71 return $this->SUPER::Create($nodeName,$class,$refArgs); | 77 return $this->SUPER::Create($nodeName,$class,$refArgs); |
| 72 } | 78 } |
| 73 | 79 |
| 80 sub _getStringMap { | |
| 81 my ($this) = @_; | |
| 82 | |
| 83 | |
| 84 | |
| 85 File::Spec->catdir($this->baseDir,'locale'); | |
| 86 } | |
| 87 | |
| 74 sub Process { | 88 sub Process { |
| 75 my ($this) = @_; | 89 my ($this) = @_; |
| 76 | 90 |
| 77 # process instructions | 91 # process instructions |
| 78 $this->Include($_) foreach map $_->nodeProperty('source'), $this->selectNodes('Include'); | 92 $this->Include($_) foreach map $_->nodeProperty('source'), $this->selectNodes('Include'); |
| 106 | 120 |
| 107 $reader->ParseFile($file); | 121 $reader->ParseFile($file); |
| 108 | 122 |
| 109 my $schema = $reader->Navigator->Document; | 123 my $schema = $reader->Navigator->Document; |
| 110 | 124 |
| 111 my ($vol,$dir) = File::Spec->splitpath($file); | 125 my ($vol,$dir,$name) = File::Spec->splitpath($file); |
| 126 | |
| 127 $name =~ s/\.xml$//; | |
| 112 | 128 |
| 113 $schema->baseDir($dir); | 129 $schema->baseDir($dir); |
| 130 $schema->schemaName($name); | |
| 114 | 131 |
| 115 my @errors = $class->MetaSchema->Validate($schema); | 132 my @errors = $class->MetaSchema->Validate($schema); |
| 116 | 133 |
| 117 die new IMPL::Exception("Schema is invalid",$file,map( $_->message, @errors ) ) if @errors; | 134 die new IMPL::Exception("Schema is invalid",$file,map( $_->message, @errors ) ) if @errors; |
| 118 | 135 |
