ISw - Laborator 1.

Introducere in ingineria directa (generarea codului Java din diagrame UML) si inversa (obtinerea diagramelor UML din cod Java) utilizand instrumentul CASE (de inginerie software asistata de calculator) Rational Rose.

 

1.1. Descrierea lucrarii de laborator

 

In aceasta lucrare de laborator vor fi acoperite total sau partial urmatoarele probleme:

- Structurarea programelor Java

- Reprezentarea claselor si componentelor in UML, diagrame de clase si de componente

- Generarea codului Java din diagrame de clase UML (ingineria software directa) folosind instrumentul CASE Rational Rose

- Obtinerea diagramelor UML corespunzatoare codului Java (ingineria software inversa) folosind instrumentul CASE Rational Rose

 

_________________________________________________________________

 

 

1.2. Structurarea programelor Java si reprezentarea claselor in UML

 

 

Programele Java sunt organizate sub forma unor colectii de clase. In afara claselor nu pot fi facute decat declaratii de import (includere) a bibliotecilor de clase. Clasele sunt in general continute in fisiere separate. Numele fisierului care contine o clasa Java este chiar numele clasei pe care o contine, iar extensia este “java”. Astfel, o clasa “Salut1” va fi continuta intr-un fisier cu numele “Salut1.java”.

Programele Java sunt executate incepand cu metoda main() (principala) a uneia dintre claselor programului. Aceasta metoda se numeste punct de intrare in program, si prin intermediul parametrilor pe care ii asteapta (tablou de obiecte de tip String – sir de caractere) pot fi pasati parametri programului.

 

Un exemplu minimal de program Java este urmatorul, format dintr-o singura clasa, numita Salut1, a carei metoda principala, main(), afiseaza un salut catre utilizator.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

  /** Clasa care ilustreaza elementele esentiale ale unui program Java.

   *  Trebuie sa fie publica pentru ca are metoda principala.

   *  @author  Eduard C. Popovici

   */

  public class Salut1 {

    /** Metoda principala (punct de intrare in program).

     *  Este prima metoda executata de JVM (Java Virtual Machine).

     *  Primeste ca parametri argumentele din lina de comanda.

     *  Nu returneaza nici o valoare. Trebuie sa fie ‘public static’

     */

    public static void main(String[] args) {

      System.out.println(“Buna ziua!”); // Afisarea unui text pe ecran

    }

  }

 

 

Comentariile javadoc permit programatorilor Java generarea automata de documentatie HTML pornind de la comentariile declaratiilor de clase si de membri ai claselor (metode si atribute), comentariile din interiorul (corpul) metodelor fiind neglijate. De aceea, comentariile din interiorul metodelor pot fi facute in stil C sau C++.

 

Diagrama de clase UML asociata (Figura 1.b) va contine simbolul unei clase UML (Figura 1.a): o caseta cu trei compartimente dintre care cel de sus contine numele clasei (Salut1 in cazul nostru), cel din mijloc numele atributelor (niciunul in cazul nostru), iar cel de jos numele metodelor (main() in cazul nostru).

 

Fig. 1. Diagrama de clase UML

 

 

Etapele dezvoltarii programului Java dat:

 

Prima operatie este editarea programului intr-un editor de text, de exemplu, sub Windows, Notepad.exe. Fisierul, care va contine cele 5 linii de text alte programului, trebuie salvat cu numele Salut1.java.

 

Pentru obtinerea codului de octeti Java, trebuie compilat codul din acest fisier. Daca se presupune utilizarea compilatorului Java din linia de comanda (consola standard de intrare), atunci trebuie executata urmatoarea comanda, in directorul in care se afla fisierul Salut1.java:

 

directorcurent> javac Salut1.java

 

In urma acestei comenzi, compilatorul Java va crea genera codul de octeti corespunzator intr-un fisier cu numele Salut1.class, in directorul curent (acelasi director in care se afla si fisierul Salut1.java).

 

Pentru executia programului, acesta trebuie lansat in interpretor, folosind comanda:

 

directorcurent> java Salut1

 

Rezultatul va fi aparitia mesajului Buna ziua! pe ecranul monitorului, in fereastra linie de comanda (consola standard de iesrire), o linie sub comanda de executie, urmata de aparitia cursorului (in cazul nostrum: directorcurent> ) pe linia urmatoare.

 

