Java Web Site

Ingegneria del Software: gruppo 9

Progetto Doclet -  JavaToXmiuml

Java Mapping

UML ROTATION

Sommario

Introduzione

Datatypes: tipi primitivi

Classi e interfacce

Generalizzazioni (classe padre e interfacce implementate)

Associazioni

Attributi

Operazioni (Metodi e costruttori)

Parametri (passati e di ritorno)

Bibliografia


Introduzione

JavaToXmiuml.java è un doclet Java che prende in input sorgenti Java e fornisce in output un documento XML formattato secondo il modello descritto in "UML semantics". Mentre tale modello descrive tutti i diagrammi UML, noi lo utilizziamo unicamente per generare un diagramma delle classi presenti nei sorgenti Java passati.
Nel fare questo ci sono almeno tre tipi di  problematiche:
  1. dato un determinato costrutto UML trovare il costrutto Java corrispondente. Anche se in genere si tratta di un'operazione semplice ci si trova spesso, anche per l'ambiguità delle specifiche del modello descritto da "UML semantics", a fare scelte dubbie.
  2. Decidere come operare in tutti i casi in cui una caratteristica Java non è contemplata dalla semantica UML.
  3. Risolvere tutti i casi in cui non è possibile risalire dal codice ad una deteminata proprietà (inverso del caso precedente), in quanto UML è stato studiato per aiutare la progettazione e la realizzazione di programmi, e la loro descrizione. Ma alcune proprietà sono puramente "filosofiche" rispetto al linguaggio di programmazione, non essendo implementate da essi in nessun modo.
Analizzeremo quindi ora caso per caso le scelte effettuate.
Torna al Sommario

Datatypes: tipi primitivi

I datatype sono scritti dal programma al termine della sezione xmi.contents dopo l'UML model vero e proprio. Anche se logicamente sarebbe forse più opportuno metterli prima, visto che sono usati dal modello, si è deciso di fare così per una questione di convenienza implementativa: per metterli prima sarebbe infatti stato necessario fare due passate dell'albero delle classi, aumentando notevolmente la complessità del sorgente.

Gli attributi visibility, isRoot, isLeaf e isAbstract, non hanno senso per i tipi primitivi, ma sono obbligatori per il DTD XMI.

Foundation.Core.DataType contiene i seguenti attributi:
 
Nome Attributo Breve descrizione Mappatura per Java - Breve Motivazione
Foundation.Core.ModelElement.name Nome del tipo nome del tipo (String, boolean, int,...)
Foundation.Core.ModelElement.visibility  (ereditato) public
Foundation.Core.GeneralizableElement.isRoot  (ereditato) true
Foundation.Core.GeneralizableElement.isLeaf  (ereditato) true 
Foundation.Core.GeneralizableElement.isAbstract  (ereditato) false 

Torna al Sommario

Classi e interfacce

Per le nostre esigenze dobbiamo distinguere tra classi e interfacce interne ed esterne: quelle interne sono le classi e le interfacce direttamente descritte nel codice sorgente passato alla doclet, quelle esterne sono le classi e le interfacce importate con la direttiva import. Solo le classi e le interfacce interne diventeranno classi nel diagramma, mentre le classi e le interfacce esterne sono descritte insieme ai datatype.

Nella colonna che riporta la mappatura Java abbiamo usato le seguenti variabili:

ClassDoc curClass; // ClassDoc descrive una classe nell'API Javadoc

Fondation.Core.Class e Fondation.Core.Interface contengono:
 
Nome Attributo Tipo Breve descrizione Mappatura in Java - Breve Motivazione
Foundation.Core.ModelElement.name * Nome della classe curClass.typeName()
Foundation.Core.ModelElement.visibility  * Visibilità della classe (public | 
private | protected)
L'attributo visibility prende valore p ublic nel caso in Java la visibilità della classe sia PackagePrivate o Public, prende p rotected nel caso sia Protected e p rivate nel caso sia Private
Foundation.Core.GeneralizableElement.isRoot  * Se è la radice False (abbiamo considerato radice solo la classe object, quindi tutte le altre non possono esserlo)
Foundation.Core.GeneralizableElement.isLeaf  * Se è una classe foglia isLeaf() - Vedi Codice
Foundation.Core.GeneralizableElement.isAbstract  * Se è abstract curClass.isAbstract()
Foundation.Core.Class.isActive IC,EC Questo metodo merita una descrizione approfondita in quanto la sua descrizione è quanto mai ambigua. La nostra interpretazione finale è stata che un processo è attivo quando può essere lanciato come processo autonomo Check sul fatto che la classe estenda Thread o Runnable - Vedi Codice
Foundation.Core.Classifier.feature IC,II Contiene campi e metodi Vedi sezioni apposite

