Module: @QName: Util:DIS @FullName: @@lang: en @@@: Object Model @Namespace: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS# @Description: @@lang:en @@@: This module provides an object model for document format. @Author: @@FullName: Wakaba @@Mail: w@suika.fam.cx @License: @@@: license:Perl+MPL @@Original: @@@FullName: manakai @@@Year:2004 @@@Author: @@@@FullName:Wakaba @@@@Mail:w@suika.fam.cx @Date: @@@: $Date: 2005/02/22 08:21:00 $ @@ContentType: dis:Date.RCS @Require: @@Module: @@@Name: SuikaWikiConfig21 @@@WithFor: ManakaiDOM:Perl @defaultFor: ForLatest Namespace: @DIS: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS# @dis: http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-- @dis2pm: http://suika.fam.cx/~wakaba/archive/2004/11/8/dis2pm# @lang: http://suika.fam.cx/~wakaba/archive/2004/8/18/lang# @license: http://suika.fam.cx/~wakaba/archive/2004/8/18/license# @ManakaiDOM: http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom# @owl: http://www.w3.org/2002/07/owl# @Perl: http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#Perl-- @rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# @rdfs: http://www.w3.org/2000/01/rdf-schema# @TreeCore:\ @Util: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/ ## -- "For" definitions ForDef: @QName: DIS:ForLatest @Description: @@lang:en @@@: For latest version of the module implementation @ISA: ManakaiDOM:Perl ## -- Features ElementTypeBinding: @Name: FeatureDef @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: DOMMain:DOMFeature @@AliasFor: @@@@: ::ManakaiDOM:all @@@For: !=ManakaiDOM:all ElementTypeBinding: @Name: FeatureVerDef @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: DOMMain:DOMFeature ElementTypeBinding: @Name: featureQName @ElementType: dis:AppName @ShadowContent: @@ContentType: dis:TypeQName FeatureDef: @QName: Core @FeatureVerDef: @@QName: CoreFeature10 @@Version: 1.0 @@ISA: Core @@FullName: @@@lang:en @@@@: The object model, version 1.0 @@Description: @@@lang:en @@@@: The object model, version 1.0. @@DOMMain:requireFeature: swcfg21:CoreFeature21 ## -- SuikaWikiConfig/2.1 extended classes ClsDef: @ClsQName: ManakaiDISImplementation @ClsISA: swcfg21:SWCFGImplementation @Description: @@lang:en @@@: A implementation object. @Method: @@Name: createDISDocument @@Description: @@@lang:en @@@@: Creates an empty object. @@Return: @@@Type:ManakaiDISDocument @@@Description: @@@@lang:en @@@@@: The newly created document object. @@@PerlDef: $r = $self->; $r-> (); @Method: @@Name: createDISParser @@Description: @@@lang:en @@@@: Creates a object. @@Return: @@@Type: ManakaiDISParser @@@Description: @@@@lang:en @@@@@: A newly created parser. @@@PerlDef: $r = bless $self->, ; @Method: @@Name: createDISDatabase @@Description: @@@lang:en @@@@: Creates a new database. @@Return: @@@Type:ManakaiDISDatabase @@Description: @@@lang:en @@@@: A newly created parser. @@PerlDef: $r = bless { forDef => { => { uri => , isa => { => 1}, revISA => {}, }, }, resDef => {}, }, ; ##DISImplementation ClsDef: @ClsQName: ManakaiDISParser @ClsISA: swcfg21:SWCFGParser @Description: @@lang:en @@@: A SuikaWikiConfig/2.1 parser that returns object. @Method: @Name: parse @Description: @@lang:en @@@: Parses a document and returns it as an object tree. @Param: @@Name: input @@Type: DOMLS:LSInput @@Description: @@@lang:en @@@@: The input source. @Return: @@Type: DISDocument @@Description: @@@lang:en @@@@: The document object created from the . @@@RaiseException: @@@@@: swcfg21:SWCFG_PARSE_ERR @@@@Description: @@@@@lang:en @@@@@@: The was unable to load the SuikaWikiConfig document. @@@PerlDef: __DEEP{ $r = $self-> ($input); }__; if (defined $r) { $r = bless $r, ; } ##DISParser ClsDef: @ClsQName: ManakaiDISNode @ClsISA: swcfg21:ManakaiSWCFGNode @Description: @@lang:en @@@: node objects. @MethodRedef: @@Name:lookupNamespacePrefix @@Description: @@@lang:en @@@@: Looks up the namespace prefix associated to the given namespace URI. The default namespaces are ignored. @@Param: @@@Name:namespaceURI @@@Type: swcfg21:SWCFGString @@@Description: @@@@lang:en @@@@@: The namespace URI to look for. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: The namespace. @@NamedParam: @@@Name: makeNewBinding @@@Type: DOMMain:boolean @@@Description: @@@@lang:en @@@@@: Whether a new namespace prefix should be bound when no namespace URI has been associated yet. @@@InCase: @@@@Value:true @@@@Description: @@@@@lang:en @@@@@@: New binding is made if no prefix associated. @@@InCase: @@@@Value:false @@@@Description: @@@@@lang:en @@@@@@: Simply returns the if no prefix associated. @@Return: @@@Type: swcfg21:SWCFGString @@@Description: @@@@lang:en @@@@@: An associated namespace prefix. If more than one prefix are associated to the namespace URI, the returned prefix is implementation dependent. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Type: swcfg21:SWCFGString @@@@Description: @@@@@lang:en @@@@@@: No associated namespace prefix found. @@@PerlDef: $r = null; my $od = $self-> || $self; my $binds = $od->{}->{}; if (defined $namespaceURI) { FIND: { for my $prefix (keys %$binds) { if (defined $binds->{$prefix} and $binds->{$prefix} eq $namespaceURI) { $r = $prefix; last FIND; } } last FIND unless $makeNewBinding; ## Not found if ($namespaceURI =~ /(\w+)$/) { my $prefix = $1; unless (exists $binds->{$prefix}) { $binds->{$prefix} = $namespaceURI; $r = $prefix; last FIND; } } my $i = 1; { unless (exists $binds->{'ns'.$i}) { $binds->{$r = 'ns'.$i} = $namespaceURI; last FIND; } $i++; redo; } } # FIND } else { ## Null namespace FIND: { if (exists $binds->{'nu'.'ll'} and not defined $binds->{'nu'.'ll'}) { $r = 'nu'.'ll'; last FIND; } for my $prefix (keys %$binds) { if (not defined $prefix) { $r = $prefix; last FIND; } } last FIND unless $makeNewBinding; ## Not found my $i = ''; { unless (exists $binds->{'nu'.'ll'.$i}) { $binds->{$r = 'nu'.'ll'.$i} = null; last FIND; } $i++; redo; } } } ## TODO: Module ns support @MethodRedef: @@Name:lookupNamespaceURI @@Description: @@@lang:en @@@@: Looks up the namespace URI associated to the given prefix. @@Param: @@@Name:prefix @@@Type: swcfg21:SWCFGString @@@Description: @@@@lang:en @@@@@: The namespace URI to look for. @@NamedParam: @@@Name: makeNewBinding @@@Type: DOMMain:boolean @@@Description: @@@@lang:en @@@@@: Whether a new binding should be created if no namespace URI is associated with the or not. @@@InCase: @@@@Value:true @@@@Description: @@@@@lang:en @@@@@@: A new binding to the temporary namespace URI exactly same as is created if no binding found. @@@InCase: @@@@Value:false @@@@Description: @@@@@lang:en @@@@@@: No new binding is created if no binding found. Note that even if no association newly created, this method returns the value. @@Return: @@@Type: swcfg21:SWCFGString @@@Description: @@@@lang:en @@@@@:The associated namespace URI. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Type: swcfg21:SWCFGString @@@@Description: @@@@@lang:en @@@@@@: No namespace prefix is associated to the prefix or the namespace is associated. @@@PerlDef: my $od = $self-> || $self; my $binds = $od->{}->{}; if (exists $binds->{$prefix}) { $r = $binds->{$prefix}; } elsif ($makeNewBinding) { $r = $binds->{$prefix} = $prefix; } else { $r = null; } ## TODO: Module ns support @IntMethod: @@Name:getNodeReference @@Description: @@@lang:en @@@@: Returns a new reference to the node object. @@ManakaiDOM:isStatic:1 @@Param: @@@Name:object @@@Type: ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl @@@Description: @@@@lang:en @@@@@: The node object to be referred. @@Return: @@@Type: ManakaiDISNode @@@Description: @@@@lang:en @@@@@: A newly created reference. @@@PerlDef: my $class; if ($object->{} eq '#element') { $class = ; } elsif ($object->{} eq '#comment') { $class = ; } elsif ($object->{} eq '#document') { $class = ; } elsif ($object->{} eq '#fragment') { $class = ; } else { __ASSERT{DISPerl:invariant:: msg => {qq[Node type: "$object->{}" ]. qq[(ref: "@{[ref $object]}")]}, }__; } $r = $object-> ($class); @Attr: @@Name:ownerDISDocument @@NewIn21: @@Description: @@@lang:en @@@@: The document object associated with this node. @@Get: @@@Type:DISDocument @@@Description: @@@@lang:en @@@@@: The document object associated with this node. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Type:DISDocument @@@@Description: @@@@@lang:en @@@@@@: This node is a document node. @@@PerlDef: $r = ($self->{}->{}) if $self->{}->{}; ##DISNode ClsDef: @ClsQName: ManakaiDISElement @ClsISA: swcfg21:ManakaiSWCFGElement @ClsISA: ManakaiDISNode @Description: @@lang:en @@@: element node objects. @Method: @@Name: forMatch @@Description: @@@lang:en @@@@: Tests whether this element is for a or not. @@Param: @@@Name: forArg @@@Type: ForURI @@@Description: @@@@lang:en @@@@@: The URI reference to test against. @@Param: @@@Name: forpArg @@@Type: ForURIList @@@Description: @@@@lang:en @@@@@: The URI references to test against. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: No additional URI reference. @@Return: @@@Type: DOMMain:boolean @@@Description: @@@@lang:en @@@@@: Whether this element is for and or not. @@@UndeclaredPrefixException: @@@NoDBException: @@@PerlDef: $for_arg = unless defined $for_arg; $forp_arg ||= []; FORMATCH: { __DEEP{ my @ce = @{$self->}; for my $ce (@ce) { my $et = $ce->; if ($et eq ) { my $for = [split /\s+/, $ce->]; FCs: for my $f (@$for) { if ($f =~ /^!=(.+)$/) { ## -- NOT EQUAL TO my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); for my $arg_uri ($for_arg, @{$forp_arg}) { if ($uri eq $arg_uri) { $r = false; last FORMATCH; } } } elsif ($f =~ /^!(.+)$/) { ## -- NOT ISA my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); for my $arg_uri ($for_arg, @{$forp_arg}) { if ($f-> ($arg_uri)) { $r = false; last FORMATCH; } } } elsif ($f =~ /^=(.+)$/) { ## -- EQUAL TO my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); for my $arg_uri ($for_arg, @{$forp_arg}) { if ($arg_uri eq $uri) { next FCs; } } $r = false; last FORMATCH; } else { ## -- ISA my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); for my $arg_uri ($for_arg, @{$forp_arg}) { if ($f-> ($arg_uri)) { next FCs; } } $r = false; last FORMATCH; } } # FCs } # dis:ForCheck } # children my $has_for = false; for my $ce (@ce) { if ($self-> eq ) { my $for = [split /\s+/, $ce->]; my $ok = true; $has_for = true; AFOR: for my $f (@$for) { if ($f =~ /^!=(.+)$/) { ## -- NOT EQUAL TO my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); if ($uri eq $for_arg) { $ok = false; last AFOR; } } elsif ($f =~ /^!(.+)$/) { ## -- NOT ISA my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); if ($f-> ($for_arg)) { $ok = false; last AFOR; } } elsif ($f =~ /^=(.+)$/) { ## -- EQUAL TO my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); unless ($uri eq $for_arg) { $ok = false; last AFOR; } } else { ## -- ISA my $uri = $self-> ($1); my $f = $self-> -> -> ($uri); $f-> ($ce); unless ($f-> ($for_arg)) { $ok = false; last AFOR; } } } # AFOR } # dis:For if ($ok) { $r = true; last FORMATCH; } } # $ce $r = $has_for ? false : true; }__; } # FORMATCH @Method: @@Name: mediaTypeMatch @@Description: @@@lang:en @@@@: Tests whether the content media type of this element matches to a type or not. @@Param: @@@Name: mediaType @@@Type: MediaTypeURI @@@Description: @@@@lang:en @@@@@: A media type URI reference to test against. @@Param: @@@Name: mediaTypeDefault @@@Type: MediaTypeURI @@@Description: @@@@lang:en @@@@@: The default media type for this element. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: No default type provided. All will match. @@Return: @@@Type: DOMMain:boolean @@@Description: @@@@lang:en @@@@@: Whether this element is of or not. @@@PerlDef: if (defined $mediaType) { __DEEP{ my $ctn = $self-> (); my $ct; $ct = $ctn-> if $ctn; $ct = $defaultMediaType unless defined $ct; my $res = $self-> -> -> ($ct); $res-> ($ctn or $self); unless ($res-> ($ct)) { $r = false; } else { $r = true; } }__; } else { $r = true; } @Method: @@Name: prefixToURI @@Description: @@@lang:en @@@@: Converts a namespace prefix into associated URI reference. @@Param: @@@Name: prefix @@@Type: swcfg21:SWCFGString @@@Description: @@@@lang:en @@@@@: A namespace prefix to look for. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: Returns the default namespace URI. @@NodeParam: @@Return: @@@Type: swcfg21:SWCFGString @@@Description: @@@@lang:en @@@@@: The URI references associated. @@@UndeclaredPrefixException: @@@PerlDef: if (defined $param) { __DEEP{ $r = $self-> ($prefix); }__; unless (defined $r) { __EXCEPTION{UNDECLARED_NS_PREFIX_ERR:: infoset:prefix => {$prefix}, MDOMX:param-name => 'prefix', DIS:sourceNode => {$node}, }__; } } else { ## TODO: default namespace } @Method: @@QName: qnameToURI @@Description: @@@lang:en @@@@: Converts a qualified name () to an expanded URI reference. @@Param: @@@Name: qname @@@Type: dis:TypeQName @@@Description: @@@@lang:en @@@@@: A qualified name. @@NodeParam: @@Return: @@@Type: AnyURI @@@Description: @@@@lang:en @@@@@: The expanded URI reference. @@@UndeclaredPrefixException: @@@PerlDef: $qname =~ s/^\s+//; $qname =~ s/\s+$//; my ($prefix, $lname) = split /:/, $qname; __DEEP{ if (defined $lname) { $r = $self-> ($prefix) . $lname; } else { ## In default namespace $r = $self-> (null) . $prefix; } } @Method: @@QName: qnameToPair @@Description: @@@lang:en @@@@: Converts a qualified name () to a pair of namespace URI and local name. @@Param: @@@Name: qname @@@Type: dis:TypeQName @@@Description: @@@@lang:en @@@@@: A qualified name. @@NodeParam: @@Return: @@@Type: Perl:ARRAY @@@Description: @@@@lang:en @@@@@: A list of namespace URI and local name. @@@UndeclaredPrefixException: @@@PerlDef: $qname =~ s/^\s+//; $qname =~ s/\s+$//; my ($prefix, $lname) = split /:/, $qname; __DEEP{ if (defined $lname) { $r = [$self-> ($prefix), $lname]; } else { ## In default namespace $r = [$self-> (null), $prefix]; } } @Method: @@Name: typeforqnamesToURI @@Description: @@@lang:en @@@@: Converts a into an expanded URI reference. @@Param: @@@Name: tfqnames @@@Type: dis:TypeForQNames @@@Description: @@@@lang:en @@@@@: A to identify a resource. @@Param: @@@Name: defaultTypeURI @@@Type: NameURI @@@Description: @@@@lang:en @@@@@: A name URI reference used if it is missing from . @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: Equivalent to . @@Param: @@@Name: defaultForURI @@@Type: ForURI @@@Description: @@@@lang:en @@@@@: A URI reference used if it is missing from . @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: Equivalent to , i.e. . @@NodeParam: @@Return: @@@Type: DISCore:TypeForURI @@@Description: @@@@lang:en @@@@@: The -expanded URI references. @@@UndeclaredPrefixException: @@@PerlDef: my ($typeq, $forq) = split /\s*::\s*/, $tfqnames, 2; my ($typeURI, $forURI); if (defined $forq) { __DEEP{ $typeURI = $typeq eq '' ? defined $defaultTypeURI ? $defaultTypeURI : : $self-> ($typeq, %opt); }__; if (length $forq) { $forURI = $self-> ($forq, %opt); } else { $forURI = ; } } else { ## "For" omitted __DEEP{ $typeURI = $typeq eq '' ? defined $defaultTypeURI ? $defaultTypeURI : : $self-> ($typeq, %opt); }__; $for = defined $defaultForURI ? $defaultForURI : ; } __DEEP{ $r = $self-> -> -> ($typeURI, $forURI); }__; @Method: @@Name: disGetAttribute @@enDesc: Gets an attribute node. @@Param: @@@Name: attrName @@@Type: AnyURI @@@enDesc: The name expanded URI of the node to retrieve. @@ForParam: @@ForpParam: @@MediaTypeParam: @@MediaTypeDefaultParam: @@Return: @@@Type: ManakaiDISElement @@@enDesc: The attribute (property) element node. @@@nullCase: @@@@enDesc: No attribute node found. @@@PerlDef: for my $c (@{$self->{src}->}) { if ($c-> eq $attrName and $c-> ($forArg, $forpArg) and $c-> ($mediaType, $mediaTypeDefault)) { $r = $c; last; } } @Method: @@Name: disGetAttributeList @@enDesc: Gets attribute nodes. @@AttrNameParam: @@ForParam: @@ForpParam: @@MediaTypeParam: @@MediaTypeDefaultParam: @@Return: @@@Type: ManakaiDISElementList @@@enDesc: The attribute (property) element nodes. @@@PerlDef: $r = bless [], ; for my $c (@{$self->{src}->}) { if ($c-> eq $attrName and $c-> ($forArg, $forpArg) and $c-> ($mediaType, $mediaTypeDefault)) { push @$r, $c; } } @Attr: @@Name: disChildElements @@Type: ManakaiDISElementList @@enDesc: A list of child elements. @@Get: @@@enDesc: The current snapshot of child nodes. @@@PerlDef: $r = bless [@{$self->}], ; @Attr: @@Name: qnameValueURI @@enDesc: The element value (written as ), as URI reference. \ {NOTE:: What should be if list value? \ } @@Get: @@@Type:AnyURI @@@nullCase: @@@@enDesc: No value. @@@UndeclaredPrefixException: @@@GetProp: my $v = $self->; if (defined $v and not ref $v eq 'ARRAY') { __DEEP{ $r = $self-> ($v); }__; } else { $r = null; } @Attr: @@Name: typeforqnamesValueURI @@enDesc: The element value (written as ), as URI reference. \ {NOTE:: What should be if list value? \ } @@Get: @@@Type:ResourceURI @@@nullCase: @@@@enDesc: No value. @@@UndeclaredPrefixException: @@@GetProp: my $v = $self->; if (defined $v and not ref $v eq 'ARRAY') { __DEEP{ $r = $self-> ($v); }__; } else { $r = null; } ##DISElement ClsDef: @ClsQName: ManakaiDISElementList @enDesc: @@lang:en @@@: Lists of elements. \ {NOTE:: is ; later changes to the tree does not affect this type of objects. \ } ##DISElementList ClsDef: @ClsQName: ManakaiDISComment @ClsISA: swcfg21:ManakaiSWCFGComment @ClsISA: ManakaiDISNode @Description: @@lang:en @@@: comment node objects. ##DISComment ClsDef: @ClsQName: ManakaiDISDocumentFragment @ClsISA: swcfg21:ManakaiSWCFGDocumentFragment @ClsISA: ManakaiDISNode @Description: @@lang:en @@@: document fragment node objects. ##DISDocumentFragment ClsDef: @ClsQName: ManakaiDISDocument @ClsISA: swcfg21:ManakaiSWCFGDocument @ClsISA: ManakaiDISNode @Description: @@lang:en @@@: document node objects. @Attr: @@Name: disDatabase @@enDesc: Associated database. @@Type: ManakaiDISDatabase @@Get: @@@NoDBException: @@@PerlDef: if ($self->{}->{}) { $self = $self->{}->{}; } else { __EXCEPTION{NO_ASSOCIATED_DB_ERR}__; } @@Set: @@@PerlDef: $self->{}->{} = $given; require Scalar::Util; Scalar::Util::weaken ($self->{}->{}); ##DISDocument PropDef: @QName: db @enDesc: Associated database. @rdfs:domain: ManakaiDISDocument @rdfs:range: ManakaiDISDatabase ## -- Definition object database ClsDef: @ClsQName: ManakaiDISDatabase @enDesc: Resource database created from source data. @Method: @@Name: typeforurisToURI @@Description: @@@lang:en @@@@: Converts a pair of name URI reference and URI reference into a -expanded URI reference. @@Param: @@@Name: typeURI @@@Type: NameURI @@@Description: @@@@lang:en @@@@@: A URI reference to identify a resource. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: Equivalent to (for historical reason). @@Param: @@@Name: forURI @@@Type: ForURI @@@Description: @@@@lang:en @@@@@: A URI reference. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: Equivalent to , i.e. . @@Return: @@@Type: DISCore:TypeForURI @@@Description: @@@@lang:en @@@@@: The -expanded URI references. @@@PerlDef: $typeURI = unless defined $typeURI; $forURI = unless defined $forURI; if ($forURI eq ) { $r = $typeURI; } else { ## NOTE: [RFC 3986] ## fragment := *(pchar / "/" / "?") ## pchar := unreserved / pct-encoded / sub-delims / [:@] ## unreserved := ALPHA / DIGIT / [._~-] ## sub-delims := [!$&'()*+,;=] ## NOTE: [XPointer Framework] ## SchemeData := *EscapedData ## EscapedData := NormalChar / "^(" / "^)" / "^^" ## / "(" SchemeData ")" ## NormalChar := UnicodeChar - [()^] for my $uri ($typeURI, $forURI) { $uri =~ s{([^0-9A-Za-z:;?=_./-])}{sprintf '%%%02X', ord $1}ge; } $r =qq. qq; } @Method: @@Name: getModule @@Description: @@@lang:en @@@@: Returns a module definition. @@Param: @@@Name: modURI @@@Type: ModuleURI @@@Description: @@@@lang:en @@@@@: A module URI reference. @@Return: @@@Type: ManakaiDISModuleDefinition @@@Description: @@@@lang:en @@@@@: The module definition. @@@PerlDef: if (defined $self->{modDef}->{$modURI}) { $r = $self->{modDef}->{$modURI}; } else { $r = $self->{modDef}->{$modURI} = bless { uri => $modURI, db => $self, for => , forp => [], }, ; require Scalar::Util; Scalar::Util::weaken ($r->{db}); } @Method: @@Name: getFor @@Description: @@@lang:en @@@@: Returns a definition object. @@Param: @@@Name: forURI @@@Type: ForURI @@@Description: @@@@lang:en @@@@@: A URI reference. @@@InCase: @@@@Value: @@@@@is-null:1 @@@@Description: @@@@@lang:en @@@@@@: Defaulted to . @@Return: @@@Type: ManakaiDISForDefinition @@@PerlDef: $forURI = unless defined $forURI; if (defined $self->{forDef}->{$forURI}) { $r = $self->{forDef}->{$forURI}; } else { $r = $self->{forDef}->{$forURI} = bless { uri => $forURI, isa => { => true}, revISA => {}, db => $self, }, ; $self->{forDef}->{}->{revISA}->{$forURI} = true; require Scalar::Util; Scalar::Util::weaken ($r->{db}); } @Method: @@Name: getResource @@Description: @@@lang:en @@@@: Returns a resource definition. @@Param: @@@Name: resURI @@@Type: ResourceURI @@@Description: @@@@lang:en @@@@@: A resource URI reference. @@@InCase: @@@@nullValue: @@@@Description: @@@@@lang:en @@@@@@: Defaulted to . @@Return: @@@Type: ManakaiDISResourceDefinition @@@Description: @@@@lang:en @@@@@: The resource definition. @@@PerlDef: $resURI = unless defined $resURI; if (defined $self->{resDef}->{$resURI}) { $r = $self->{resDef}->{$resURI}; } else { $r = $self->{resDef}->{$resURI} = bless { uri => $resURI, subOf => {}, supOf => {}, db => $self, for => , forp => [], }, ; require Scalar::Util; Scalar::Util::weaken ($r->{db}); } ##DISDatabase ClsDef: @ClsQName: ManakaiDISModuleDefinition @enDesc: module definitions. @ClsISA: ManakaiDISPropertyAccessor @Attr: @@Name: uri @@Type: ModuleURI @@Description: @@@lang:en @@@@: The URI reference of this module. @@Get: @@@PerlDef: $r = $self->{uri}; @Attr: @@Name: nameURI @@Type: NameURI @@enDesc: The URI reference of this module, without identifier. @@Get: @@@PropDef: $r = $self->{uri}; @Attr: @@Name: localName @@enDesc: The local name of this module. @@Type: DISCore:localName @@Get: @@@PerlDef: $r = $self->{localName}; @Attr: @@Name: namespaceURI @@Type: AnyURI @@enDesc: The namespace URI of the name of this resource. @@Get: @@@PerlDef: $r = $self->{namespaceURI}; @Attr: @@Name: forURI @@Type: ForURI @@enDesc: The URI reference for which this module is defined. @@Get: @@@PerlDef: $r = $self->{for}; @Attr: @@Name: isDefined @@Description: @@@lang:en @@@@: Whether this module is defined or not. @@Type: DOMMain:boolean @@Get: @@@PerlDef: $r = $self->{}; ## TODO: exception handler ##DISModuleDefinition ClsDef: @ClsQName: ManakaiDISForDefinition @Description: @@lang:en @@@: definitions. @Attr: @@Name: uri @@Type: ForURI @@Description: @@@lang:en @@@@: The URI reference of this . @@Get: @@@PerlDef: $r = $self->{uri}; @Method: @@Name: isaURI @@Description: @@@lang:en @@@@: Whether this is-a another or not. @@Param: @@@Name: superURI @@@Type: ForURI @@@Description: @@@@lang:en @@@@@: Another URI reference to test. @@Return: @@@Type: DOMMain:boolean @@@TrueCase: @@@@enDesc: is a super- of this . @@@FalseCase: @@@@enDesc: is not a super- of this . @@@PerlDef: $r = $self->{uri} eq $superURI ? true : $self->{isa}->{$superURI}; @Attr: @@Name: isDefined @@Description: @@@lang:en @@@@: Whether this is already defined or not. @@Type: DOMMain:boolean @@Get: @@@TrueCase: This is already defined. @@@FalseCase: This is not defined. @@@PerlDef: $r = $self->{}; @Attr: @@Name: isReferred @@Description: @@@lang:en @@@@: Whether this is referred somewhere or not. @@Type: DOMMain:any @@Get: @@@InCase: @@@@Type:ManakaiDISElement @@@@enDesc: This is referred by the element. @@@nullCase: This is not referred. @@@PerlDef: $r = $self->{}; @@Set: @@@InCase: @@@@Type:ManakaiDISElement @@@@enDesc: This is referred by the element. @@@PerlDef: $self->{} = true if $given; @Attr: @@Name: definingModule @@Description: @@@lang:en @@@@: The module in which this is defined. @@Type: ManakaiDISModuleDefinition @@Get: @@@Description: @@@@lang:en @@@@@: The module object. @@@NullCase: @@@@Description: @@@@@lang:en @@@@@@: This is not associated to any module. @@@PerlDef: $r = $self->{db} -> ($self->{}) if defined $self->{}; @Method: @@Name: readDefinition @@enDesc: Reads definition and sets attributes. @@Param: @@@Name: forDefElement @@@Type: ManakaiDISElement @@@Description: @@@@lang:en @@@@@: A element containing definition of this . @@Return: @@@RaiseException: @@@@@:FOR_ALREADY_DEFINED_ERR @@@@Description: @@@@@lang:en @@@@@@: The definition for this is already read. @@@PerlDef: if ($self->{}) { __EXCEPTION{FOR_ALREADY_DEFINED_ERR}__; } ## TODO: $self->{} = true; ## TODO: exception handler ##DISForDefinition ClsDef: @ClsQName: ManakaiDISResourceDefinition @enDesc: resource definitions. @ClsISA: ManakaiDISPropertyAccessor @Attr: @@Name: uri @@Type: ResourceURI @@Description: @@@lang:en @@@@: The URI reference of this resource. @@Get: @@@PerlDef: $r = $self->{uri}; @Attr: @@Name: nameURI @@Type: NameURI @@enDesc: The URI reference of this resource, without identifier. @@Get: @@@nullCase: @@@@enDesc: This resource does not have its name URI reference. @@@PropDef: $r = $self->{uri}; @Attr: @@Name: localName @@enDesc: The local name of this resource. @@Type: DISCore:localName @@Get: @@@nullCase: @@@@enDesc: This resource does not have its local name. @@@PerlDef: $r = $self->{localName}; @Attr: @@Name: namespaceURI @@Type: AnyURI @@enDesc: The namespace URI of the name of this resource. @@Get: @@@nullCase: The name of this resource does not have its namespace or this resource does not have its name. @@@PerlDef: $r = $self->{namespaceURI}; @Attr: @@Name: isAnonymous @@enDesc: Whether this resource has name or not. @@Type: DOMMain:boolean @@Get: @@@TrueCase: This resource does not have any global unique name. is a temporary URI reference. @@@FalseCase: This resource does have its formal name. is a URI reference generated from the name and the URI reference of this resource. @@@PerlDef: $r = $self->{}; @Attr: @@Name: forURI @@enDesc: The URI reference for which this resource is defined. @@Type:ForURI @@Get: @@@PerlDef: $r = $self->{for}; @Attr: @@Name: forpURI @@enDesc: The URI references for which this resource is defined. @@Type: ForURIList @@Get: @@@PropDef: $r = $self->{forp}; @Method: @@Name: subsetOfURI @@Description: @@@lang:en @@@@: Whether this resource is a subset of another resource or not. @@Param: @@@Name: superURI @@@Type: ResourceURI @@@Description: @@@@lang:en @@@@@: Another resource URI reference to test. @@Return: @@@Type: DOMMain:boolean @@@TrueCase: @@@@enDesc: is a super-resource of this resource. @@@FalseCase: @@@@enDesc: is not a super-resource of this resource. @@@PerlDef: $r = $superURI eq $self->{uri} ? true : $self->{subOf}->{$superURI}; @Attr: @@Name: isDefined @@Description: @@@lang:en @@@@: Whether this resource is already defined or not. @@Type: DOMMain:boolean @@Get: @@@TrueCase: This resource is already defined. @@@FalseCase: This resource is not defined. @@@PerlDef: $r = $self->{}; @Attr: @@Name: isReferred @@Description: @@@lang:en @@@@: Whether this resource is referred or not. @@Type: DOMMain:any @@Get: @@@InCase: @@@@Type:ManakaiDISElement @@@@enDesc: This resource is referred by the element. @@@nullCase: This resource is not referred. @@@PerlDef: $r = $self->{}; @@Set: @@@InCase: @@@@Type:ManakaiDISElement @@@@enDesc: This resource is referred by this element. @@@PerlDef: $self->{} = $given if $given; @Attr: @@Name: definingModule @@Description: @@@lang:en @@@@: The module in which this resource is defined. @@Type: ManakaiDISModuleDefinition @@Get: @@@Description: @@@@lang:en @@@@@: The module object. @@@NullCase: @@@@Description: @@@@@lang:en @@@@@@: This resource is not associated to any module. @@@PerlDef: $r = $self->{db} -> ($self->{}) if defined $self->{}; @@Set: @@@Description: @@@@lang:en @@@@@: The module object to which the is set. @@@PerlDef: $self->{} = $given->; ## TODO: exception handler ##DISResourceDefinition ClsDef: @ClsQName: ManakaiDISPropertyAccessor @enDescription: Accessor methods for resource or module properties. @Method: @@Name: getPropertyText @@enDesc: Gets property value text. @@PropNameParam: @@Param: @@@Name:default @@@Type: swcfg21:SWCFGString @@@enDesc: The default value that is returned if no explicit property value specification found for this resource. @@@nullCase: @@@@enDesc: No default value supplied; is returned if no value specified. @@Return: @@@Type: swcfg21:SWCFGString @@@enDesc: The property value string. @@@nullCase: @@@@enDesc: No value nor default value has specified. @@@PerlDef: if (exists $self->{$propName}) { $r = defined $self->{$propName} ? $self->{$propName} : $default; } elsif ($self->{src}) { $r = $self->{src}-> ($propName, for_arg => $self->{for}, forp_arg => $self->{forp}); $self->{$propName} = $r; $r = $default unless defined $r; } else { $r = $default; } @Method: @@Name: getPropertyResource @@enDesc: Gets property value resource. @@PropNameParam: @@Return: @@@Type: ManakaiDISResourceDefinition @@@enDesc: The property value resource. @@@nullCase: @@@@enDesc: No value has specified. @@@PerlDef: if (defined $self->{$propName}) { $r = $self->{db}-> ($self->{$propName}); } else { $r = null; } @Method: @@Name: addPropertyResourceList @@enDesc: Adds a resource to a resource-list property value. \ {ISSUE:: Should an exception be thrown if the property is not of list? \ } @@PropNameParam: @@Param: @@@Name: res @@@Type: ManakaiDISResourceDefinition @@@enDesc: A resource to add. @@Return: @@@PerlDef: if (ref $self->{$propName} eq 'ARRAY') { push @{$self->{$propName}}, $res->{uri}; } elsif (not defined $self->{$propName}) { $self->{$propName} = [$res->{uri}]; } ##DISPropertyAccessor PropDef: @QName:isAnon @Description: @@lang:en @@@: Whether the subject resource is anonymous or not. @Type: DOMMain:boolean PropDef: @QName:isDefined @Description: @@lang:en @@@: Whether the subject resource is defined or not. PropDef: @Qname:isReferred @Description: @@lang:en @@@: Whether the subject resource is referred or not. @Type: DOMMain:any PropDef: @QName:definingModule @Description: @@lang:en @@@: The module in which the subject resource is defined. @rdfs:domain: DISCore:Module ## -- Datatypes URITypeDef: @QName: ForURI @Description: @@lang:en @@@: URI references. DataTypeDef: @QName: ForURIList @Description: @@lang:en @@@: References to the array containing URI references. URITypeDef: @QName: MediaTypeURI @Description: @@lang:en @@@: Media type URI references. ## -- Exceptions XParamDef: @QName: sourceNode @Description: @@lang:en @@@: The node from which the string has come. @Type: DISNode