diff Lib/IMPL/DOM/Schema.pm @ 49:16ada169ca75

migrating to the Eclipse IDE
author wizard@linux-odin.local
date Fri, 26 Feb 2010 10:49:21 +0300
parents c2e7f7c96bcd
children 00d88c5e8203
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Schema.pm	Fri Feb 26 01:43:42 2010 +0300
+++ b/Lib/IMPL/DOM/Schema.pm	Fri Feb 26 10:49:21 2010 +0300
@@ -1,240 +1,240 @@
-package IMPL::DOM::Schema;
-use strict;
-use warnings;
-
-require IMPL::DOM::Schema::ComplexNode;
-require IMPL::DOM::Schema::ComplexType;
-require IMPL::DOM::Schema::SimpleNode;
-require IMPL::DOM::Schema::SimpleType;
-require IMPL::DOM::Schema::Node;
-require IMPL::DOM::Schema::AnyNode;
-require IMPL::DOM::Schema::NodeList;
-require IMPL::DOM::Schema::NodeSet;
-require IMPL::DOM::Schema::Property;
-require IMPL::DOM::Schema::SwitchNode;
-
-use base qw(IMPL::DOM::Document);
-use IMPL::Class::Property;
-use IMPL::Class::Property::Direct;
-
-our %CTOR = (
-    'IMPL::DOM::Document' => sub { nodeName => 'schema' }
-);
-
-BEGIN {
-    private _direct property _TypesMap => prop_all;
-    public _direct property BaseSchemas => prop_get | owner_set;
-    private _direct property _Validators => prop_all;
-}
-
-sub resolveType {
-    $_[0]->{$_TypesMap}->{$_[1]};
-}
-
-sub Create {
-    my ($this,$nodeName,$class,$refArgs) = @_;
-    
-    die new IMPL::Exception('Invalid node class') unless $class->isa('IMPL::DOM::Schema::Node');
-    
-    goto &SUPER::Create;
-}
-
-sub Process {
-    my ($this) = @_;
-    
-    $this->{$_TypesMap} = { map { $_->type, $_ } $this->selectNodes(sub { $_[0]->nodeName eq 'ComplexType' || $_[0]->nodeName eq 'SimpleType' } ) };
-}
-
-sub Validate {
-    my ($this,$node) = @_;
-    
-    if ( my ($schemaNode) = $this->selectNodes(sub { $_[0]->name eq $node->nodeName })) {
-        $schemaNode->Validate($node);
-    } else {
-        return new IMPL::DOM::Schema::ValidationError(Message=> "A specified document doesn't match the schema");
-    }
-}
-
-my $schema;
-
-sub MetaSchema {
-    
-    return $schema if $schema;
-    
-    $schema = new IMPL::DOM::Schema;
-    
-    $schema->appendRange(
-        IMPL::DOM::Schema::ComplexNode->new(name => 'schema')->appendRange(
-            IMPL::DOM::Schema::NodeSet->new()->appendRange(
-                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type => 'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::Node->new(name => 'ComplexType', type => 'ComplexType', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type => 'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::Node->new(name => 'SimpleType', type => 'SimpleType', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::SimpleNode->new(name => 'Include', minOccur => 0, maxOccur=>'unbounded')->appendRange(
-                    IMPL::DOM::Schema::Property->new(name => 'source')
-                )
-            ),
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'NodeSet', nativeType => 'IMPL::DOM::Schema::NodeSet')->appendRange(
-            IMPL::DOM::Schema::NodeSet->new()->appendRange(
-                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type => 'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type => 'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::SwitchNode->new(minOccur => 0, maxOccur => 1)->appendRange(
-                    IMPL::DOM::Schema::SimpleNode->new(name => 'AnyNode'),
-                    IMPL::DOM::Schema::Node->new(name => 'SwitchNode',type => 'SwitchNode')
-                )
-            )
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'SwitchNode', nativeType => 'IMPL::DOM::Schema::SwitchNode')->appendRange(
-            IMPL::DOM::Schema::NodeSet->new()->appendRange(
-                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type=>'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type=>'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
-            )
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'NodeList', nativeType => 'IMPL::DOM::Schema::NodeList')->appendRange(
-            IMPL::DOM::Schema::NodeSet->new()->appendRange(
-                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type => 'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type => 'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::Node->new(name => 'SwitchNode',type => 'SwitchNode', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
-                IMPL::DOM::Schema::SimpleNode->new(name => 'AnyNode', minOccur => 0, maxOccur=>'unbounded'),
-            )
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'ComplexType', nativeType => 'IMPL::DOM::Schema::ComplexType')->appendRange(
-            IMPL::DOM::Schema::NodeList->new()->appendRange(
-                IMPL::DOM::Schema::SwitchNode->new()->appendRange(
-                    IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'),
-                    IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'),
-                ),
-                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
-            ),
-            new IMPL::DOM::Schema::Property(name => 'type')
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'ComplexNode', nativeType => 'IMPL::DOM::Schema::ComplexNode')->appendRange(
-            IMPL::DOM::Schema::NodeList->new()->appendRange(
-                IMPL::DOM::Schema::SwitchNode->new()->appendRange(
-                    IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'),
-                    IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'),
-                ),
-                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
-            ),
-            new IMPL::DOM::Schema::Property(name => 'name')
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'SimpleType', nativeType => 'IMPL::DOM::Schema::SimpleType')->appendRange(
-            IMPL::DOM::Schema::NodeSet->new()->appendRange(
-                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
-            ),
-            new IMPL::DOM::Schema::Property(name => 'type')
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'SimpleNode', nativeType => 'IMPL::DOM::Schema::SimpleNode')->appendRange(
-            IMPL::DOM::Schema::NodeSet->new()->appendRange(
-                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
-            ),
-            new IMPL::DOM::Schema::Property(name => 'name')
-        ),
-        IMPL::DOM::Schema::ComplexType->new(type => 'Validator', nativeType => 'IMPL::DOM::Schema::Validator')->appendRange(
-            IMPL::DOM::Schema::NodeList->new()->appendRange(
-                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0)
-            ),
-            new IMPL::DOM::Schema::Property(name => 'name')
-        )
-    );
-    
-    $schema->Process;
-    
-    return $schema;
-}
-
-1;
-
-__END__
-
-=pod
-
-=head1 DESCRIPTION
-
-Схема документа. Наследует C<IMPL::DOM::Document>
-
-=head1 METHODS
-
-=over
-
-=item C<< $obj->Process() >>
-
-Обновляет таблицу типов из содержимого.
-
-=item C<< $obj->ResolveType($typeName) >>
-
-Возвращает схему типа c именем C<$typeName>.
-
-=back
-
-=head1 DESCRIPTION
-
-DOM схема - это документ, состоящий из определенных узлов, описывающая структуру
-других документов.
-
-=head1 META SCHEMA
-
-Схема для описания схемы, эта схема используется для постороения других схем
-
-<schema>
-    <ComplexNode name="schema">
-        <NodeSet>
-            <Node minOcuur="0" maxOccur="unbounded" name="ComplexNode" type="ComplexNode"/>
-            <Node minOcuur="0" maxOccur="unbounded" name="SimpleNode" type="SimpleNode"/>
-            <Node minOcuur="0" maxOccur="unbounded" name="ComplexType" type="ComplexType"/>
-            <Node minOcuur="0" maxOccur="unbounded" name="SimpleType" type="SimpleType"/>
-            <SimpleNode minOcuur="0" maxOccur="unbounded" name="Node"/>
-            <SimpleNode minOcuur="0" maxOccur="unbounded" name="Include"/>
-        </NodeSet>
-    </ComplexNode>
-    
-    <ComplexType type="NodeContainer">
-        <NodeSet>
-            <Node minOcuur="0" maxOccur="unbounded" name="ComplexNode" type="ComplexNode"/>
-            <Node minOcuur="0" maxOccur="unbounded" name="SimpleNode" type="SimpleNode"/>
-            <SimpleNode minOcuur="0" maxOccur="unbounded" name="Node"/>
-        </NodeSet>
-    </ComplexType>
-    
-    <ComplexType type="ComplexType">
-        <NodeList>
-            <Node name="NodeSet" type="NodeContainer" minOcuur=0/>
-            <Node name="NodeList" type="NodeContainer" minOccur=0/>
-            <AnyNode minOccur="0" maxOccur="unbounded"  type="Validator"/>
-        </NodeList>
-    </ComplexType>
-    
-    <ComplexType type="ComplexNode">
-        <NodeList>
-            <Node name="NodeSet" type="NodeContainer" minOcuur=0/>
-            <Node name="NodeList" type="NodeContainer" minOccur=0/>
-            <AnyNode minOccur="0" maxOccur="unbounded"  type="Validator"/>
-        </NodeList>
-    </ComplexType>
-    
-    <ComplexType type="SimpleNode">
-        <NodeSet>
-            <AnyNode minOccur=0 maxOccur="unbounded" type="Validator"/>
-        </NodeSet>
-    </ComplexType>
-    
-    <ComplexType type="SimpleType">
-        <NodeSet>
-            <AnyNode minOccur=0 maxOccur="unbounded" type="Validator"/>
-        </NodeSet>
-    </ComplexType>
-    
-    <ComplexType type="Validator">
-        <NodeSet>
-            <AnyNode minOccur=0 maxOccur="unbounded"/>
-        </NodeSet>
-    </ComplexType>
-    
-</schema>
-
-=cut
+package IMPL::DOM::Schema;
+use strict;
+use warnings;
+
+require IMPL::DOM::Schema::ComplexNode;
+require IMPL::DOM::Schema::ComplexType;
+require IMPL::DOM::Schema::SimpleNode;
+require IMPL::DOM::Schema::SimpleType;
+require IMPL::DOM::Schema::Node;
+require IMPL::DOM::Schema::AnyNode;
+require IMPL::DOM::Schema::NodeList;
+require IMPL::DOM::Schema::NodeSet;
+require IMPL::DOM::Schema::Property;
+require IMPL::DOM::Schema::SwitchNode;
+
+use base qw(IMPL::DOM::Document);
+use IMPL::Class::Property;
+use IMPL::Class::Property::Direct;
+
+our %CTOR = (
+    'IMPL::DOM::Document' => sub { nodeName => 'schema' }
+);
+
+BEGIN {
+    private _direct property _TypesMap => prop_all;
+    public _direct property BaseSchemas => prop_get | owner_set;
+    private _direct property _Validators => prop_all;
+}
+
+sub resolveType {
+    $_[0]->{$_TypesMap}->{$_[1]};
+}
+
+sub Create {
+    my ($this,$nodeName,$class,$refArgs) = @_;
+    
+    die new IMPL::Exception('Invalid node class') unless $class->isa('IMPL::DOM::Schema::Node');
+    
+    goto &SUPER::Create;
+}
+
+sub Process {
+    my ($this) = @_;
+    
+    $this->{$_TypesMap} = { map { $_->type, $_ } $this->selectNodes(sub { $_[0]->nodeName eq 'ComplexType' || $_[0]->nodeName eq 'SimpleType' } ) };
+}
+
+sub Validate {
+    my ($this,$node) = @_;
+    
+    if ( my ($schemaNode) = $this->selectNodes(sub { $_[0]->name eq $node->nodeName })) {
+        $schemaNode->Validate($node);
+    } else {
+        return new IMPL::DOM::Schema::ValidationError(Message=> "A specified document doesn't match the schema");
+    }
+}
+
+my $schema;
+
+sub MetaSchema {
+    
+    return $schema if $schema;
+    
+    $schema = new IMPL::DOM::Schema;
+    
+    $schema->appendRange(
+        IMPL::DOM::Schema::ComplexNode->new(name => 'schema')->appendRange(
+            IMPL::DOM::Schema::NodeSet->new()->appendRange(
+                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type => 'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::Node->new(name => 'ComplexType', type => 'ComplexType', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type => 'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::Node->new(name => 'SimpleType', type => 'SimpleType', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::SimpleNode->new(name => 'Include', minOccur => 0, maxOccur=>'unbounded')->appendRange(
+                    IMPL::DOM::Schema::Property->new(name => 'source')
+                )
+            ),
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'NodeSet', nativeType => 'IMPL::DOM::Schema::NodeSet')->appendRange(
+            IMPL::DOM::Schema::NodeSet->new()->appendRange(
+                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type => 'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type => 'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::SwitchNode->new(minOccur => 0, maxOccur => 1)->appendRange(
+                    IMPL::DOM::Schema::SimpleNode->new(name => 'AnyNode'),
+                    IMPL::DOM::Schema::Node->new(name => 'SwitchNode',type => 'SwitchNode')
+                )
+            )
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'SwitchNode', nativeType => 'IMPL::DOM::Schema::SwitchNode')->appendRange(
+            IMPL::DOM::Schema::NodeSet->new()->appendRange(
+                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type=>'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type=>'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
+            )
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'NodeList', nativeType => 'IMPL::DOM::Schema::NodeList')->appendRange(
+            IMPL::DOM::Schema::NodeSet->new()->appendRange(
+                IMPL::DOM::Schema::Node->new(name => 'ComplexNode', type => 'ComplexNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::Node->new(name => 'SimpleNode', type => 'SimpleNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::Node->new(name => 'SwitchNode',type => 'SwitchNode', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::SimpleNode->new(name => 'Node', minOccur => 0, maxOccur=>'unbounded'),
+                IMPL::DOM::Schema::SimpleNode->new(name => 'AnyNode', minOccur => 0, maxOccur=>'unbounded'),
+            )
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'ComplexType', nativeType => 'IMPL::DOM::Schema::ComplexType')->appendRange(
+            IMPL::DOM::Schema::NodeList->new()->appendRange(
+                IMPL::DOM::Schema::SwitchNode->new()->appendRange(
+                    IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'),
+                    IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'),
+                ),
+                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
+            ),
+            new IMPL::DOM::Schema::Property(name => 'type')
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'ComplexNode', nativeType => 'IMPL::DOM::Schema::ComplexNode')->appendRange(
+            IMPL::DOM::Schema::NodeList->new()->appendRange(
+                IMPL::DOM::Schema::SwitchNode->new()->appendRange(
+                    IMPL::DOM::Schema::Node->new(name => 'NodeSet', type => 'NodeSet'),
+                    IMPL::DOM::Schema::Node->new(name => 'NodeList',type => 'NodeList'),
+                ),
+                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
+            ),
+            new IMPL::DOM::Schema::Property(name => 'name')
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'SimpleType', nativeType => 'IMPL::DOM::Schema::SimpleType')->appendRange(
+            IMPL::DOM::Schema::NodeSet->new()->appendRange(
+                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
+            ),
+            new IMPL::DOM::Schema::Property(name => 'type')
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'SimpleNode', nativeType => 'IMPL::DOM::Schema::SimpleNode')->appendRange(
+            IMPL::DOM::Schema::NodeSet->new()->appendRange(
+                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0, type=>'Validator')
+            ),
+            new IMPL::DOM::Schema::Property(name => 'name')
+        ),
+        IMPL::DOM::Schema::ComplexType->new(type => 'Validator', nativeType => 'IMPL::DOM::Schema::Validator')->appendRange(
+            IMPL::DOM::Schema::NodeList->new()->appendRange(
+                IMPL::DOM::Schema::AnyNode->new(maxOccur => 'unbounded', minOccur => 0)
+            ),
+            new IMPL::DOM::Schema::Property(name => 'name')
+        )
+    );
+    
+    $schema->Process;
+    
+    return $schema;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 DESCRIPTION
+
+Схема документа. Наследует C<IMPL::DOM::Document>
+
+=head1 METHODS
+
+=over
+
+=item C<< $obj->Process() >>
+
+Обновляет таблицу типов из содержимого.
+
+=item C<< $obj->ResolveType($typeName) >>
+
+Возвращает схему типа c именем C<$typeName>.
+
+=back
+
+=head1 DESCRIPTION
+
+DOM схема - это документ, состоящий из определенных узлов, описывающая структуру
+других документов.
+
+=head1 META SCHEMA
+
+Схема для описания схемы, эта схема используется для постороения других схем
+
+<schema>
+    <ComplexNode name="schema">
+        <NodeSet>
+            <Node minOcuur="0" maxOccur="unbounded" name="ComplexNode" type="ComplexNode"/>
+            <Node minOcuur="0" maxOccur="unbounded" name="SimpleNode" type="SimpleNode"/>
+            <Node minOcuur="0" maxOccur="unbounded" name="ComplexType" type="ComplexType"/>
+            <Node minOcuur="0" maxOccur="unbounded" name="SimpleType" type="SimpleType"/>
+            <SimpleNode minOcuur="0" maxOccur="unbounded" name="Node"/>
+            <SimpleNode minOcuur="0" maxOccur="unbounded" name="Include"/>
+        </NodeSet>
+    </ComplexNode>
+    
+    <ComplexType type="NodeContainer">
+        <NodeSet>
+            <Node minOcuur="0" maxOccur="unbounded" name="ComplexNode" type="ComplexNode"/>
+            <Node minOcuur="0" maxOccur="unbounded" name="SimpleNode" type="SimpleNode"/>
+            <SimpleNode minOcuur="0" maxOccur="unbounded" name="Node"/>
+        </NodeSet>
+    </ComplexType>
+    
+    <ComplexType type="ComplexType">
+        <NodeList>
+            <Node name="NodeSet" type="NodeContainer" minOcuur=0/>
+            <Node name="NodeList" type="NodeContainer" minOccur=0/>
+            <AnyNode minOccur="0" maxOccur="unbounded"  type="Validator"/>
+        </NodeList>
+    </ComplexType>
+    
+    <ComplexType type="ComplexNode">
+        <NodeList>
+            <Node name="NodeSet" type="NodeContainer" minOcuur=0/>
+            <Node name="NodeList" type="NodeContainer" minOccur=0/>
+            <AnyNode minOccur="0" maxOccur="unbounded"  type="Validator"/>
+        </NodeList>
+    </ComplexType>
+    
+    <ComplexType type="SimpleNode">
+        <NodeSet>
+            <AnyNode minOccur=0 maxOccur="unbounded" type="Validator"/>
+        </NodeSet>
+    </ComplexType>
+    
+    <ComplexType type="SimpleType">
+        <NodeSet>
+            <AnyNode minOccur=0 maxOccur="unbounded" type="Validator"/>
+        </NodeSet>
+    </ComplexType>
+    
+    <ComplexType type="Validator">
+        <NodeSet>
+            <AnyNode minOccur=0 maxOccur="unbounded"/>
+        </NodeSet>
+    </ComplexType>
+    
+</schema>
+
+=cut