<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1794-1237</journal-id>
<journal-title><![CDATA[Revista EIA]]></journal-title>
<abbrev-journal-title><![CDATA[Revista EIA]]></abbrev-journal-title>
<issn>1794-1237</issn>
<publisher>
<publisher-name><![CDATA[Escuela de ingenieria de Antioquia]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1794-12372008000100003</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[UN MÉTODO DE INGENIERÍA INVERSA DE CÓDIGO JAVA HACIA DIAGRAMAS DE SECUENCIAS DE UML 2.0]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Zapata]]></surname>
<given-names><![CDATA[Carlos Mario]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Ochoa]]></surname>
<given-names><![CDATA[Óscar Andrés]]></given-names>
</name>
<xref ref-type="aff" rid="A02"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Vélez]]></surname>
<given-names><![CDATA[Camilo]]></given-names>
</name>
<xref ref-type="aff" rid="A02"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Universidad Nacional de Colombia  ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<aff id="A02">
<institution><![CDATA[,Universidad Nacional de Colombia  ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>07</month>
<year>2008</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>07</month>
<year>2008</year>
</pub-date>
<numero>9</numero>
<fpage>31</fpage>
<lpage>42</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_arttext&amp;pid=S1794-12372008000100003&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_abstract&amp;pid=S1794-12372008000100003&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_pdf&amp;pid=S1794-12372008000100003&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[La Ingeniería inversa de software aparece como un proceso que ayuda al aseguramiento de la calidad y documentación de aplicaciones con deficiencias en los modelos de análisis y diseño. Además, ayuda en la disminución de costos y tiempos de mantenimiento. En la actualidad existen herramientas CASE y algunas propuestas de investigación que realizan el proceso de ingeniería inversa a diagramas UML, en especial a los diagramas de clases y secuencias. Algunas se encuentran en fases experimentales; otras se enfocan mucho más en el diagrama de clases que en el de secuencias. Un tercer grupo obtiene algunos elementos del diagrama de secuencias, pero no posee muchos de los elementos que hacen parte de la especificación de UML 2.0. En este artículo se propone un método que automatiza la conversión de código JAVA en diagrama de secuencias de UML 2.0, por medio de la aplicación de reglas de transformación que convierten los elementos del código en elementos del diagrama. Se presenta también un ejemplo de aplicación del método con un prototipo que lo emplea, el UNC-Inversor.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[Software reverse engineering seems to be the process for helping software quality assurance and documentation in applications with low-quality analysis and design models. It also helps for decreasing maintenance cost and time. Currently, some CASE tools and research proposals assist analysts to develop reverse engineering process with UML diagrams as a result (especially class and sequence diagram). Some of them have reached experimental phases. Some others are focused more on class diagram and less on sequence diagram. A third group of CASE tools and proposals obtains sequence diagram, but the resulting diagram lacks some of the elements of the UML 2.0 specification. In this paper, we propose a method for automating the conversion of JAVA code into UML 2.0 sequence diagram, by means of the application of transformation rules for converting code elements to the diagram elements. We also present an example of the method application through a prototype named UNC-Inversor.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[Ingeniería inversa]]></kwd>
<kwd lng="es"><![CDATA[diagrama de secuencias]]></kwd>
<kwd lng="es"><![CDATA[UML]]></kwd>
<kwd lng="es"><![CDATA[JAVA]]></kwd>
<kwd lng="es"><![CDATA[reglas de transformación]]></kwd>
<kwd lng="en"><![CDATA[Reverse engineering]]></kwd>
<kwd lng="en"><![CDATA[sequence diagram]]></kwd>
<kwd lng="en"><![CDATA[UML]]></kwd>
<kwd lng="en"><![CDATA[JAVA]]></kwd>
<kwd lng="en"><![CDATA[transformation rules]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[ <p align="center"><font size="4" face="Verdana"><b>UN M&Eacute;TODO DE INGENIER&Iacute;A INVERSA   DE C&Oacute;DIGO JAVA HACIA DIAGRAMAS DE SECUENCIAS DE UML 2.0</b></font></p>     <p align="center">&nbsp;</p> <font face="Verdana"size="2">     <p><b> Carlos Mario Zapata*,   &Oacute;scar Andr&eacute;s Ochoa**, Camilo V&eacute;lez**</b></p>     <p>* Ingeniero Civil, Especialista en Gerencia de Sistemas Inform&aacute;ticos, Mag&iacute;ster en Ingenier&iacute;a de Sistemas y Doctor en   Ingenier&iacute;a con &eacute;nfasis en Sistemas. Profesor Asociado de la Escuela de Sistemas, Facultad de Minas, Universidad   Nacional de Colombia, Sede Medell&iacute;n. Integrante del Grupo de Investigaci&oacute;n en Lenguajes Computacionales. <a href="mailto:cmzapata@unal.edu.co">cmzapata@unal.edu.co</a></p>     <p> ** Estudiante de Ingenier&iacute;a de Sistemas e Inform&aacute;tica de la Universidad Nacional de Colombia. Integrante del Grupo   de Investigaci&oacute;n en Lenguajes Computacionales de la Escuela de Sistemas, Facultad de Minas, Universidad Nacional   de Colombia.<a href="mailto:oaochoa@unalmed.edu.co"> oaochoa@unalmed.edu.co</a>; <a href="mailto:cvelezp@unalmed.edu.co">cvelezp@unalmed.edu.co</a></p>     <p> Art&iacute;culo recibido 20-III-2008. Aprobado 8-VI-2008  </p>     <p>Discusi&oacute;n abierta hasta diciembre de 2008 </p> <hr size="1" /> </font>     <p><font size="3" face="Verdana"><b>  RESUMEN</b></font></p> <font face="Verdana"size="2">     <p>  La Ingenier&iacute;a inversa de software aparece como un proceso que ayuda al aseguramiento de la calidad   y documentaci&oacute;n de aplicaciones con deficiencias en los modelos de an&aacute;lisis y dise&ntilde;o. Adem&aacute;s, ayuda en la   disminuci&oacute;n de costos y tiempos de mantenimiento. En la actualidad existen herramientas CASE y algunas   propuestas de investigaci&oacute;n que realizan el proceso de ingenier&iacute;a inversa a diagramas UML, en especial a   los diagramas de clases y secuencias. Algunas se encuentran en fases experimentales; otras se enfocan mucho   m&aacute;s en el diagrama de clases que en el de secuencias. Un tercer grupo obtiene algunos elementos del   diagrama de secuencias, pero no posee muchos de los elementos que hacen parte de la especificaci&oacute;n de   UML 2.0. En este art&iacute;culo se propone un m&eacute;todo que automatiza la conversi&oacute;n de c&oacute;digo JAVA en diagrama   de secuencias de UML 2.0, por medio de la aplicaci&oacute;n de reglas de transformaci&oacute;n que convierten los elementos   del c&oacute;digo en elementos del diagrama. Se presenta tambi&eacute;n un ejemplo de aplicaci&oacute;n del m&eacute;todo   con un prototipo que lo emplea, el UNC-Inversor.</p> </font>     <p>  <font size="3" face="Verdana"><b>PALABRAS CLAVE: </b></font><font size="2" face="Verdana">Ingenier&iacute;a inversa; diagrama de secuencias; UML; JAVA; reglas de transformaci&oacute;n.</font></p> <font face="Verdana"size="2"> <hr size="1" /> </font>     ]]></body>
<body><![CDATA[<p><font size="3" face="Verdana"><b>ABSTRACT</b></font></p> <font face="Verdana"size="2">     <p>  Software reverse engineering seems to be the process for helping software quality assurance and   documentation in applications with low-quality analysis and design models. It also helps for decreasing   maintenance cost and time. Currently, some CASE tools and research proposals assist analysts to develop   reverse engineering process with UML diagrams as a result (especially class and sequence diagram). Some   of them have reached experimental phases. Some others are focused more on class diagram and less on   sequence diagram. A third group of CASE tools and proposals obtains sequence diagram, but the resulting   diagram lacks some of the elements of the UML 2.0 specification. In this paper, we propose a method for   automating the conversion of JAVA code into UML 2.0 sequence diagram, by means of the application of   transformation rules for converting code elements to the diagram elements. We also present an example of   the method application through a prototype named UNC-Inversor.</p> </font>     <p>  <font size="2" face="Verdana"><b><font size="3">KEY WORDS:</font> </b>Reverse engineering; sequence diagram; UML; JAVA; transformation rules.</font></p> <font face="Verdana"size="2"> <hr size="1" /> </font>     <p><font size="3" face="Verdana"><b> 1. INTRODUCCI&Oacute;N</b></font></p> <font face="Verdana"size="2">     <p>  Inmersa en el &aacute;rea de conocimiento de la   ingenier&iacute;a de software, se encuentra la ingenier&iacute;a   inversa como punto de apoyo para los procesos de   an&aacute;lisis y dise&ntilde;o propuestos en diferentes m&eacute;todos   de desarrollo (Tilley et al., 1994). Muchos proyectos   de software eluden la aplicaci&oacute;n de m&eacute;todos de desarrollo   que faciliten el mantenimiento posterior de   las aplicaciones resultantes. Este tipo de aplicaciones   carece de la documentaci&oacute;n necesaria para realizar   su adecuado mantenimiento (Fitzgerald, Russo y   O&rsquo;Kane, 2003).</p>     <p>  La ingenier&iacute;a inversa permite subsanar esta   deficiencia, al documentar los productos de software   a partir del c&oacute;digo ejecutable, con el fin de obtener   los artefactos de an&aacute;lisis y dise&ntilde;o. La ingenier&iacute;a   inversa es adem&aacute;s una herramienta &uacute;til que ayuda   en el proceso de aseguramiento de la calidad del   software, mediante la comparaci&oacute;n de diagramas de   fases de an&aacute;lisis y desarrollo (Briand, Labiche y Miao,   2003). La ingenier&iacute;a inversa de software se apoya com&uacute;nmente   en la generaci&oacute;n del diagrama de clases,   debido a la importancia de este diagrama en la fase de   dise&ntilde;o y su facilidad de generaci&oacute;n. Existen tambi&eacute;n   otros diagramas de inter&eacute;s como el de comunicaci&oacute;n   y el de secuencias, que modelan las caracter&iacute;sticas   din&aacute;micas de un producto de software.</p>     <p>  Actualmente, existen herramientas y propuestas   de investigaci&oacute;n que realizan el proceso de   ingenier&iacute;a inversa hacia estos diagramas, que a&uacute;n   presentan algunos problemas: la mayor&iacute;a de las herramientas   CASE que realizan este proceso todav&iacute;a   lo hacen de forma experimental e incompleta; las herramientas   y propuestas de investigaci&oacute;n se enfocan,   por lo general, en el diagrama de clases, y finalmente   aquellas que intentan obtener otros diagramas (como   los de interacci&oacute;n) a&uacute;n no obtienen los nuevos elementos   que define el est&aacute;ndar de UML 2.0.</p>     <p>  En este art&iacute;culo se propone un proceso de   conversi&oacute;n de c&oacute;digo JAVA a diagrama de secuencias   de UML 2.0, en el cual se define un conjunto de   reglas de transformaci&oacute;n y que se ejemplifica con un   caso de estudio en el prototipo de una herramienta   que automatiza dicho proceso, denominada UNCInversor.   El art&iacute;culo se organiza as&iacute;: en la secci&oacute;n 2 se   presenta un marco te&oacute;rico que recopila los conocimientos   b&aacute;sicos necesarios para comprender los   procesos de ingenier&iacute;a inversa; en la secci&oacute;n 3 se   discuten los antecedentes y trabajos existentes en   la materia, prestando especial atenci&oacute;n a la ingenier&iacute;a   inversa del diagrama de secuencias a partir   de c&oacute;digo ejecutable; en la secci&oacute;n 4 se presenta   el m&eacute;todo para obtener el diagrama de secuencias de UML 2.0 a partir de c&oacute;digo JAVA, detallando las   reglas y el m&eacute;todo empleado en la transformaci&oacute;n;   en la secci&oacute;n 5 se presenta un caso de estudio que   emplea el prototipo de la herramienta UNC-Inversor,   que automatiza el m&eacute;todo propuesto; al final, en las   secciones 6 y 7, se presentan las conclusiones y el   trabajo futuro, respectivamente.</p> </font>     <p><font size="3" face="Verdana"><b> 2. MARCO TE&Oacute;RICO</b></font></p> <font face="Verdana"size="2">     <p>  La ingenier&iacute;a inversa es el proceso para analizar   componentes y relaciones entre componentes,   con el fin de construir descripciones de un sistema en   un nivel superior de abstracci&oacute;n (Chikofsky y Cross,   1990). La ingenier&iacute;a inversa de software permite extraer   los detalles estructurales y de comportamiento   impl&iacute;citos en el c&oacute;digo de un producto de software   y expresarlos de forma est&aacute;ndar, generalmente en diagramas UML (Tonella y Potrich, 2005).</p>     ]]></body>
<body><![CDATA[<p>  Existen dos tipos de ingenier&iacute;a inversa. El primero   se basa en el c&oacute;digo est&aacute;tico, es decir, cuando   no se utiliza informaci&oacute;n de tiempo de ejecuci&oacute;n, y el   segundo analiza el c&oacute;digo en ejecuci&oacute;n. Esta diferencia   es importante, en tanto establece la dificultad de   la inversi&oacute;n y sus alcances. Mientras que la inversi&oacute;n   del c&oacute;digo est&aacute;tico se utiliza, ante todo, cuando se generan   diagramas que describen su estructura, como   el diagrama de clases y el de paquetes, la inversi&oacute;n   que analiza el c&oacute;digo en ejecuci&oacute;n se utiliza, primordialmente,   cuando se requieren modelos que revelen   las caracter&iacute;sticas din&aacute;micas del sistema, como el   diagrama de objetos (Fowler, 2004). El diagrama   de secuencias modela el comportamiento din&aacute;mico   de un software, lo cual sugiere que se debe invertir   usando el c&oacute;digo en ejecuci&oacute;n. Sin embargo, por ser   la secuencia de mensajes la que interesa analizar, es   posible utilizar la informaci&oacute;n est&aacute;tica obtenida en   tiempo de compilaci&oacute;n para invertir sus caracter&iacute;sticas esenciales.</p>     <p>  Entre los usos m&aacute;s difundidos de la ingenier&iacute;a   inversa se encuentran (Tonella y Potrich, 2005): la   documentaci&oacute;n de aplicaciones con deficientes   fases de an&aacute;lisis y dise&ntilde;o, con el fin de facilitar el   mantenimiento y la correcci&oacute;n de defectos que el   software pueda presentar; la adquisici&oacute;n de conocimiento   de un producto de software, revelando los   detalles estructurales y de comportamiento que se   encuentran dispersos u ocultos, ofreciendo mayor   independencia entre el producto de software y sus   constructores; finalmente, el apoyo al aseguramiento   de la calidad del software, al facilitar la comparaci&oacute;n   de los diagramas de an&aacute;lisis y dise&ntilde;o contra   los diagramas generados mediante el proceso de ingenier&iacute;a inversa.</p>     <p>  Asimismo, la ingenier&iacute;a inversa de software   presenta riesgos y problemas que pueden ocasionar   que un equipo de trabajo desestime su uso. Entre ellos se encuentran los siguientes:</p> </font>    <p><font size="2">-</font><font size="2" face="Verdana"> Las dificultades asociadas con la complejidad de   la inversi&oacute;n y con la comprensi&oacute;n de los diagramas,   puesto que en muchos casos se incluye informaci&oacute;n irrelevante.</font></p> <font face="Verdana"size="2"></font>    <p><font size="2">-</font><font size="2" face="Verdana"> La escasa madurez de los procesos de ingenier&iacute;a   inversa, que implica un bajo refinamiento en la   transformaci&oacute;n y, por ende, incrementa la susceptibilidad a errores.</font></p> <font face="Verdana"size="2"></font>    <p><font size="2">-</font><font size="2" face="Verdana"> El desconocimiento de la aplicaci&oacute;n de la ingenier&iacute;a   inversa en entornos productivos y la   desconfianza por el uso de nuevas tecnolog&iacute;as.</font></p> <font face="Verdana"size="2">    <p>  El diagrama de secuencias UML 2.0 es un   diagrama de interacci&oacute;n que describe c&oacute;mo un   grupo de objetos intercambian mensajes para realizar   una operaci&oacute;n. Existen muchas caracter&iacute;sticas   por las cuales el diagrama de secuencias UML 2.0   se usa para modelar el comportamiento din&aacute;mico   de un sistema. Entre estas, se destaca la facilidad de   comprensi&oacute;n, es decir, que no se necesita una explicaci&oacute;n   rigurosa de la notaci&oacute;n de dicho diagrama y la   posibilidad de modelar secuencias correspondientes   a c&oacute;digos escritos en lenguajes orientados a objetos,   ya que estos se basan en el intercambio de mensajes (Fowler, 2004).</p>     <p>  En el diagrama de secuencias, se distribuyen   los elementos en dos ejes, en los cuales se ubican los participantes (eje horizontal u objetual) y los mensajes   y fragmentos combinados (eje vertical o temporal).   Los elementos del diagrama de secuencias son:   participantes, mensajes y fragmentos combinados   (Fowler, 2004).</p> </font>     <p><font size="3" face="Verdana"><b>  3. ANTECEDENTES</b></font></p> <font face="Verdana"size="2">     <p>  Ahora se dispone de varias herramientas   CASE que automatizan los procesos de ingenier&iacute;a   inversa. Algunas de las m&aacute;s representativas son:   NetBeans (Myatt, 2007), Together versi&oacute;n 2006 de   Borland que se apoya en el entorno Eclipse (Thurston   y Kanouse, 2005), Visual Paradigm (Tsang, 2005) y Visual   Studio (Levinson y Nelson, 2006). Exceptuando   el Visual Studio, que s&oacute;lo genera unas estructuras de   datos desde c&oacute;digo, las dem&aacute;s herramientas generan   de forma exitosa el diagrama de clases desde c&oacute;digo   en diferentes lenguajes de programaci&oacute;n, pero todas   ellas presentan inconvenientes al obtener el diagrama   de secuencias, puesto que no obtienen la gran   mayor&iacute;a de los elementos de dicho diagrama pertenecientes   al est&aacute;ndar de UML 2.0. Adem&aacute;s, NetBeans   y Together 2006 para Eclipse, que s&iacute; generan algunos   de los elementos de UML 2.0, presentan problemas   en la identificaci&oacute;n del fragmento combinado LOOP, a partir de sentencias DO y DO WHILE.</p>     ]]></body>
<body><![CDATA[<p>  El creciente inter&eacute;s en esta clase de trabajos se   nota tambi&eacute;n en el trabajo de El-Attar y Miller (2008)   quienes, a partir de las descripciones textuales de los   casos de uso, aplican ingenier&iacute;a inversa a la obtenci&oacute;n   del diagrama de casos de uso, que es uno de   los diagramas de comportamiento de UML, el grupo   de diagramas del cual descienden los de interacci&oacute;n.   Existen propuestas de investigaci&oacute;n que estudian la   ingenier&iacute;a inversa del c&oacute;digo orientado a objetos a   nivel general, como Baxter y Mehlich (1997), que   consideran la ingenier&iacute;a inversa como un caso especial   de la ingenier&iacute;a de software convencional; Cain y   McCrindle (1999), que generan una taxonom&iacute;a de clases   a partir de c&oacute;digo en C++, y Snavely, Debray y Andrews   (2005), que obtienen diagramas de flujo y expresiones en l&oacute;gica de predicados a partir de c&oacute;digo C.</p>     <p>  Otras propuestas se encargan &uacute;nicamente del   diagrama de clases, como Gu&eacute;h&eacute;neuc (2004) desde   lenguaje C; Sutton y Maletic (2005), Philippow et al.   (2005), Yeh et al. (2007) y Sutton y Maletic (2007) desde   C++; Keschenau (2004), Wang y Yuan (2006) y   Dong, Lad y Zhao (2007) a partir de c&oacute;digo JAVA.</p>     <p>  Un tercer grupo de propuestas se encarga de   diagramas de interacci&oacute;n, como el de comunicaci&oacute;n   (colaboraci&oacute;n en el est&aacute;ndar de UML 1.4) y el de   secuencias. En este grupo se encuentran Kollman y   Gogolla (2001), que definen los elementos b&aacute;sicos del   diagrama de comunicaci&oacute;n, como actores, objetos   y mensajes; Briand, Labiche y Miao (2003) y L&oacute;pez   et al. (2006), que obtienen el diagrama de secuencias   de UML a partir de c&oacute;digo C++, pero que no   obtienen los fragmentos combinados definidos en el   est&aacute;ndar de UML 2.0; Tonella y Potrich (2005), que   realizan una revisi&oacute;n de las t&eacute;cnicas disponibles para   la ingenier&iacute;a inversa de c&oacute;digo orientado a objetos   y dedican un cap&iacute;tulo especial a los diagramas de   interacci&oacute;n, pero sin obtener los elementos nuevos   definidos por el est&aacute;ndar de UML 2.0 (como los   fragmentos combinados), y Merdes y Dorsch (2006),   que obtienen los diagramas de secuencias de UML a   partir de JAVA, pero sin incluir los fragmentos combinados.   Propuestas como la de Rountev et al. (2005) y   Rountev y Connell (2005) obtienen los diagramas de   secuencias de UML 2.0 a partir de JAVA, incluyendo   algunos fragmentos combinados, pero presentan   problemas con el fragmento LOOP a partir de las sentencias DO y DO WHILE.</p> </font>     <p>  <font size="3" face="Verdana"><b>4. M&Eacute;TODO PARA LA   INGENIER&Iacute;A INVERSA   DEL DIAGRAMA DE   SECUENCIAS DE UML 2.0   A PARTIR DE C&Oacute;DIGO JAVA</b></font></p> <font face="Verdana"size="2">     <p>  Como una forma de respuesta a los diferentes   problemas enunciados en la secci&oacute;n anterior para   la inversi&oacute;n del diagrama de secuencias, el grupo   de Lenguajes Computacionales de la Universidad Nacional de Colombia presenta, en este art&iacute;culo,   un m&eacute;todo que permite obtener los diferentes elementos   del diagrama de secuencias de UML 2.0,   incluyendo los fragmentos combinados OPT, ALT y   LOOP, obtenido este &uacute;ltimo a partir de sentencias   DO y FOR. Para las sentencias DO WHILE, se opt&oacute;   por generar un fragmento combinado estereotipado   &lt;&lt;DO-WHILE&gt;&gt;, puesto que su sem&aacute;ntica es   muy diferente de los fragmentos combinados LOOP   convencionales. Las reglas de transformaci&oacute;n se   definen en JAVA, pero se podr&iacute;an definir equivalencias   a cualquier otro lenguaje orientado a objetos.   En la <a href="img/revistas/eia/n9/n9a03tab1.gif" target="_blank">tabla 1</a>, se muestran algunas de las reglas de   transformaci&oacute;n (las dem&aacute;s se omitieron por razones   de espacio). En &ldquo;Condici&oacute;n&rdquo; se incluye un ejemplo   del fragmento que se busca en el c&oacute;digo JAVA, en   tanto que en &ldquo;Resultado&rdquo; se presenta la imagen del   diagrama de secuencias resultante en cada caso. Se   incluye para cada regla una descripci&oacute;n en lenguaje   natural por efectos de claridad de la regla.</p>     <p>El m&eacute;todo enunciado se program&oacute; en el   prototipo UNC-Inversor. La <a href="img/revistas/eia/n9/n9a03fig1.gif" target="_blank">figura 1</a> ilustra los diferentes   m&oacute;dulos que componen el UNC-Inversor   y tambi&eacute;n ilustra el proceso de inversi&oacute;n (m&oacute;dulo de inversi&oacute;n).</p>     <p>  El proceso de inversi&oacute;n comienza luego de   hacer un an&aacute;lisis de c&oacute;digo para identificar paquetes,   clases, m&eacute;todos y atributos y para ello es indispensable   que se cree un proyecto que contenga los   archivos fuente. Enseguida, se selecciona el m&eacute;todo   inicial de inversi&oacute;n y se contin&uacute;a con la obtenci&oacute;n   de la representaci&oacute;n computacional del diagrama   de secuencias en lenguaje XML para, al final, presentarle   al usuario el gr&aacute;fico correspondiente a la   inversi&oacute;n del m&eacute;todo seleccionado como inicial. La   inversi&oacute;n se puede hacer de dos formas diferentes:   en la primera (forma no recurrente) se resuelven &uacute;nica y exclusivamente los mensajes pertenecientes al m&eacute;todo elegido para invertir, mientras que en la segunda forma (recurrente) se ofrece una mayor flexibilidad y se resuelven los mensajes ocasionados por los propios mensajes contenidos en el m&eacute;todo de inversi&oacute;n inicial.</p>     <p>En esta &uacute;ltima forma, la resoluci&oacute;n de los   mensajes permite condensar en un solo diagrama el   comportamiento del sistema desde una perspectiva   m&aacute;s global. Es de anotar que ninguna de las herramientas CASE comerciales resuelve los mensajesde forma recurrente. El UNC-Inversor detecta los m&eacute;todos recurrentes que se encuentran dentro del c&oacute;digo que se invierte, de manera que no se entra en un bucle infinito de recurrencia. El UNCInversor maneja este proceso con la ayuda de tres m&oacute;dulos: inversi&oacute;n, edici&oacute;n de diagramas y manejo de proyectos.</p>     <p>  El m&oacute;dulo de Inversi&oacute;n es el n&uacute;cleo de UNCInversor,   que integra las diferentes funciones para   asumir la complejidad que requiere el proceso de   inversi&oacute;n. Este m&oacute;dulo se compone a su vez de tres   m&oacute;dulos m&aacute;s peque&ntilde;os: an&aacute;lisis de c&oacute;digo, manejo   de archivos XML y graficaci&oacute;n. El m&oacute;dulo de an&aacute;lisis   de c&oacute;digo se encarga de recorrer los paquetes   y clases de los diferentes archivos que forman un   proyecto de programaci&oacute;n en JAVA y obtiene estructuras   de datos que representen el c&oacute;digo por   analizar en memoria, para formar estructuras para   las clases incluyendo sus m&eacute;todos, atributos, importaciones   y clases interiores. Este m&oacute;dulo tambi&eacute;n   se encarga de analizar el m&eacute;todo inicial para crear   la representaci&oacute;n computacional del diagrama de   secuencias. El m&oacute;dulo de manejo de archivos XML   se encarga de generar la estructura para los archivos   XML correspondientes a los diagramas de secuencias   creados por el m&oacute;dulo de an&aacute;lisis de c&oacute;digo; tiene   la capacidad de guardarlos en disco y leerlos para   su posterior an&aacute;lisis. El m&oacute;dulo de graficaci&oacute;n se   encarga de dibujar y situar los diferentes elementos   de un diagrama de secuencias que se encuentra almacenado en un archivo XML.</p>     <p>  El m&oacute;dulo de edici&oacute;n de diagramas le permite   al UNC-Inversor editar el diagrama de secuencias, y   lo convierte en una herramienta CASE convencional   de modelado. Los diagramas invertidos tambi&eacute;n   son susceptibles de modificaci&oacute;n, pues permiten el   manejo est&eacute;tico que el usuario requiera. Este m&oacute;dulo   permite guardar los diagramas de secuencias   generados en el proceso de inversi&oacute;n o editados por   el usuario, en formato binario, como una imagen en   formato jpg o como un archivo XML compatible con   el usado por el m&oacute;dulo de graficaci&oacute;n.</p>     ]]></body>
<body><![CDATA[<p>El m&oacute;dulo de manejo de proyectos absorbe   la complejidad asociada con el manejo de proyectos   y crea un entorno que facilita la inversi&oacute;n. De   esta manera, permite manejar varios proyectos   simult&aacute;neamente y crear las estructuras de archivos   y carpetas necesarias para crear, abrir o editar un proyecto de inversi&oacute;n.</p> </font>     <p><font size="3" face="Verdana"><b>  5. CASO DE ESTUDIO   EN EL PROTOTIPO UNC INVERSOR</b></font></p> <font face="Verdana"size="2">     <p>  El siguiente es un ejemplo de conversi&oacute;n de   c&oacute;digo JAVA en el diagrama de secuencias de UML 2.0, a trav&eacute;s de la herramienta UNC-Inversor.</p>     <p>  El m&eacute;todo que se analiza pertenece a la clase   &lsquo;CajeroAutomatico&rsquo;, la cual hace parte de un c&oacute;digo   JAVA que emula el comportamiento de un cajero   autom&aacute;tico bancario. La <a href="img/revistas/eia/n9/n9a03fig2.gif" target="_blank">figura 2 </a>muestra el fragmento   de c&oacute;digo, que incluye el m&eacute;todo analizado &lsquo;Depositar&rsquo;   y el m&eacute;todo referenciado en el interior de &eacute;ste   &lsquo;sumarAlSaldo&rsquo;. Por efectos de claridad del proceso,   se omiten los dem&aacute;s m&eacute;todos de la clase &lsquo;CajeroAutomatico&rsquo;.   Las reglas de transformaci&oacute;n que se emplean   para la inversi&oacute;n del fragmento de c&oacute;digo de la <a href="img/revistas/eia/n9/n9a03fig2.gif" target="_blank">figura   2</a> se muestran en la <a href="img/revistas/eia/n9/n9a03tab1.gif" target="_blank">tabla 1</a>. Usando la herramienta   UNC-Inversor para realizar la inversi&oacute;n de este c&oacute;digo,   se obtiene el resultado que se presenta en la <a href="img/revistas/eia/n9/n9a03fig3.gif" target="_blank">figura   3</a>. En esta figura, se puede apreciar la secuencia de   mensajes resultante del an&aacute;lisis del m&eacute;todo &lsquo;Depositar&rsquo;.   En el ejemplo de inversi&oacute;n, se pueden observar las siguientes secuencias:</p>  </font>     <p><font size="2">- </font><font size="2" face="Verdana">El participante &lsquo;CajeroAutomatico&rsquo; representa la   clase que contiene el m&eacute;todo inicial de inversi&oacute;n.   Se refiere a la regla 11 de la <a href="img/revistas/eia/n9/n9a03tab1.gif" target="_blank">tabla 1</a> y se ve, en el c&oacute;digo, en la l&iacute;nea 5.</font></p>     <p><font size="2">-</font><font size="2" face="Verdana"> El mensaje &lsquo;Depositar()&rsquo; es el m&eacute;todo inicial de   inversi&oacute;n, por lo cual se dibuja como un mensaje   tipo Encontrado. Se asocia con la regla 5 de la<a href="img/revistas/eia/n9/n9a03tab1.gif" target="_blank"> tabla   1</a> y se ve en la <a href="img/revistas/eia/n9/n9a03fig2.gif" target="_blank">figura 2</a> del c&oacute;digo en la l&iacute;nea 9.</font></p>     <p><font size="2">-</font><font size="2" face="Verdana"> Las secuencias asociadas a las l&iacute;neas 10, 11, 12,   16 y 20 son mensajes &lsquo;System.out.println&rsquo; y se   refieren a interacciones con el usuario por medio   la consola, por lo que se dibujan como mensajes   recurrentes. Estos se asocian con la regla 3 de la   <a href="img/revistas/eia/n9/n9a03tab1.gif" target="_blank">tabla</a> de reglas de transformaci&oacute;n. De esta misma   forma, se puede analizar el mensaje &lsquo;sumarAlSaldo()&rsquo;,   que se encuentra en la l&iacute;nea 19 del c&oacute;digo de la <a href="img/revistas/eia/n9/n9a03fig2.gif" target="_blank">figura 2</a>.</font></p>     <p><font size="2">-</font><font size="2" face="Verdana"> En la l&iacute;nea 13 del c&oacute;digo, se encuentra la secuencia   de instanciaci&oacute;n de un nuevo objeto,   lo cual se representa por medio de un mensaje   tipo Nuevo y la aparici&oacute;n de un participante tipo   L&iacute;mite, debido a que la clase Double no hace parte de la estructura del c&oacute;digo invertido. Estas   secuencias, se transforman aplicando las reglas   2 y 8 de la tabla de reglas de transformaci&oacute;n.</font></p>     <p><font size="2">-</font><font size="2" face="Verdana"> El mensaje &lsquo;doubleValue()&rsquo; es de tipo Normal, se   representa en la l&iacute;nea de c&oacute;digo 14 y se invierte al aplicar la regla 1 de la tabla 1.</font></p>     <p><font size="2">-</font><font size="2" face="Verdana"> La estructura de control alternativo &lsquo;if-else&rsquo;, que   abarca las l&iacute;neas 15 a 23 del c&oacute;digo, se transforma   mediante la aplicaci&oacute;n de la regla 13 de la tabla de   reglas de transformaci&oacute;n. En la <a href="img/revistas/eia/n9/n9a03fig2.gif" target="_blank">figura 2</a>, se aprecia   su representaci&oacute;n como el fragmento combinado   ALT, el cual contiene todos los mensajes enviados dentro de la estructura de control.</font></p>     ]]></body>
<body><![CDATA[<p><font size="2">-</font><font size="2" face="Verdana"> Los mensajes tipo Retorno se asocian con las   l&iacute;neas 17 y 21 del c&oacute;digo invertido y representan   el env&iacute;o de un m&eacute;todo return aplicando la regla 4 de la tabla 1.</font></p>      <p><font size="3" face="Verdana"><b>  6. CONCLUSIONES</b></font></p> <font face="Verdana"size="2">     <p>  La ingenier&iacute;a inversa es un proceso multiprop&oacute;sito   que contribuye a mejorar la documentaci&oacute;n   que se genera mediante la ingenier&iacute;a de software.   Dentro de la ingenier&iacute;a de software, la ingenier&iacute;a   inversa hacia diagramas de secuencias permite la   comprensi&oacute;n de los detalles din&aacute;micos de un m&eacute;todo   por medio de la visualizaci&oacute;n del intercambio de   mensajes en el tiempo. Este tipo de ingenier&iacute;a inversa   a&uacute;n presenta problemas que motivan la investigaci&oacute;n   en este campo, pues, por lo general, los esfuerzos se   encaminaron a la ingenier&iacute;a inversa del diagrama de   clases y los trabajos que se ocupan de los diagramas   de interacci&oacute;n todav&iacute;a presentan problemas, como la   falta de identificaci&oacute;n de los fragmentos combinados   y los errores que se cometen al invertir sentencias DO y DO WHILE.</p>     <p>  En este art&iacute;culo se defini&oacute; un m&eacute;todo para   obtener el diagrama de secuencias de UML 2.0 a   partir de c&oacute;digo JAVA, como una forma de superar   algunas de las limitaciones encontradas en este proceso.   Este m&eacute;todo permite automatizar el proceso de   ingenier&iacute;a inversa a diagrama de secuencias de UML   2.0, mediante la aplicaci&oacute;n de reglas de transformaci&oacute;n   que establecen una relaci&oacute;n un&iacute;voca entre los   elementos del diagrama y patrones de c&oacute;digo, que   se ejemplifica en JAVA, pero se podr&iacute;an equiparar a cualquier lenguaje orientado a objetos.</p>     <p>  La inversi&oacute;n del diagrama de secuencias, aunque   es una tarea compleja que te&oacute;ricamente se debe   realizar con informaci&oacute;n de tiempo de ejecuci&oacute;n y   de tiempo de compilaci&oacute;n, se puede simplificar para   realizar la inversi&oacute;n tomando como base la informaci&oacute;n   de tiempo de compilaci&oacute;n, para obtener de esta   manera la mayor cantidad de secuencias disponibles en el c&oacute;digo.</p> </font>     <p><font size="3" face="Verdana"><b>  7. TRABAJO FUTURO</b></font></p> <font face="Verdana"size="2">     <p>  Existen aspectos del c&oacute;digo que el m&eacute;todo   definido en este art&iacute;culo no contempla, como algunas   operaciones que se corren en tiempo de ejecuci&oacute;n,   tales como polimorfismos y asociaciones tard&iacute;as. Estos   aspectos, al igual que la mayor&iacute;a de los fragmentos   combinados predefinidos en UML no los invierte   este m&eacute;todo, por no tener una representaci&oacute;n l&oacute;gica   en el c&oacute;digo. Asimismo, los esfuerzos subsecuentes   a este trabajo se enfocar&aacute;n en inversiones de m&aacute;s   diagramas y desde m&aacute;s lenguajes, contemplando la   mayor cantidad de detalles, con el objetivo de que el   conjunto de documentos invertidos conformen entre   todos una representaci&oacute;n completa de un producto de software determinado.</p>     <p>  Es importante, igualmente, la definici&oacute;n   de un mecanismo de comparaci&oacute;n que permita   determinar la coherencia entre los diagramas de   secuencia construidos en fases de an&aacute;lisis y dise&ntilde;o y   los obtenidos a partir del proceso de inversi&oacute;n. Esta   comparaci&oacute;n permite establecer qu&eacute; tan similar es   lo construido con lo deseado. Adem&aacute;s, si se supone   que los diagramas de fase de an&aacute;lisis y dise&ntilde;o son   correctos, se pueden realizar extrapolaciones para   que la comparaci&oacute;n determine si el producto de   software cumple con las necesidades del interesado o no. Este criterio de comparaci&oacute;n tambi&eacute;n se debe   definir para los otros diagramas que se obtengan   mediante el proceso de inversi&oacute;n.</p> </font>     <p><font size="3" face="Verdana"><b>  REFERENCIAS</b></font></p> <font face="Verdana"size="2">     <!-- ref --><p>  Baxter, D. and Mehlich, M. (1997). Reverse engineering   is reverse forward engineering. Proceedings of the 4th   Working Conference on Reverse Engineering, Amsterdam   (Pa&iacute;ses Bajos).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000062&pid=S1794-1237200800010000300001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Briand, L. C.; Labiche, Y. and Miao, Y. (2003). Towards the   reverse engineering of UML sequence diagrams. Proceedings   of the 10th Working Conference on Reverse Engineering, Victoria (Canada), pp. 57-66.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000063&pid=S1794-1237200800010000300002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Cain, J. W. and McCrindle, R. J. (1999). Software visualisation   using C++ Lenses. Proceedings of the 7th   International Workshop on Program Comprehension, Pittsburgh (Estados Unidos).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000064&pid=S1794-1237200800010000300003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Chikofsky, E. and Cross, J. (1990). Reverse engineering   and design recovery: A Taxonomy. IEEE Software, 7(1): 13-17.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000065&pid=S1794-1237200800010000300004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Dong, J.; Lad, D. and Zhao, Y. (2007). DP-Miner: Design   pattern discovery using Matrix. Proceedings of the 14th   Annual IEEE International Conference and Workshops   on the Engineering of Computer-Based Systems, Tucson (Estados Unidos). p. 371-380.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000066&pid=S1794-1237200800010000300005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  El-Attar, M. and Miller, J. (2008). Producing robust use case   diagrams via reverse engineering of use case descriptions. Software and System Modeling 7:67-73.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000067&pid=S1794-1237200800010000300006&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Fitzgerald, B.; Russo, N. and O&#39;Kane, T. (2003). Software   development method tailoring at Motorola. Communications of the ACM, 46(4):64-70.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000068&pid=S1794-1237200800010000300007&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Fowler, M. 2004. UML distilled: A brief guide to the   standard object modeling language. Addison Wesley, Boston.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000069&pid=S1794-1237200800010000300008&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Gu&eacute;h&eacute;neuc, Y. (2004). A reverse engineering tool for   precise class diagrams. Proceedings of the 2004 Conference   on the Centre for Advanced Studies on Collaborative Research, Markham (Canad&aacute;), pp. 28-41.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000070&pid=S1794-1237200800010000300009&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Keschenau, M. (2004). Reverse engineering of UML specifications   from Java programs. Proceedings of the 19th   Annual ACM SIGPLAN Conference on Object-Oriented   Programming Systems, Languages, and Applications, Vancouver (Canad&aacute;), pp. 326-327.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000071&pid=S1794-1237200800010000300010&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Kollman, R. and Gogolla, M. (2001). Capturing dynamic   program behaviour with UML collaboration diagrams.   Proceedings of the 5th Conference on Software Maintenance   and Reengineering, Lisboa (Portugal).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000072&pid=S1794-1237200800010000300011&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Levinson, J. and Nelson, D. 2006. Pro Visual Studio 2005 team system. Apress, Berkeley.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000073&pid=S1794-1237200800010000300012&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  L&oacute;pez, M.; Alfonzo, A.; P&eacute;rez, J.; Gonz&aacute;lez, J. and Montes,   A. (2006). A metamodel to carry out reverse engineering   of C++ Code into UML Sequence Diagrams. Proceedings   of the Electronics, Robotics and Automotive Mechanics Conference, Cuernavaca (M&eacute;xico).&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000074&pid=S1794-1237200800010000300013&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Merdes, M. and Dorsch, D. (2006). Experiences with the   development of a reverse engineering tool for UML   sequence diagrams: A case study in modern Java   development. Proceedings of the 4th International   Symposium on Principles and Practice of Programming   in Java, Mannheim (Alemania), pp. 125-134.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000075&pid=S1794-1237200800010000300014&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Myatt, A. 2007. Pro NetBeans IDE 5.5 Enterprise Edition. Apress, New York.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000076&pid=S1794-1237200800010000300015&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Philippow, I.; Streitferdt, D.; Riebisch, M. and Naumann, S.   (2005). An approach for reverse engineering of design patterns. Software and System Modeling 4(1): 55-70.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000077&pid=S1794-1237200800010000300016&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Rountev, A. and Connell, B. (2005). Object naming analysis   for reverse-engineered sequence diagrams. Proceedings   of the 27th International Conference on Software Engineering, St. Louis (Estados Unidos), pp. 254-263.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000078&pid=S1794-1237200800010000300017&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>Rountev, A.; Volgin, O. and Reddoch, M. (2005). Static control-flow analysis for reverse engineering of UML sequence diagrams. Proceedings of the 2005 ACM SIGPLAN-SIGSOFT Workshop on Program Analysis for Software Tools and Engineering, Lisboa (Portugal), pp. 96-102.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000079&pid=S1794-1237200800010000300018&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Snavely, N.; Debray, S. and Andrews, G. (2005). Unpredication,   unscheduling, unspeculation: reverse engineering   Itanium executables. IEEE Transactions on Software Engineering, 31(2): 99-115.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000080&pid=S1794-1237200800010000300019&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Sutton, A. and Maletic, J. I. (2005). Mappings for accurately   reverse engineering UML class models from   C++. Proceedings of the 12th Working Conference   on Reverse Engineering, Pittsburgh (Estados Unidos), pp. 175-184.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000081&pid=S1794-1237200800010000300020&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Sutton, A. and Maletic, J. I. (2007). Recovering UML class   models from C++: a detailed explanation. information   and software technology, 49: 212-219.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000082&pid=S1794-1237200800010000300021&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Thurston, M. and Kanouse, G. 2005. Eclipse distilled: a   programmer&#39;s first look at Eclipse. Addison Wesley Professional, Indianapolis.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000083&pid=S1794-1237200800010000300022&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Tilley, S.; Wong, K.; Storey, M. and Muller, H. (1994). Programmable   reverse engineering. International Journal   of Software Engineering and Knowledge Engineering,   4(4):501-520.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000084&pid=S1794-1237200800010000300023&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>Tonella, P. and Potrich, A. 2005. Reverse engineering of object oriented code. Springer, New York.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000085&pid=S1794-1237200800010000300024&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Tsang, C. 2005. Object-oriented technology from diagram   to code with Visual Paradigm for UML. McGraw-Hill, Maidenhead.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000086&pid=S1794-1237200800010000300025&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Wang, X. and Yuan, X. (2006). Towards and AST-based   approach to reverse engineering. Proceedings of the   Canadian Conference on Electrical and Computer   Engineering, Ottawa (Canad&aacute;), pp. 422-425.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000087&pid=S1794-1237200800010000300026&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p>  Yeh, D.; Sun, P.; Chu, W.; Lin, C. and Yang, H. (2007). An   empirical study of a reverse engineering method for the   aggregation relationship based on operation propagation. Empirical Software Engineering 12:575-592.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000088&pid=S1794-1237200800010000300027&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --> ]]></body><back>
<ref-list>
<ref id="B1">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Baxter]]></surname>
<given-names><![CDATA[D]]></given-names>
</name>
<name>
<surname><![CDATA[Mehlich]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Reverse engineering is reverse forward engineering]]></source>
<year>1997</year>
<conf-name><![CDATA[ Conference on Reverse Engineering]]></conf-name>
<conf-loc>Amsterdam </conf-loc>
</nlm-citation>
</ref>
<ref id="B2">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Briand, L]]></surname>
<given-names><![CDATA[C]]></given-names>
</name>
<name>
<surname><![CDATA[Labiche]]></surname>
<given-names><![CDATA[Y]]></given-names>
</name>
<name>
<surname><![CDATA[Miao]]></surname>
<given-names><![CDATA[Y]]></given-names>
</name>
</person-group>
<source><![CDATA[Towards the reverse engineering of UML sequence diagrams]]></source>
<year>2003</year>
<conf-name><![CDATA[ Conference on Reverse Engineering]]></conf-name>
<conf-loc>Victoria </conf-loc>
<page-range>57-66</page-range></nlm-citation>
</ref>
<ref id="B3">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Cain, J]]></surname>
<given-names><![CDATA[W]]></given-names>
</name>
<name>
<surname><![CDATA[McCrindle, R]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
</person-group>
<source><![CDATA[Software visualisation using C++ Lenses]]></source>
<year>1999</year>
<conf-name><![CDATA[ Workshop on Program Comprehension]]></conf-name>
<conf-loc>Pittsburgh </conf-loc>
</nlm-citation>
</ref>
<ref id="B4">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Chikofsky]]></surname>
<given-names><![CDATA[E]]></given-names>
</name>
<name>
<surname><![CDATA[Cross]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Reverse engineering and design recovery: A Taxonomy]]></article-title>
<source><![CDATA[IEEE Software]]></source>
<year>1990</year>
<volume>7</volume>
<numero>1</numero>
<issue>1</issue>
<page-range>13-17</page-range></nlm-citation>
</ref>
<ref id="B5">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Dong]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
<name>
<surname><![CDATA[Lad]]></surname>
<given-names><![CDATA[D]]></given-names>
</name>
<name>
<surname><![CDATA[Zhao]]></surname>
<given-names><![CDATA[Y]]></given-names>
</name>
</person-group>
<source><![CDATA[DP-Miner: Design pattern discovery using Matrix]]></source>
<year>2007</year>
<conf-name><![CDATA[ Conference and Workshops on the Engineering of Computer-Based Systems]]></conf-name>
<conf-loc>Tucson </conf-loc>
<page-range>371-380</page-range></nlm-citation>
</ref>
<ref id="B6">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[El-Attar]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[Miller]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Producing robust use case diagrams via reverse engineering of use case descriptions]]></article-title>
<source><![CDATA[Software and System Modeling]]></source>
<year>2008</year>
<volume>7</volume>
<page-range>67-73</page-range></nlm-citation>
</ref>
<ref id="B7">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Fitzgerald]]></surname>
<given-names><![CDATA[B]]></given-names>
</name>
<name>
<surname><![CDATA[Russo]]></surname>
<given-names><![CDATA[N]]></given-names>
</name>
<name>
<surname><![CDATA[O´Kane]]></surname>
<given-names><![CDATA[T]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Software development method tailoring at Motorola]]></article-title>
<source><![CDATA[Communications of the ACM]]></source>
<year>2003</year>
<volume>46</volume>
<numero>4</numero>
<issue>4</issue>
<page-range>64-70</page-range></nlm-citation>
</ref>
<ref id="B8">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Fowler]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[UML distilled: A brief guide to the standard object modeling language]]></source>
<year>2004</year>
<publisher-loc><![CDATA[Boston ]]></publisher-loc>
<publisher-name><![CDATA[Addison Wesley]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B9">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Guéhéneuc]]></surname>
<given-names><![CDATA[Y]]></given-names>
</name>
</person-group>
<source><![CDATA[A reverse engineering tool for precise class diagrams]]></source>
<year>2004</year>
<conf-name><![CDATA[ Conference on the Centre for Advanced Studies on Collaborative Research]]></conf-name>
<conf-loc>Markham </conf-loc>
<page-range>28-41</page-range></nlm-citation>
</ref>
<ref id="B10">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Keschenau]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Reverse engineering of UML specifications from Java programs]]></source>
<year>2004</year>
<conf-name><![CDATA[ Conference on Object-Oriented Programming Systems, Languages, and Applications, Vancouver]]></conf-name>
<conf-loc> </conf-loc>
<page-range>326-327</page-range></nlm-citation>
</ref>
<ref id="B11">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Kollman]]></surname>
<given-names><![CDATA[R]]></given-names>
</name>
<name>
<surname><![CDATA[Gogolla]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Capturing dynamic program behaviour with UML collaboration diagrams]]></source>
<year>2001</year>
<conf-name><![CDATA[ Maintenance and Reengineering]]></conf-name>
<conf-loc>Lisboa </conf-loc>
</nlm-citation>
</ref>
<ref id="B12">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Levinson]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
<name>
<surname><![CDATA[Nelson]]></surname>
<given-names><![CDATA[D]]></given-names>
</name>
</person-group>
<source><![CDATA[Pro Visual Studio 2005 team system]]></source>
<year>2006</year>
<publisher-loc><![CDATA[Berkeley ]]></publisher-loc>
<publisher-name><![CDATA[Apress]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B13">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[López]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[Alfonzo]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[Pérez]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
<name>
<surname><![CDATA[González]]></surname>
<given-names><![CDATA[J]]></given-names>
</name>
<name>
<surname><![CDATA[Montes]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
</person-group>
<source><![CDATA[A metamodel to carry out reverse engineering of C++ Code into UML Sequence Diagrams]]></source>
<year>2006</year>
<conf-name><![CDATA[ Robotics and Automotive Mechanics Conference]]></conf-name>
<conf-loc>Cuernavaca </conf-loc>
</nlm-citation>
</ref>
<ref id="B14">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Merdes]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[Dorsch]]></surname>
<given-names><![CDATA[D]]></given-names>
</name>
</person-group>
<source><![CDATA[Experiences with the development of a reverse engineering tool for UML sequence diagrams: A case study in modern Java development]]></source>
<year>2006</year>
<conf-name><![CDATA[ Symposium on Principles and Practice of Programming in Java]]></conf-name>
<conf-loc>Mannheim </conf-loc>
</nlm-citation>
</ref>
<ref id="B15">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Myatt]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
</person-group>
<source><![CDATA[Pro NetBeans IDE 5.5 Enterprise Edition]]></source>
<year>2007</year>
<publisher-loc><![CDATA[New York ]]></publisher-loc>
<publisher-name><![CDATA[Apress]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B16">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Philippow]]></surname>
<given-names><![CDATA[I]]></given-names>
</name>
<name>
<surname><![CDATA[Streitferdt]]></surname>
<given-names><![CDATA[D]]></given-names>
</name>
<name>
<surname><![CDATA[Riebisch]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[Naumann]]></surname>
<given-names><![CDATA[S]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[An approach for reverse engineering of design patterns]]></article-title>
<source><![CDATA[Software and System Modeling]]></source>
<year>2005</year>
<volume>4</volume>
<numero>1</numero>
<issue>1</issue>
<page-range>55-70</page-range></nlm-citation>
</ref>
<ref id="B17">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Rountev]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[Connell]]></surname>
<given-names><![CDATA[B]]></given-names>
</name>
</person-group>
<source><![CDATA[Object naming analysis for reverse-engineered sequence diagrams]]></source>
<year>2005</year>
<conf-name><![CDATA[ Conference on Software Engineering]]></conf-name>
<conf-loc>St. Louis </conf-loc>
<page-range>254-263</page-range></nlm-citation>
</ref>
<ref id="B18">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Rountev]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[Volgin]]></surname>
<given-names><![CDATA[O]]></given-names>
</name>
<name>
<surname><![CDATA[Reddoch]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
</person-group>
<source><![CDATA[Static control-flow analysis for reverse engineering of UML sequence diagrams]]></source>
<year>2005</year>
<conf-name><![CDATA[ Workshop on Program Analysis for Software Tools and Engineering]]></conf-name>
<conf-loc>Lisboa </conf-loc>
<page-range>96-102</page-range></nlm-citation>
</ref>
<ref id="B19">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Snavely]]></surname>
<given-names><![CDATA[N]]></given-names>
</name>
<name>
<surname><![CDATA[Debray]]></surname>
<given-names><![CDATA[S]]></given-names>
</name>
<name>
<surname><![CDATA[Andrews]]></surname>
<given-names><![CDATA[G]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Unpredication, unscheduling, unspeculation: reverse engineering Itanium executables]]></article-title>
<source><![CDATA[IEEE Transactions on Software Engineering]]></source>
<year>2005</year>
<volume>31</volume>
<numero>2</numero>
<issue>2</issue>
<page-range>99-115</page-range></nlm-citation>
</ref>
<ref id="B20">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Sutton]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[Maletic, J]]></surname>
<given-names><![CDATA[I]]></given-names>
</name>
</person-group>
<source><![CDATA[Mappings for accurately reverse engineering UML class models from C++]]></source>
<year>2005</year>
<conf-name><![CDATA[ Conference on Reverse Engineering]]></conf-name>
<conf-loc>Pittsburgh </conf-loc>
<page-range>175-184</page-range></nlm-citation>
</ref>
<ref id="B21">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Sutton]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
<name>
<surname><![CDATA[Maletic, J]]></surname>
<given-names><![CDATA[I]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Recovering UML class models from C++: a detailed explanation]]></article-title>
<source><![CDATA[information and software technology]]></source>
<year>2007</year>
<volume>49</volume>
<page-range>212-219</page-range></nlm-citation>
</ref>
<ref id="B22">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Thurston]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[Kanouse]]></surname>
<given-names><![CDATA[G]]></given-names>
</name>
</person-group>
<source><![CDATA[Eclipse distilled: a programmer´s first look at Eclipse]]></source>
<year>2005</year>
<publisher-loc><![CDATA[Indianapolis ]]></publisher-loc>
<publisher-name><![CDATA[Addison Wesley Professional]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B23">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Tilley]]></surname>
<given-names><![CDATA[S]]></given-names>
</name>
<name>
<surname><![CDATA[Wong]]></surname>
<given-names><![CDATA[K]]></given-names>
</name>
<name>
<surname><![CDATA[Storey]]></surname>
<given-names><![CDATA[M]]></given-names>
</name>
<name>
<surname><![CDATA[Muller]]></surname>
<given-names><![CDATA[H]]></given-names>
</name>
</person-group>
<source><![CDATA[International Journal of Software Engineering and Knowledge Engineering]]></source>
<year>1994</year>
<volume>4</volume>
<numero>4</numero>
<issue>4</issue>
<page-range>501-520</page-range></nlm-citation>
</ref>
<ref id="B24">
<nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Tonella]]></surname>
<given-names><![CDATA[P]]></given-names>
</name>
<name>
<surname><![CDATA[Potrich]]></surname>
<given-names><![CDATA[A]]></given-names>
</name>
</person-group>
<source><![CDATA[Reverse engineering of object oriented code]]></source>
<year>2005</year>
<publisher-loc><![CDATA[Springer ]]></publisher-loc>
</nlm-citation>
</ref>
<ref id="B25">
<nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Tsang]]></surname>
<given-names><![CDATA[C]]></given-names>
</name>
</person-group>
<source><![CDATA[Object-oriented technology from diagram to code with Visual Paradigm for UML]]></source>
<year>2005</year>
<publisher-loc><![CDATA[Maidenhead ]]></publisher-loc>
<publisher-name><![CDATA[McGraw-Hill]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B26">
<nlm-citation citation-type="confpro">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Wang]]></surname>
<given-names><![CDATA[X]]></given-names>
</name>
<name>
<surname><![CDATA[Yuan]]></surname>
<given-names><![CDATA[X]]></given-names>
</name>
</person-group>
<source><![CDATA[Towards and AST-based approach to reverse engineering]]></source>
<year>2006</year>
<conf-name><![CDATA[ Conference on Electrical and Computer Engineering]]></conf-name>
<conf-loc>Ottawa </conf-loc>
<page-range>422-425</page-range></nlm-citation>
</ref>
<ref id="B27">
<nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Yeh]]></surname>
<given-names><![CDATA[D]]></given-names>
</name>
<name>
<surname><![CDATA[Sun]]></surname>
<given-names><![CDATA[P]]></given-names>
</name>
<name>
<surname><![CDATA[Chu]]></surname>
<given-names><![CDATA[W]]></given-names>
</name>
<name>
<surname><![CDATA[Lin]]></surname>
<given-names><![CDATA[C]]></given-names>
</name>
<name>
<surname><![CDATA[Yang]]></surname>
<given-names><![CDATA[H]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[An empirical study of a reverse engineering method for the aggregation relationship based on operation propagation]]></article-title>
<source><![CDATA[Empirical Software Engineering]]></source>
<year>2007</year>
<volume>12</volume>
<page-range>575-592</page-range></nlm-citation>
</ref>
</ref-list>
</back>
</article>