In final, pe ecran poate fi urmatoarea secventa de informatii:

 

directorcurent> javac Salut1.java

directorcurent> java Salut1

Buna ziua!

directorcurent>

 

___________________________________________

 

1.3. Ingineria inversa pornind de la cod Java

 

Pentru a obtine diagrama UML de clase si diagrama UML de componente corespunzatoare codului Java anterior se vor realiza cateva etape.

 

 

1. Deschiderea instrumentului (tool-ului) software Rational Rose. Se va deschide o fereastra de dialog cu numele Create New Model, in care se propune utilizatorului crearea unui nou model (meniul New) si eventuala incarcare a unui model de framework sau biblioteca (cum ar fi jdk-12, jfc-11, VB6 Standard) care contine modelul UML al acelei biblioteci.

 

 

Pentru a se evita incarcarea vreunui model de framework, se va actiona butonul Cancel.

 

 

2. Salvarea modelului UML sub numele si in directorul dorit (de exemplu, in directorul isw_lab\lab1_isw, sub numele Salut1_java.mdl) folosind comenzile File -> Save As… sau File -> Save sau Ctrl+S.

 

 

3. Pentru a incepe procesul ingineriei inverse pornind de la cod Java, trebuie selectat in meniul Tools optiunea Java / J2EE si suboptiunea Reverse Engineer….

 

In acest fel se va deschide o noua fereastra, Java Reverse Engineer.

 

 

 

4. Se va specifica calea dorita, adica directorul in care se afla codul sursa Java (in cazul nostru C:\isw_lab\lab1_isw). Pentru aceasta se va actiona butonul Edit CLASSPATH…

 

In acest fel se va deschide o noua fereastra, Project Specification, in care se va actiona butonul cu semnificatia New (Insert), marcat mai jos ().

 

 

ceea ce va face activ butonul marcat mai jos (). Actionand acest buton

 

 

se va deschide o noua fereastra, Add to Classpath,

 

in care trebuie actionat butonul Directory… pentru a se deschide un dialog pentru selectia directoarelor (Select Directory), cu ajutorul caruia se poate selecta directorul dorit.

 

 

Dupa confirmarea (actionand butonul OK) in fereastra Select Directory, se confirma (actionand butonul OK) in fereastra Project Specification, si se selecteaza calea dorita in fereastra Java Reverse Engineer.

 

 

5. Se selecteaza fisierele sursa dorite (Salut1.java in cazul nostru) si se actioneaza butonul Add, astfel incat numele fisierului (calificat de calea catre acesta) este adaugat in lista fisierelor utilizabile pentru inginerie inversa (reverse engineering).

 

 

6. Se finalizeaza ingineria inversa selectand numele calificat al fisierului sursa si actionand butonul Reverse (urmat de actionarea butonului Done), obtinandu-se modelul UML (diagrama de clase si diagrama de componente) pentru clasa sursa.

 

Acum, in subfereastra Browser pot fi gasite specificatiile clasei Salut1 si a componentei Salut1.

 

 

Pentru aceasta, se vor deschide arborii Logical View si Component View (actionand pe semnele +). Se observa asocierea intre numele clasei Salut1 si numele componentei Salut1.

 

    

Selectand diferite elemente (numele clasei Salut1, numele metodei main()) se obtin in subfereastra Documentation (aflata sub subfereastra Browser) documentatiile acestor elemente, documentatii care in codul sursa Java aveau forma de comentarii Java in stil javadoc.

 

Pentru a popula diagrama de clase (Class Diagram: Logical View / Main) aflata in subfereastra diagramelor (in partea din dreapta sus), se “trag” (Drag and Drop) numele claselor (in cazul nostru Salut1) in acea fereastra.

 

 

Selectand fereastra principala (Main) a diagramei de componente, cu dublu click pe Main in Component View in Browser se obtine fereastra Component Diagram: Component View / Main. Pentru a popula diagrama de componente se “trag” (Drag and Drop) numele componentelor (in cazul nostru Salut1) in acea fereastra.

 

 

Aceasta a fost o ilustrare a ingineriei inverse pornind exclusiv de la cod Java.

_________________________________________________________________

 

In laborator se vor realiza urmatoarele activitati:

 

- citirea explicatiilor anterioare,

 

- efectuarea tuturor etapelor anterioare pentru o clasa Java cu specificatiile de mai sus.

 

 