Nota: La colonna Tipo indica a quale tipo di classe o interfaccia ci si riferisce:

IC
classi interne
EC
classi esterne
II
interfacce interne
EI
interfacce esterne
*
tutte le classi e le interfacce
Torna al Sommario

Generalizzazioni

(classe padre e interfacce implementate)

Abbiamo reso come una generalizzazione non solo la relazione tra una classe e la sua superclasse ma anche la relazione tra una classe e le interfacce che tale classe implementa.

Nella colonna che riporta la mappatura Java abbiamo usato le seguenti variabili:

ClassDoc curClass; // ClassDoc descrive una classe nell'API Javadoc

Gli attributi name, visibility, non hanno senso per le generalizzazioni Java, ma sono obbligatorie per il DTD XMI per UML, assumono quindi valori di default

Foundation.Core.Generalization contiene:
 
Nome Attributo Breve Descrizione Mappatura in Java - Breve Motivazione
Foundation.Core.ModelElement.name (ereditato) ""
Foundation.Core.ModelElement.visibility (ereditato) public
Foundation.Core.Generalization.discriminator Gruppo di classi a cui appartiene la generalizzazione. "" - Non è possibile ricavarlo dal codice
Foundation.Core.Generalization.subtype Classe figlia getClassId(curClass) - Vedi Codice
Foundation.Core.Generalization.supertype Classe padre getClassId(curClass.superclass()) - vedi Codice

Torna al Sommario

Associazioni

In un class diagram possono esserci almeno due tipi di associazione: quella che denota una qualche non meglio specificata relazione tra due classi, tipica della prospettiva concettuale e di quella analitica, e quella che denota attraverso un attributo della prima classe un preciso riferimento a un'istanza della seconda classe, tipica della prospettiva implementativa. Generalmente, la prima non ha navigabilità, la seconda si.
Scrivendo un tool di reverse engineering il fine è quello di scrivere un diagramma delle classi che ricalchi fedelmente i sorgenti dati: la prospettiva è ovviamente implementativa. Per questo motivo abbiamo scartato l'idea di far inserire al programmatore dei tag nel codice che potessero fornire informazioni concettuali sul dominio del problema.
Le uniche associazioni che abbiamo preso in considerazione sono quelle che traggono origine dai puntatori di una classe: se un attributo della classe A è di tipo B,  il programmatore può inserire un tag @explicit_association prima della dichiarazione dell'attributo per indicare che deve essere generata un'associazione.

Nella colonna che riporta la mappatura Java abbiamo usato le seguenti variabili:

ClassDoc curClass; // ClassDoc descrive una classe nell'API Javadoc
ClassDoc assocClass; // classe associata

Gli attributi isRoot, is Leaf, is Abstract non hanno senso per le associazioni Java, ma sono obbligatorie per il DTD XMI per UML, assumono quindi valori di default

Foundation.Core.Association contiene:
 
Nome Attributo Breve Descrizione Mappatura in Java - Breve Motivazione
Foundation.Core.ModelElement.name Nome dell' associazione curClass.typeName() + "-" + assocClass.typeName() + "Association"
Foundation.Core.ModelElement.visibility Visibilità dell' attributo (public | private | protected) "Public"
Foundation.Core.GeneralizableElement.isRoot  (ereditato) false
Foundation.Core.GeneralizableElement.isLeaf  (ereditato) false
Foundation.Core.GeneralizableElement.isAbstract  (ereditato) false
Foundation.Core.Association.connection Contiene un AssociationEnd Vedi sotto
Foundation.Core.Association.connection Contiene un AssociationEnd Vedi sotto

Foundation.Core.AssociationEnd contiene:
 
