C:\xampp\php\pear\PHP\UML\Metamodel\TypeResolverByName.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
147
<?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 completes the relationships between the
 * elements of a superstructure by using the elements name.
 * 
 * @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_TypeResolverByName 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)
    {
        
// Is there a ns separator (\) in it ?
        
list($pos$first$last) = PHP_UML_Metamodel_Helper::getPackagePathParts($elementfalse);
        if (!(
$pos===false)) {
            
$tmpPkg $this->getPackageByPath($first);
            if (
$tmpPkg===false) {
                
self::resolutionWarning($element$context);
                
$element null;
            } else {
                
// Do we know that type?
                
$_o PHP_UML_Metamodel_Helper::searchTypeIntoPackage($tmpPkg$last);
                if (!(
$_o===false)) {
                    
$element $_o;
                } else {
                    
self::resolutionWarning($element$context);
                    
//$element = null;
                
}
            }
        } else {

            
// Is it in the current package?
            
$_o PHP_UML_Metamodel_Helper::searchTypeIntoPackage($pkg$element);
            if (!(
$_o===false)) {
                
$element $_o;
            } else {
                
// Is it in one of the "default" packages?
                
$found false;
                foreach (
$this->defaultRepo as $itemPkg) {
                    
$_o PHP_UML_Metamodel_Helper::searchTypeIntoPackage($itemPkg$element);
                    if (!(
$_o===false)) {
                        
$element $_o;
                        
$found   true;
                        break;
                    }
                }
                if (!
$found) {
                    
self::resolutionWarning($element$context);
                    
//$element = null;
                
}
            }
        }
    }
}
?>
x

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