1.4. Ingineria directa pornind de la diagrame UML si cod Java

 

Ingineria directa (generarea codului Java) poate fi realizata pornind de la cod Java si un model UML actualizat al acestuia.

 

 

Pentru a genera cod Java pornind de la modelul UML, selectam mai intai clasa al carei cod vrem sa fie generat. Apoi selectam in meniul Tools optiunea Java / J2EE si suboptiunea Generate Code.

 

Daca am incerca acest lucru in aceasta faza, in subfereastra Log (plasata in partea de jos a ferestrei Rational Rose, contine un istoric al comenzilor efectuate, si e importanta in special pentru avertizarile – warnings - pe care ofera si pentru erorile pe care le semnaleaza) ar putea aparea o averzitare de genul:

 

WARNING: Component Salut1 - 1 method(s) found in code which is(are) not in model -  moved to end of file

 

iar fisierul Salut1.java ar contine codul:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

//Source file: C:\\isw_lab\\lab1_isw\\Salut1.java

 

/**

 * Clasa care ilustreaza elementele esentiale ale unui program Java.

 * Trebuie sa fie publica pentru ca are metoda principala.

 * @author  Eduard C. Popovici

 */

public class Salut1

{

  

   /**

    * Metoda principala (punct de intrare in program).

    * Este prima metoda executata de JVM (Java Virtual Machine).

    * Primeste ca parametri argumentele din lina de comanda.

    * Nu returneaza nici o valoare. Trebuie sa fie ‘public static’

    *

    * @param args

    * @roseuid 412B4C3B0271

    */

   public static void main(java.lang.String[] args)

   {

   

   }

}

/*

void Salut1.main(String[]){

      System.out.println("Buna ziua!"); // Afisarea unui text pe ecran

    }

 */

 

Aceasta deoarece semnatura metodei main() in forma initiala (public static void main(String[] args)) nu se potriveste cu semnatura preferata de Rational Rose (public static void main(java.lang.String[] args)).

           

Pentru a restabili codul se muta linia 27 in locul liniei 22.

 

In fereastra Project Specification, obtinuta selectand in meniul Tools optiunea Java / J2EE si suboptiunea Project Specification…, se pot selecta:

- calea utilizand Classpath,

- stilul in care este scris codul Java, folosind varianta Style.

 

In sectiunea Indentation din meniul Style poate fi schimbat de exemplu numarul de caractere (Spaces) la 2, iar in sectiunea Opening Brace pot fi deselectate optiunile On new line for classes si On new line for methods.

 

Dupa aceste operatii, codul va arata astfel:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//Source file: C:\\isw_lab\\lab1_isw\\Salut1.java

 

/**

 * Clasa care ilustreaza elementele esentiale ale unui program Java.

 * Trebuie sa fie publica pentru ca are metoda principala.

 * @author  Eduard C. Popovici

 */

public class Salut1 {

 

  /**

   * Metoda principala (punct de intrare in program).

   * Este prima metoda executata de JVM (Java Virtual Machine).

   * Primeste ca parametri argumentele din lina de comanda.

   * Nu returneaza nici o valoare. Trebuie sa fie ‘public static’

   *

   * @param args

   * @roseuid 412B4C3B0271

   */

  public static void main(java.lang.String[] args) {

      System.out.println("Buna ziua!"); // Afisarea unui text pe ecran  

  }

}

 

Pentru a evita generarea identificatorului Rational Rose (@roseuid 412B4C3B0271), in fereastra Project Specification, in Code Generation se deselecteaza Generate Rose ID.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//Source file: C:\\isw_lab\\lab1_isw\\Salut1.java

 

/**

 * Clasa care ilustreaza elementele esentiale ale unui program Java.

 * Trebuie sa fie publica pentru ca are metoda principala.

 * @author  Eduard C. Popovici

 */

public class Salut1 {

 

  /**

   * Metoda principala (punct de intrare in program).

   * Este prima metoda executata de JVM (Java Virtual Machine).

   * Primeste ca parametri argumentele din lina de comanda.

   * Nu returneaza nici o valoare. Trebuie sa fie ‘public static’

   *

   * @param args

   */

  public static void main(java.lang.String[] args) {

      System.out.println("Buna ziua!"); // Afisarea unui text pe ecran  

  }

}

 

_________________________________________________________________

 

 

