C:\xampp\php\pear\PHP\UML\Metamodel\TypeResolverById.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php
/**
 * PHP_UML
 *
 * PHP version 5
 * 
 * @category   PHP
 * @package    PHP_UML
 * @subpackage Metamodel
 * @author     Baptiste Autin <ohlesbeauxjours@yahoo.fr> 
 * @license    http://www.gnu.org/licenses/lgpl.html LGPL License 3
 * @version    SVN: $Revision: 175 $
 * @link       http://pear.php.net/package/PHP_UML
 * @link       http://www.omg.org/mof/
 * @since      $Date: 2011-09-15 17:07:58 +0200 (jeu., 15 sept. 2011) $
 *
 */

/**
 * An implementation of TypeResolver that complete the relationships between the
 * elements of a superstructure on the base of the elements ID.
 * 
 * @category   PHP
 * @package    PHP_UML
 * @subpackage Metamodel
 * @author     Baptiste Autin <ohlesbeauxjours@yahoo.fr> 
 * @license    http://www.gnu.org/licenses/lgpl.html LGPL License 3
 */
class PHP_UML_Metamodel_TypeResolverById extends PHP_UML_Metamodel_TypeResolver
{
    public function 
resolve(PHP_UML_Metamodel_Package &$ns, array $default)
    {
        
$this->topPackage  $ns;
        
$this->defaultRepo $default;
        
        
$this->resolvePackage($ns);
    }
    
    
/**
     * Recursively replaces all the "named types" by a proper "reference" to a
     * typed element. This impacts:
     * - the extended classes and implemented classes (through their
     * EMOF-"superClass" and "implements" relations)
     * - the function parameters (through their EMOF-"type" attribute)
     * - the properties in classes (through their EMOF-"type" attribute)
     * 
     * @param PHP_UML_Metamodel_Package &$ns Package to resolve the elements of
     */
    
private function resolvePackage(PHP_UML_Metamodel_Package &$ns)
    {
        if (!
is_null($ns->nestedPackage)) {
            foreach (
$ns->nestedPackage as $key => &$pkg) {
                
$this->resolvePackage($pkg);
            }
        }
        if (!
is_null($ns->ownedType))
        foreach (
$ns->ownedType as &$elt) {
            if (isset(
$elt->superClass) && !is_null($elt->superClass)) { 
                foreach (
$elt->superClass as &$className) {
                    
$this->resolveType($ns$className$elt);
                }
            }
            if (isset(
$elt->implements) && !is_null($elt->implements)) { 
                foreach (
$elt->implements as &$className) {
                    
$this->resolveType($ns$className$elt);
                }
            }
            if (isset(
$elt->ownedOperation)) {
                foreach (
$elt->ownedOperation as &$function) {
                    foreach (
$function->ownedParameter as &$parameter) {
                        
$this->resolveType($ns$parameter->type$elt); 
                    }
                }
            }
            if (isset(
$elt->ownedAttribute)) {
                foreach (
$elt->ownedAttribute as &$attribute) { 
                    
$this->resolveType($ns$attribute->type$elt);
                }
            }
        }
        if (isset(
$ns->ownedOperation)) {
            foreach (
$ns->ownedOperation as &$function) {
                foreach (
$function->ownedParameter as &$parameter) {
                    
$this->resolveType($ns$parameter->type$function); 
                }
            }
        }
        if (isset(
$ns->ownedAttribute)) {
            foreach (
$ns->ownedAttribute as &$attribute) { 
                
$this->resolveType($ns$attribute->type$attribute);
            }
        }
    }

    
/**
     * Does the type resolution for a given element in a given package
     *
     * @param PHP_UML_Metamodel_Package $pkg      The nesting package
     * @param string                    &$element The element to resolve, provided as a name
     * @param PHP_UML_Metamodel_Type    $context  The context (the nesting class/interface, which 
     *                                            is the only element to know the nesting file)
     */
    
private function resolveType(PHP_UML_Metamodel_Package $pkg, &$elementPHP_UML_Metamodel_NamedElement $context)
    {
        if (empty(
$element)) {
            
$targetElement PHP_UML_Metamodel_Helper::searchTypeIntoPackage($this->topPackage'mixed');
        } else {
            
$targetElement PHP_UML_Metamodel_Helper::findTypeById($this->topPackage$element);
        }
        
        if (
$targetElement === false)
            
$targetElement $this->resolveTypeByUri($element);
        
        if (
$targetElement === false) {
            
self::resolutionWarning($element$context);
        } else {
            
$element $targetElement;
        }
    }
    
    
/**
     * Resolve a URI type reference by grasping a type name in the URI itself
     * (eg. href="http://schema.omg.org/spec/UML/2.1/uml.xml#Integer") 
     * 
     * @param string $uri URI to resolve
     */
    
private function resolveTypeByUri($uri)
    {
        if (
self::isNsUri($uri)) {
            foreach (
$this->defaultRepo as $itemPkg) {
                foreach (
$itemPkg->ownedType as $item) {
                    if (
stripos($uri$item->name) !== false) {
                        return 
$item
                    }
                }
            }
        }
        return 
false;
    }
    
    private static function 
isNsUri($text)
    {
        return (
strncasecmp($text'http://'7) == 0);
    }
}
?>
x

Windows NT KPTV 6.2 build 9200 (Windows Server 2012 Datacenter Edition) i586