Nome Attributo Breve Descrizione Mappatura in Java - Breve Motivazione
Foundation.Core.ModelElement.name Nome dell' AssociationEnd ""
Foundation.Core.ModelElement.visibility Visibilità dell' attributo (public | private | protected) Nel sorgente prende visibilità Private, metre nel destinatario ha la visibilità della classe sorgente.
Foundation.Core.AssociationEnd.isNavigable Indica la navigabilità, cioè il senso della freccia(da piazzare verso il target).  Nel Sorgente prende il valore true, metre nel destinatario prende il valore false. 
Foundation.Core.AssociationEnd.isOrdered Indica se l' associazione è ordinata (da piazzare sul target) "false"
Foundation.Core.AssociationEnd.aggregation Specifica se l' associazione è di tipo normale, se è un' aggregazione o una composizione (da piazzare verso il target). i possibili valori sono: 
None: associazione semplice o source 
Aggregate: aggregazione 
Composite: composizione
Nel Sorgente prende il valore none, mentre nel Destinatario prende il valore composite.
Foundation.Core.AssociationEnd.multiplicity Molteplicità del ruolo Nel Sorgente prende il valore 1, metre nel Destinatario la molteplicità del campo nella classe sorgente.
Foundation.Core.StructuralFeature.changeable (ereditato) "none" - Possibilità non concessa da Java
Foundation.Core.StructuralFeature.targetScope Se il link è a un'istanza o al classifier stesso "instance"
Foundation.Core.AssociationEnd.type Tipo di classifier connesso (non può essere un'interfaccia) Nel Sorgente prende il tipo della classe sorgente, mentre nel Destinatario, prende il tipo della classe destinazione.

Torna al Sommario

Attributi


Per trovare le informazioni necessarie abbiamo utilizzato la variabile delle API Javadoc:

Nella colonna che riporta la mappatura Java abbiamo usato le seguenti variabili:

ClassDoc curClass; // ClassDoc descrive una classe nell'API Javadoc
FieldDoc curField; // FieldDoc descrive un campo nell'API Javadoc

Foundation.Core.Attribute contiene:
 
 
Nome Attributo Breve Descrizione Mappatura in Java - Breve motivazione
Foundation.Core.ModelElement.name Nome dell' attributo curField.name()
Foundation.Core.ModelElement.visibility Visibilità dell' attributo (public | private | protected) L'attributo visibility prende valore public nel caso in Java la visibilità della classe fosse PackagePrivate o Public, prende protected nel caso fosse Protected e p rivate nel caso fosse Private
Foundation.Core.Feature.ownerScope Specifica se la feature è globale per il classifier oppure ce n'è una copia per ogni istanza 
Si mette Classifier se è globale o Instance se ogni istanza ha il suo valore della feature
curField.isStatic() ? "classifier" : "instance"
Foundation.Core.StructuralFeature.multiplicity Il numero possibile di dati per un attributo che possono esserci in un'istanza (scalari: 1..1) "1" | "*" - Vedi Codice
Foundation.Core.StructuralFeature.changeable Se il valore può essere creato dopo la creazione dell'oggetto: assume i valori None se nessuna restrizione è indicata, Frozen se non può essere modificato, AddOnly se i valori possono essere aggiunti ma non cambiati (solo vettori) curField.isFinal() ? "none" : "frozen"
Foundation.Core.StructuralFeature.targetScope Descrive se il destinatario di ogni link è un istanza o un Classifier "instance" - In Java si hanno sempre istanze di un oggetto.
Foundation.Core.Attribute.initialValue Valore di inizializzazione dato all'atto della creazione vuoto (non è possibile prenderlo in Java)
Foundation.Core.Feature.owner Il classifier a cui appartiene l'attributo getClassId(curClass) - Vedi Codice
Foundation.Core.StructuralFeature.type E' il tipo di dato dell'attributo (class o datatype) getDatatypeId() - Vedi Codice

Torna al Sommario

Operazioni (Metodi e costruttori)

Nella colonna che riporta la mappatura Java abbiamo usato le seguenti variabili:

ClassDoc curClass; // ClassDoc descrive una classe nell'API Javadoc
MethodDoc curMet;  // MethodDoc descrive un metodo nell'API Javadoc

Foundation.Core.Operation contiene:
 
 
Nome Attributo Breve Descrizione Mappatura in Java - Breve Motivazione
Foundation.Core.ModelElement.name Nome dell'operazione curMet.name()
Foundation.Core.ModelElement.visibility Visibilità dell'operazione (public | private | protected) L'attributo visibility prende valore Public nel caso in Java la visibilità della classe fosse PackagePrivate o Public, prende Protected nel caso fosse Protected e Private nel caso fosse Private
Foundation.Core.Feature.ownerScope (ereditato) curMet.isStatic() ? "classifier" : "instance"
Foundation.Core.BehavioralFeature.isQuery Se l'operazione restituisce un valore (1) isFun(curMet) ? "true" : "false" - Vedi Codice
Foundation.Core.Operation.specification Una descrizone dell'effetto della funzione vuoto
Foundation.Core.Operation.isPolymorphic Se c'è un overloading (2) se c'è overloading "true", altrimenti "false"
Foundation.Core.Operation.concurrency Cosa succede con chiamate concorrenti al metodo. 
L'attributo ha valore Sequential se l'integrità del sistema non può essere garantita, ha valore Guarded se ha una logica a semafori (una viene eseguita, le altre sono bloccate), infine ha il valore Concurrent se si possono avere esecuzioni concorrenti.
curMet.isSynchronized() ? "guarded" : "sequential" - Unici metodi supportati in Java.
Foundation.Core.GeneralizableElement.isAbstract (extension) Se è abstract curMet.isAbstract()
Foundation.Core.Feature.owner La classe a cui appartiene il metodo getClassId(curClass) - vedi Codice
Foundation.Core.BehavioralFeature.parameter Contiene i parametri Vedi sezione parametri

(Nota 1) Questa interpretazione è di Alessandro Ronchi. La spiegazione in UML Semantics è piuttosto fumosa e sembra invece riferirsi ad effetti collaterali dell'operazione (ma l'interpretazione di Ronchi da un significato al nome del meta-attributo).
(Nota 2) Nel caso di operazioni polimorfiche, non verranno generati metodi, ma operazioni il cui nome si distingue per un progressivo. Questo perché il metodo ha come unico scopo quello di specificare il body (unico suo attributo), mentre per un doclet di Javadoc non è possibile risalire al corpo di un metodo.
Torna al Sommario