In laborator se vor realiza urmatoarele activitati:

 

- citirea explicatiilor anterioare,

 

- efectuarea tuturor etapelor anterioare pentru clasele Java si modelele UML cu specificatiile de mai sus,

 

 

1.5. Ingineria inversa pornind de la cod Java si diagrame UML

 

 

Ingineria inversa poate fi realizata si pornind de la un model UML deja existent si cod Java modificat, pentru a se actualiza modelul UML.

 

 

Sa presupunem ca dorim sa realizam o noua versiune a programului Salut1.java (numita Salut2.java) si apoi sa actualizam modelul Salut1_java.mdl (redenumindu-l Salut2_java.mdl).

 

Mai intai se salveaza modelul Salut1_java.mdl sub numele Salut2_java.mdl. Apoi se salveaza fisierul Salut1.java sub numele Salut2.java si se efectueaza modificarile dorite.

 

De exemplu, se poate introduce o noua clasa, cu numele AfisareConsola, plasata in fisierul AfisareConsola.java in acelasi director cu fisierele Salut1.java si Salut2.java.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

  import java.io.*;

 

  /** Contine o metoda care permite afisarea unui sir de caractere

   *  in consola standard de iesire

   */

  public class AfisareConsola {

 

    /** Afiseaza in consola standard sirul de caractere primit

     *  Metoda de clasa (este ‘static’)

     */

    public static void afisareText(String textAfisat) {

      System.out.println(textAfisat);

    }

  }

 

Clasa Salut2 va utiliza metoda oferita de clasa AfisareConsola pentru a afisa in consola sirul de caractere “Buna ziua!”

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//Source file: C:\\isw_lab\\lab1_isw\\Salut2.java

 

/**

 * Clasa care ilustreaza elementele esentiale ale unui program Java.

 * Trebuie sa fie publica pentru ca are metoda principala.

 * @author  Eduard C. Popovici

 */

public class Salut2 {

 

  /**

   * Metoda principala (punct de intrare in program).

   * Este prima metoda executata de JVM (Java Virtual Machine).

   * Primeste ca parametri argumentele din lina de comanda.

   * Nu returneaza nici o valoare. Trebuie sa fie ‘public static’

   *

   * @param args

   */

  public static void main(java.lang.String[] args) {

      AfisareConsola.afisareText("Buna ziua!"); // Afisarea unui text pe ecran

  }

}

 

 

In modelul UML trebuie redenumite clasa si componenta Salut1, ele luand numele Salut2.

 

Selectand in meniul Tools optiunea Java / J2EE si suboptiunea Reverse Engineer…, apoi fisierele Salut2.java si AfisareConsola.java, si efectuand ingineria inversa, modelul va fi actualizat.

 

 

 

_________________________________________________________________

 

In laborator se vor realiza urmatoarele activitati:

 

- citirea explicatiilor anterioare,

 

- efectuarea tuturor etapelor anterioare pentru clasele Java si modelele UML cu specificatiile de mai sus,

 

- reluarea etapelor anterioare pentru alte clase Java:

 

(1) se va adauga o clasa PreluareSir, plasata in fisierul PreluareSir.java in acelasi director cu fisierul Salut2.java.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

  import java.io.*;

 

  /** Contine o metoda care permite preluarea unui sir de caractere

   *  din consola standard de intrare

   */

  public class PreluareSir {

 

    /** Preia din consola standard un sir de caractere si il returneaza

     *  Metoda de clasa (este ‘static’)

     */

    public static String preluareText() throws IOException {

      BufferedReader inConsola  =

              new BufferedReader(new InputStreamReader(System.in));

      System.out.print("Introduceti un mesaj de salut: "); 

      return inConsola.readLine();

    }

  }

 

(2) clasa Salut2 va utiliza metoda oferita de clasa PreluareSir pentru a prelua din consola un sir de caractere in genul “Buna ziua!”

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//Source file: C:\\isw_lab\\lab1_isw\\Salut2.java

 

/**

 * Clasa care ilustreaza elementele esentiale ale unui program Java.

 * Trebuie sa fie publica pentru ca are metoda principala.

 * @author  Eduard C. Popovici

 */

public class Salut2 {

 

  /**

   * Metoda principala (punct de intrare in program).

   * Este prima metoda executata de JVM (Java Virtual Machine).

   * Primeste ca parametri argumentele din lina de comanda.

   * Nu returneaza nici o valoare. Trebuie sa fie ‘public static’

   *

   * @param args

   */

