]> git.llucax.com Git - mecon/scripts.git/blob - code2xmi/code2xmi.php
Agrego de funcionalidad. Reconoce parametros pasados por referencia y ya no tiene...
[mecon/scripts.git] / code2xmi / code2xmi.php
1 #! /usr/bin/php4 -qC
2 <?php 
3 /* vim: set binary expandtab tabstop=4 shiftwidth=4 foldmethod=marker:
4 -------------------------------------------------------------------------------
5 Creado: jue jul 31 14:01:57 ART 2003
6 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
7 -------------------------------------------------------------------------------
8 $Id$
9 -----------------------------------------------------------------------------*/
10
11 //Recibe como parametros el directorio o una lista de archivos a diagramar
12
13 //TAG's XML {{{
14 $comienzo = <<<EOT
15 <?xml version="1.0" encoding="UTF-8"?>
16 <XMI xmlns:UML="org.omg/standards/UML" verified="false" timestamp="" xmi.version="1.2" >
17   <XMI.content>
18     <umlobjects>
19 EOT;
20 $medio = <<<EOT2
21     </umlobjects>
22     <listview>
23       <listitem open="1" type="800" id="-1" label="Views" >
24         <listitem open="1" type="801" id="-1" label="Logical View" >
25 EOT2;
26 $fin = <<<EOT3
27         </listitem>
28         <listitem open="1" type="802" id="-1" label="Use Case View" />
29       </listitem>
30     </listview>                                                                     
31   </XMI.content>
32 </XMI>
33 EOT3;
34 //}}}
35 //LINEAS TEMPLATES XMI {{{
36 $umlclass       = '<UML:Class stereotype="##STEREOTYPE##" package="##PACKAGE##" xmi.id="##ID##" abstract="##ABSTRACT##" documentation="##DOCUMENTATION##" name="##NAME##" static="##STATIC##" scope="##SCOPE##" >';
37 $umlclass_c     = '</UML:Class>';
38
39 $umloperation   = '<UML:Operation stereotype="##STEREOTYPE##" package="##PACKAGE##" xmi.id="##ID##" type="##TYPE##" abstract="##ABSTRACT##" documentation="##DOCUMENTATION##" name="##NAME##" static="##STATIC##" scope="##SCOPE##">';
40 $umloperation_c = '</UML:Operation>';
41
42 $umlparameter   = '<UML:Parameter stereotype="##STEREOTYPE##" package="##PACKAGE##" xmi.id="##ID##" value="##VALUE##" type="##TYPE##" abstract="##ABSTRACT##" documentation="##DOCUMENTATION##" name="##NAME##" static="##STATIC##" scope="##SCOPE##" />';
43
44 $umlattribute   = '<UML:Attribute stereotype="##STEREOTYPE##" package="##PACKAGE##" xmi.id="##ID##" value="##VALUE##" type="##TYPE##" abstract="##ABSTRACT##" documentation="##DOCUMENTATION##" name="##NAME##" static="##STATIC##" scope="##SCOPE##" />';
45
46 $umllistitem   = '<listitem open="0" type="##TYPE##" id="##ID##" label="##LABEL##" >';
47 $umllistitem_c = '</listitem>';
48 //}}}
49 //VARIABLES GLOBALES {{{
50 $ID      = 0;
51 $IDPARAM = 0;
52 $ARRAY   = array();
53 //}}}
54
55 //PARTE 1 {{{
56 for ($j = 1; $j < count($argv); $j++) {
57     $file = $argv[$j];
58     //ARMO LA LISTA DE ARCHIVOS {{{
59     // Si es un directorio, agrego cada archivo legible .php al argv.
60     if (is_dir($file)) {
61         $dh = opendir($file);
62         while (($f = readdir($dh)) !== false) {
63             if (is_readable("$file/$f") and substr($f, -4) == '.php') {
64                 $argv[] = "$file/$f";
65             }
66         }
67         closedir($dh);
68         continue;
69     } 
70     //}}}
71     //GUARDO LA INFO{{{
72     elseif (is_readable($file) and substr($file, -4) == '.php') {
73         $cont = file ($file);
74         $DOCUMENTANDO = false;
75         $opciones = array ();
76         $cont_param = 0;
77         foreach ($cont as $linea) {
78             $linea = trim ($linea);
79             $tmp = preg_split ('/[^\w_\/\*\@\$\&\.\']+/', $linea);
80             //DOCUMENTACION {{{
81             if ($tmp['0'] == '/**') { //Comienza la documentacion
82                 $DOCUMENTANDO = true;
83             }
84             if ($tmp['0'] == '*/') { //Termina la documentacion
85                 $DOCUMENTANDO = false;
86             }
87             if ($DOCUMENTANDO) {
88                 $tmp2   = ltrim ($linea,'* /**'); //Elimino el * o /** del comienzo de la linea
89                 $accion = substr($tmp2, 0, strpos($tmp2,' ')); //Obtengo la accion
90                 $value  = trim(strstr($tmp2, ' ')); //Solo me importa lo que esta detras del @
91
92                 switch ($accion) {
93                     case '@access'  : switch ($value) {
94                                           case 'private'  : $opciones['access'] = 201;
95                                                             break;
96                                           case 'protected': $opciones['access'] = 202;
97                                                             break;
98                                           default         : $opciones['access'] = 200;
99                                       }
100                                       $doc_param = 0;
101                                       break;
102                     case '@package' : $opciones['package'] = $value;
103                                       $doc_param = 0;
104                                       break;
105                     case '@abstract': $opciones['abstract'] = 1;
106                                       $doc_param = 0;
107                                       break;
108                     case '@static'  : $opciones['static'] = 1;
109                                       $doc_param = 0;
110                                       break;
111                     case '@var'     : $opciones['type'] = substr($value, 0, strpos($value,' '));
112                                       $doc_param = 0;
113                                       break;
114                     case '@return'  : $opciones['type'] = $value; 
115                                       $doc_param = 0;
116                                       break;
117                     case '@param'   : $opciones['param'][$cont_param]['type'] = substr($value, 0, strpos($value,' '));
118                                       $opciones['param'][$cont_param]['documentacion'] = trim(strstr(trim(strstr($value, ' ')), ' '));
119                                       $cont_param++;
120                                       $doc_param = 1;
121                                       break;
122                     default:
123                         if (@$doc_param) {
124                            $opciones['param'][$cont_param]['documentacion'].= $tmp2;
125                         }
126                         else {
127                             @$opciones['documentacion'].= $tmp2;
128                         }
129                 }
130             }
131             //}}}
132             //CLASE {{{
133             if (!$DOCUMENTANDO && $tmp['0'] == 'class') {
134                 $ID++;
135                 $IDCLASE = $ID;
136
137                 $ARRAY[$ID]['id']            = $ID;
138                 $ARRAY[$ID]['name']          = $tmp['1'];
139                 $ARRAY[$ID]['stereotype']    = (@$opciones['stereotype'])    ? $opciones['stereotype']    : '';
140                 $ARRAY[$ID]['package']       = (@$opciones['package'])       ? $opciones['package']       : '';
141                 $ARRAY[$ID]['abstract']      = (@$opciones['abstract'])      ? $opciones['abstract']      : 0;
142                 $ARRAY[$ID]['documentation'] = (@$opciones['documentacion']) ? $opciones['documentacion'] : '';
143                 $ARRAY[$ID]['static']        = (@$opciones['static'])        ? $opciones['static']        : 0;
144                 $ARRAY[$ID]['scope']         = (@$opciones['access'])        ? $opciones['access']        : 200;
145                 $ARRAY[$ID]['operations']    = array();
146                 $ARRAY[$ID]['attributes']    = array();
147                 $opciones = array();
148             }
149             //}}}
150             //FUNCION {{{
151             if (!$DOCUMENTANDO && $tmp['0'] == 'function') {
152                 $ID++;
153
154                 if ($tmp['1']{0} == '_') {
155                     $tmp['1'] = substr($tmp['1'], 1); //SACO EL _
156                 }
157                 
158                 $ARRAY[$IDCLASE]['operations'][$ID]['id']            = $ID;
159                 $ARRAY[$IDCLASE]['operations'][$ID]['name']          = $tmp['1'];
160                 $ARRAY[$IDCLASE]['operations'][$ID]['stereotype']    = (@$opciones['stereotype'])    ? $opciones['stereotype']    : '';  
161                 $ARRAY[$IDCLASE]['operations'][$ID]['package']       = (@$opciones['package'])       ? $opciones['package']       : '';  
162                 $ARRAY[$IDCLASE]['operations'][$ID]['abstract']      = (@$opciones['abstract'])      ? $opciones['abstract']      : 0;   
163                 $ARRAY[$IDCLASE]['operations'][$ID]['documentation'] = (@$opciones['documentacion']) ? $opciones['documentacion'] : '';  
164                 $ARRAY[$IDCLASE]['operations'][$ID]['static']        = (@$opciones['static'])        ? $opciones['static']        : 0;   
165                 $ARRAY[$IDCLASE]['operations'][$ID]['scope']         = (@$opciones['access'])        ? $opciones['access']        : 200;
166                 $ARRAY[$IDCLASE]['operations'][$ID]['type']          = (@$opciones['type'])          ? $opciones['type']          : '';
167                 $ARRAY[$IDCLASE]['operations'][$ID]['param']         = array();
168
169                 //PARAMETROS {{{
170                 array_shift($tmp); //SACO EL FUNCTION
171                 array_shift($tmp); //SACO EL NOMBRE DE LA FUNCION
172                 for ($i = 0; $i <= count($tmp); $i++) {
173                     if ($tmp[$i]{0} == '$'|| $tmp[$i]{0} == '&') { //Veo si empiezo con $ o &
174                         switch ($tmp[$i]{0}) {
175                             case '$': $tmp[$i] = substr($tmp[$i], 1); //SACO EL $
176                                       break;
177                             case '&': $tmp[$i] = substr($tmp[$i], 2); //SACO EL & Y EL $
178                                       $opciones['param'][$i]['type'] = 
179                                           (@$opciones['param'][$i]['type']) ? '&amp;'.$opciones['param'][$i]['type'] : '';
180                                       break;
181                         }                        
182                         $OPANT = $i;
183                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['id'] = $i;
184                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['name'] = $tmp[$i];
185                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['stereotype'] = 
186                             (@$opciones['param'][$i]['stereotype']) ? $opciones['param'][$i]['stereotype'] : '';
187                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['package'] = 
188                             (@$opciones['param'][$i]['package']) ? $opciones['param'][$i]['package'] : '';
189                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['abstract'] = 
190                             (@$opciones['param'][$i]['abstract']) ? $opciones['param'][$i]['abstract'] : 0;
191                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['documentation'] = 
192                             (@$opciones['param'][$i]['documentacion']) ? $opciones['param'][$i]['documentacion'] : '';
193                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['static'] = 
194                             (@$opciones['param'][$i]['static']) ? $opciones['param'][$i]['static'] : 0;
195                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['scope'] = 
196                             (@$opciones['param'][$i]['access']) ? $opciones['param'][$i]['access'] : '';
197                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$i]['type'] = 
198                             (@$opciones['param'][$i]['type']) ? $opciones['param'][$i]['type'] : '';
199                     }
200                     elseif ($tmp[$i] != '//'  && $tmp[$i] != 'X2C' && $tmp[$i] != '') {
201                         $ARRAY[$IDCLASE]['operations'][$ID]['param'][$OPANT]['value']      .= $tmp[$i];
202                     }
203                 }
204                 //}}}
205                 $opciones = array();
206                 $cont_param = 0;
207             }
208             //}}}
209             //ATRIBUTOS {{{
210             if (!$DOCUMENTANDO && $tmp['0'] == 'var') {
211                 $ID++;
212                 $tmp['1'] = substr($tmp['1'], 1); //SACO EL $
213                 if ($tmp['1']{0} == '_') {
214                     $tmp['1'] = substr($tmp['1'],1); //SACO EL _
215                     if (!(@$opciones['access'])) {
216                         $opciones['access'] = 201;
217                     }
218                 }
219                 //Agrego si tiene valor inicial
220                 if (array_key_exists('2',$tmp)) {
221                     $opciones['value'] = $tmp['2'];
222                 }
223                 
224                 $ARRAY[$IDCLASE]['attributes'][$ID]['id']            = $ID;
225                 $ARRAY[$IDCLASE]['attributes'][$ID]['name']          = $tmp['1'];
226                 $ARRAY[$IDCLASE]['attributes'][$ID]['stereotype']    = (@$opciones['stereotype'])    ? $opciones['stereotype']    : '';  
227                 $ARRAY[$IDCLASE]['attributes'][$ID]['package']       = (@$opciones['package'])       ? $opciones['package']       : '';  
228                 $ARRAY[$IDCLASE]['attributes'][$ID]['abstract']      = (@$opciones['abstract'])      ? $opciones['abstract']      : 0;   
229                 $ARRAY[$IDCLASE]['attributes'][$ID]['documentation'] = (@$opciones['documentacion']) ? $opciones['documentacion'] : '';  
230                 $ARRAY[$IDCLASE]['attributes'][$ID]['static']        = (@$opciones['static'])        ? $opciones['static']        : 0;   
231                 $ARRAY[$IDCLASE]['attributes'][$ID]['scope']         = (@$opciones['access'])        ? $opciones['access']        : 200;  
232                 $ARRAY[$IDCLASE]['attributes'][$ID]['type']          = (@$opciones['type'])          ? $opciones['type']          : '';
233                 $ARRAY[$IDCLASE]['attributes'][$ID]['value']         = (@$opciones['value'])         ? $opciones['value']         : '';
234                 $opciones = array(operations);
235             }
236         //}}}
237         }
238     } 
239     //}}}
240 }
241 //}}}
242
243
244 //GUARDO EN EL ARCHIVO {{{
245 $m =fopen ('./umlOut.xmi', 'w');
246 fwrite($m, $comienzo);
247 $LISTITEM = '';
248 //CLASES
249 foreach ($ARRAY as $ar) {
250     //PREPARO LA CLASE 
251     $tmp2 = $umlclass;
252     fwrite($m, preg_replace (array ('/##STEREOTYPE##/','/##PACKAGE##/','/##ID##/','/##ABSTRACT##/','/##DOCUMENTATION##/','/##NAME##/',
253                                     '/##STATIC##/','/##SCOPE##/'), 
254                              array ($ar['stereotype'],$ar['package'],$ar['id'],$ar['abstract'],$ar['documentation'],$ar['name'],
255                                     $ar['static'],$ar['scope']), 
256                              $tmp2)."\n");
257     //PREPARO LOS LISTITEM 
258     $tmp2 = $umllistitem;
259     $LISTITEM.= preg_replace (array('/##TYPE##/','/##LABEL##/','/##ID##/'),array(813, $ar['name'], $ar['id']),$tmp2)."\n";  
260
261     //OPERACIONES
262     foreach ($ar['operations'] as $op) {
263         $tmp2 = $umloperation;
264         fwrite($m, preg_replace (array('/##STEREOTYPE##/','/##PACKAGE##/','/##ID##/','/##TYPE##/','/##ABSTRACT##/','/##DOCUMENTATION##/',
265                                        '/##NAME##/','/##STATIC##/','/##SCOPE##/'), 
266                                  array($op['stereotype'],$op['package'],$op['id'],$op['type'],$op['abstract'],$op['documentation'],
267                                        $op['name'],$op['static'],$op['scope']) , 
268                                  $tmp2)."\n");
269         //PARAMETROS NO TIENE LISTITEM
270         foreach ($op['param'] as $pa) {
271             $tmp2 = $umlparameter;
272             fwrite ($m, preg_replace(array('/##STEREOTYPE##/','/##PACKAGE##/','/##ID##/','/##TYPE##/','/##ABSTRACT##/','/##DOCUMENTATION##/',
273                                            '/##NAME##/','/##STATIC##/','/##SCOPE##/','/##VALUE##/'),
274                                      array($pa['stereotype'],$pa['package'],$pa['id'],$pa['type'],$pa['abstract'],$pa['documentation'],
275                                            $pa['name'],$pa['static'],$pa['scope'],$pa['value']),
276                                      $tmp2)."\n");
277         } 
278         fwrite($m,$umloperation_c."\n");
279         //PREPARO LOS LISTITEM 
280         $tmp2 = $umllistitem;
281         $LISTITEM.= preg_replace (array('/##TYPE##/','/##LABEL##/','/##ID##/'),array(815, $op['name'], $op['id']),$tmp2)."\n";  
282         $LISTITEM.=$umllistitem_c."\n";
283     }
284     //ATRIBUTOS
285     foreach ($ar['attributes'] as $op) {
286         $tmp2 = $umlattribute;
287         fwrite($m, preg_replace(array('/##STEREOTYPE##/','/##PACKAGE##/','/##ID##/','/##TYPE##/','/##ABSTRACT##/','/##DOCUMENTATION##/',
288                                       '/##NAME##/','/##STATIC##/','/##SCOPE##/','/##VALUE##/'),
289                                 array($op['stereotype'],$op['package'],$op['id'],$op['type'],$op['abstract'],$op['documentation'],$op['name'],
290                                       $op['static'],$op['scope'],$op['value']),
291                                 $tmp2)."\n");
292         //PREPARO LOS LISTITEM
293         $tmp2 = $umllistitem;
294         $LISTITEM.= preg_replace (array('/##TYPE##/','/##LABEL##/','/##ID##/'),array(814, $op['name'], $op['id']),$tmp2)."\n";  
295         $LISTITEM.=$umllistitem_c."\n";
296     }
297     fwrite($m,$umlclass_c);
298     $LISTITEM.=$umllistitem_c."\n";
299 }
300 fwrite($m,  $medio. $LISTITEM."\n".$fin);
301 //}}}
302 ?>