Parametri (passati e di ritorno)


Nella colonna che riporta la mappatura Java abbiamo usato le seguenti variabili:

ClassDoc curClass; // ClassDoc descrive una classe nell'API Javadoc
FieldDoc curField; // FieldDoc descrive un campo nell'API Javadoc
Parameter curParam; // Parameter descrive un parametro nell'API Javadoc

Foundation.Core.Parameter contiene:
 
 
Nome Attributo Breve Descrizione Mappatura in Java - Breve Motivazione
Foundation.Core.ModelElement.name Nome del parametro curParam.name()
Foundation.Core.ModelElement.visibility (ereditato) "Private"
Foundation.Core.Parameter.defaultValue Valore di default del parametro vuoto (non esiste in Java)
Foundation.Core.Parameter.kind Specifica che tipo è richiesto, cioè: 
in se è di sola lettura, out se è a sola scrittura, inout se in lettura/ scrittura e infine return se valore di ritorno della chiamata
In Java hanno senso solo due valori: "in" per i parametri nomali e "return" per il valore di ritorno.
Foundation.Core.Parameter.type E' il tipo di dato del parametro (class o datatype) getDatatypeId() - Vedi Codice

Torna al Sommario

Bibliografia


Libri
 
 
Titolo Autore Casa Editrice Data pubbl. Breve descrizione
UML Distilled Martin Fowler Addison-Wesley 97 Ottimo manuale UML

Documenti
 
 
Titolo Autore Origine Ultima rev. Breve descrizione
Mapping Object Models to Java Rational Software Corporation Documentazione di Rational Rose98 08/10/97 Note sulla mappatura di UML in Java utilizzata dagli sviluppatori della Rational

On-line
 
 
Titolo Autore Sito Breve descrizione
UML Semantics OMG http://www.omg.org Metamodello UML11k
UML Notation Guide OMG http://www.omg.org Manuale di UML 1.1
An Investigation of XML with Emphasis on 
Extensible Linking Language (XLL)
Justin Ludwig http://pages.wooster.edu/ludwigj/
xml/thesis.html
Introduzione a XML, XSL, XLL, DOM
XML Metadata Interchange (XMI) OMG http://www.omg.org Proposal di XMI
Introduction to XML Lars Marius Garshol http://www.stud.ifi.uio.no/~larsga/
download/xml/xml_eng.html
Breve introduzione a XML
How to Write 
Doc Comments for Javadoc
Doug Kramer http://java.sun.com/products/jdk/
javadoc/writingdoccomments.html
Indicazione per la creazione di Tag personalizzati e non.

Torna al Sommario


 

Pagina Realizzata dal Gruppo 9 / Corso di Ingegneria del Software / Dipartimento di informatica / Università di Bologna