  public static void main(java.lang.String[] args) throws IOException {

      AfisareConsola.afisareText(PreluareSir.preluareText());

  }

}

 

 

1.6. Ingineria directa pornind de la diagrame UML

 

Ingineria directa (generarea codului Java) poate fi realizata si pornind de la zero, prin crearea modelului UML de la zero.

 

 

Sa presupunem ca dorim crearea unui model UML din care sa se genereze cod Java.

 

Se va deschide Rational Rose (evitand incarcarea bibliotecilor) si se va salva modelul curent (sub numele Salut3_java.mdl).

 

Se vor specifica, in fereastra Project Specification (obtinuta selectand in meniul Tools optiunea Java / J2EE si suboptiunea Project Specification…):

 

- calea dorita pentru generarea surselor Java (in Classpath, cu butonul cu semnificatia New (Insert), apoi butonul , apoi butonul Directory…, apoi selectand directorul dorit). In cazul in care Rational Rose cunoaste deja acea cale, in Classpath trebuie selectata acea cale (acesta este cazul nostru, calea fiind cea utilizata pentru ingineria inversa C:\isw_lab\lab1_isw).

 

- stilul codului generat (in Style, indentare 2 spatii, cu Opening Brace deselectate)

 

- continutul codului generat (in Code Generation, deselectat Generate Code ID).

 

 

_________________________________________________________________

 

 

1. Pentru a crea clasa cu numele Salut3 exista cel putin doua variante:

 

(A) Cu fereastra Class Diagram: Logical View / Main activata, se actioneaza butonul care simbolizeaza o clasa () si se efectueaza click in interiorul ferestrei, pentru a se crea o noua clasa (purtand initial numele New Class).

 

 

 

(B) Se selecteaza Logical View in subfereastra Browser si, cu ajutorul meniului pop-up (obtinut prin apasarea butonului din dreapta al mouse-ului), se selecteaza New si Class, se schimba denumirea clasei, si se “trage” numele ei din Browser in fereastra Class Diagram: Logical View / Main.

 

    

 

In final se obtine simbolul clasei Salut3 in diagrama de clase.

 

 

_________________________________________________________________

 

 

2. Pentru a adauga o metoda se foloseste meniul pop-up, fie in Browser (A), fie in diagrama de clase (B), in care se selecteaza New Operation.

(A)        (B)

 

fie se deschide specificatia (Standard Specification) clasei Salut3 (C),

 

(C1a)          (C1b)

 

se selecteaza Operations,

 

(C2)  (C3)

 

se insereaza o noua metoda, folosind comanda Insert din meniul pop-up,

 

(C4)   (C5)

 

care este apoi denumita main().

 

(C6)  

 

Specificatia acestei metode poate fi obtinuta prin dublu click pe numele ei, in specificatia clasei din care face parte,

 

 

sau cu ajutorul meniului pop-up, in fereastra Browser, folosind Open Standard Specification….

 

 

 

Se va stabili tipul returnat (Return Type) pentru metoda main() ca fiind void (scris cu “v” mic!), iar vizibilitatea Public.

 

Se va adauga eventual documentatia (Documentation) care va furniza comentariile javadoc.

 

 

Se va selecta apoi Detail, unde se adauga argumentele (cu Insert in meniul pop-up). Argumentul args, al carui tip este tablou de obiecte de tip String (adica String []).

 

Pentru stabilirea tipului (A) se poate deschide specificatia parametrului args cu dublu click pe numele lui, apoi se editeaza tipul returnat,

 

(A1)   (A2)

 

sau (B) se editeaza direct tipul returnat, in fereastra de specificare a operatiei (in varianta Detail).

 

(B1)  (B2)

 

Pentru a stabili caracterul static al metodei main(), este selectata varianta Java a specificatiei metodei, apoi actionat butonul Edit Set…,

 

 

se deschide o fereastra de optiuni (Options, selectate fiind optiunile pentru metoda - Operation), in care se schimba valoarea proprietatii Static din False (implicita) in True.

 

 

Operatiile UML au vizibilitate implicita publica (Public, ), inlocuibila cu cea protejata (Protected, ), privata (Private, ) sau echivalentul Java al package (Implementation, ).

 

_________________________________________________________________

 

Sa reluam crearea unei clase, pentru o clasa numita AfisareInConsola care are metoda afisareSirCaractere(), care primeste un parametru sir de tip String si nu returneaza (tip returnat void).

 

 

            Pentru a vizualiza semnaturile metodelor in diagrama de clase UML, trebuie validata optiunea Show Operation Signature (implicit invalidata!) din submeniul Options al meniului pop-up (deschis pe clasa careia dorim sa ii vizualizam semnatura).

 

 

 

Formatul semnaturii unei operatii UML (cu un singur argument) este (ca in Pascal):

 

      numeOperatieUML(numeArgumentUML : tipArgumentUML) : tipReturnatUML

 

pe cand formatul semnaturii unei metode Java (cu un singur argument) este (ca in C, C++):

 

      tipReturnatJava numeMetodaJava(tipArgumentJava numeArgumentJava)

 

_________________________________________________________________

 

 

 

 

 

3. Pentru a adauga un atribut (A) fie se foloseste meniul pop-up (in Browser sau in diagrama de clase), in care se selecteaza New Attribute, (B) fie se deschide specificatia (Standard Specification) clasei Salut3.

(A)   (B)

 

Se selecteaza apoi Attributes, se insereaza atributul sirTest, i se stabileste tipul String,

   

 

se deschide specificatia atributului, in varianta Detail, pentru a i se valida caracterul Static.

 

   

 

Atributele UML au vizibilitate implicita privata (Private, ), inlocuibila cu cea protejata (Protected, ), publica (Public, ) sau echivalentul Java al package (Implementation, ).

_________________________________________________________________

 

4. Pentru a se realiza o asociere unidirectionala intre doua clase (prin care una dintre cele doua clase va avea o referinta catre cealalta) se utilizeaza butonul  din bara de instrumente aflata intre subfereastra Browser si subfereastra diagramelor UML.

 

Cu acest buton actionat, se trage o sageata de la simbolul clasei Salut3 la simbolul clasei AfisareInConsola in diagrama de clase Class Diagram: Logical View / Main (apasand butonul stanga al mouse-ului in dreptul clasei Salut3 si eliberandu-l in dreptul clasei AfisareInConsola).

 

 

Cu dublu click pe sageata (sau cu meniul pop-up, selectand Open Standard Specification…) se deschide specificatia asocierii (implicit unidirectionale).

 

 

Se recomanda denumirea sugestiva a “rolului” (capatului) dinspre varful sagetii (Role A), in cazul nostru afisor.

 

 

Asocierile UML conduc la atribute implicit publice, dar vizibilitatea asocierilor poate fi modificata in fereastra de specificare a acesteia.

 

 

Se pot observa in Browser, in arborele Logical View, toate clasele, metodele, atributul si asocierea create.

 

 

_________________________________________________________________

 

 

5. Pentru a genera cod Java mai trebuie adaugate doua componente, cu acelasi nume cu numele claselor, in diagrama de componente.

 

Se selecteaza New si Component in meniul pop-up deschis pe Component View in Browser, si se denumeste cu numele clasei corespunzatoare, dupa care se “trage” numele din Browser in diagrama de componente Component Diagram: Component View / Main.

 

 

Sau se actioneaza butonul cu simbol de componenta () din bara de instrumente (cu diagrama de componente Component Diagram: Component View / Main selectata) si se efectueaza click in diagrama de componente, denumindu-se apoi componenta nou creata.

 

In final, se “trag” numele componentelor din Browser peste numele claselor corespunzatoare lor (sau invers). Se observa ca acum numele claselor sunt urmate de numele in paranteza ale componentelor.

    =>  

 

6. Pentru generarea codului Java, trebuie selectate clasele (individual sau impreuna), selectate Java / J2EE si apoi Generate Code in meniul pop-up (sau in meniul Tools).

 

 

 

Rational Rose poate cere asocierea claselor cu una dintre intrarile din Classpath, caz in care se selecteaza calea dorita pentru generarea codului, clasele pentru care se doreste generarea codului si se actioneaza butonul Assign.

 

 

De asemenea, este posibila aparitia unor avertizari in subfereastra Log (istoric) de genul:

 

WARNING: Class Logical View::Salut3 - operation main - the type of parameter args cannot be resolved - no import will be generated

 

Deoarece in semnatura metodei main() am specificat tipul argumentului args ca fiind String[] necalificat de pachetul de clase Java. Daca am fi utilizat java.lang.String[], generarea de cod ar fi fost fara probleme. Diagrama de clase ar fi aratat astfel:

 

 

sau astfel:

 

 

 

 

Codul rezultat poate fi vizualizat si editat in editorul intern al Rational Rose. Trebuie selectata clasa, selectate Java / J2EE si apoi Edit Code… in meniul pop-up (sau in meniul Tools).

 

 

 

Se observa aparitia in model si in cod a constructorilor impliciti ai claselor Salut3 si AfisareInConsola (metode cu acelasi nume cu clasele, Salut3() si AfisareInConsola(), si fara parametri).

 

Daca se doreste dezactivarea generarii automate a constructorilor impliciti pentru o clasa data, trebuie selectata varianta Java a specificatiei clasei, apoi actionat butonul Edit Set…, care deschide o fereastra de optiuni (Options), in care se schimba valoarea proprietatii GenerateDefaultConstructor din True (implicita) in False.

 

Daca se doreste dezactivarea generarii automate a constructorilor impliciti pentru toate clasele, trebuie selectat Options… in meniul Tools, si obtinuta varianta Java a ferestrei Options,

 

         

 

in care se schimba pentru tipul clasa (Class) valoarea proprietatii GenerateDefaultConstructor din True (implicita) in False.

 

 

 

Dupa astfel de modificari pentru ambele clase, diagrama de clase arata astfel:

 

 

Codul rezultat este urmatorul:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//Source file: C:\\isw_lab\\lab1_isw\\Salut3.java

 

/**

 * Testeaza afisarea unui sir de caractere pe ecran (consola standard de iesire)

 */

public class Salut3 {

  private static String sirTest;

  public AfisareInConsola afisor;

 

  /**

   * Metoda principala (punct de intrare in program).

   *

   * @param args

   */

  public static void main(java.lang.String[] args) {

  

  }

}

 

1

2

3

4

5

6

7

8

9

10

11

//Source file: C:\\isw_lab\\lab1_isw\\AfisareInConsola.java

 

public class AfisareInConsola {

 

  /**

   * @param sir

   */

  public static void afisareSirCaractere(String sir) {

  

  }

}

 

Ce a mai ramas de facut este de completat codul metodelor main() si afisareSirCaractere(). De exemplu:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//Source file: C:\\isw_lab\\lab1_isw\\Salut3.java

 

/**

 * Testeaza afisarea unui sir de caractere pe ecran (consola standard de iesire)

 */

public class Salut3 {

  private static String sirTest;

  public AfisareInConsola afisor;

 

  /**

   * Metoda principala (punct de intrare in program).

   *

   * @param args

   */

  public static void main(java.lang.String[] args) {

    sirTest = "Buna ziua!";

    Salut3 test = new Salut3();               // trebuie creat obiect al clasei

    test.afisor = new AfisareInConsola();     // Salut3 pentru a accesa atributul

    test.afisor.afisareSirCaractere(sirTest); // non-static afisor

  }

}

 

1

2

3

4

5

6

7

8

9

10

11

//Source file: C:\\isw_lab\\lab1_isw\\AfisareInConsola.java

 

public class AfisareInConsola {

 

  /**

   * @param sir

   */

  public static void afisareSirCaractere(String sir) {

    System.out.println(sir);

  }

}

 

Pentru compilarea si executia codului, poate fi plasat in acelasi director cu sursele Java un fisier intitulat Salut3_CompilareLansare.bat al carui continut sa fie:

 

javac Salut3.java

java  Salut3

pause

 

Cu dublu click pe numele fisierului Salut3_CompilareLansare.bat in Windows Explorer vor fi compilate sursele cu compilatorul javac si lansata executia codului de octeti Java cu interpretorul java de catre JVM (Java Virtual Machine).

 

 

Pentru executia codului fara compilare, poate fi plasat in acelasi director cu sursele Java un fisier intitulat Salut3_Lansare.bat al carui continut sa fie:

 

java  Salut3

pause

 

_________________________________________________________________

 

 

In laborator se vor realiza urmatoarele activitati:

 

- citirea explicatiilor anterioare,

 

- efectuarea tuturor etapelor anterioare pentru clasele Java si modelele UML cu specificatiile de mai sus.

 

_________________________________________________________________