Koncepcja, projekt i implementacja wielowarstwowego systemu informatycznego Inżynieria oprogramowania Zofia Kruczkiewicz

Podobne dokumenty
Laboratorium 2_3_4 Wzorce oprogramowania zastosowane w modelu obiektowym (wg Alan Shalloway, James R.Trott)

Tworzenie systemów informatycznych. Inżynieria oprogramowania Zofia Kruczkiewicz

Tworzenie systemów informatycznych. Inżynieria oprogramowania Zofia Kruczkiewicz

Tworzenie systemów informatycznych. Inżynieria oprogramowania Zofia Kruczkiewicz

Wybrane aspekty projektowania - budowa wielowarstwowego modelu implementacji, zastosowanie wzorców projektowych Wykład 7 część 2

Modelowanie i analiza. warstwy biznesowej aplikacji

Wykład 1 Inżynieria Oprogramowania

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Tworzenie warstwy prezentacji w wielowarstwowej aplikacji Przykład w środowisku Visual Web JSP

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

Programowanie komponentowe 5

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Literatura. J. Nilsson: Applying Domain-Driven Design and Patterns,With Examples in C# and.net, Addison-Wesley Professional, 2006

Projekt INP Instrukcja 1. Autor Dr inż. Zofia Kruczkiewicz

Tworzenie warstwy prezentacji drugi etap Przykład z laboratorium5_6. Autor Zofia Kruczkiewicz Wzorce oprogramowania laboratorium7_8

Zofia Kruczkiewicz - Modelowanie i analiza systemów informatycznych 2

Przykład 1 Iteracja 1 tworzenia oprogramowania

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Laboratorium 8 Diagramy aktywności

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Iteracyjno-rozwojowy cykl oprogramowania cykl 2. Java Zofia Kruczkiewicz 1

Zofia Kruczkiewicz - Modelowanie i analiza systemów informatycznych 1

Wprowadzenie, podstawowe pojęcia, projekt a produkt Wykład1

Iteracyjno-rozwojowy proces tworzenia oprogramowania Wykład 3 część 1

Warstwa prezentacji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Wprowadzenie, podstawowe pojęcia, projekt a produkt Wykład1

Podstawowe informacje o technologii Java EE 7

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Instrukcja 1 Laboratorium z Podstaw Inżynierii Oprogramowania. Relacja 1 do 1..0 instrukcja z lab1

problem w określonym kontekście siły istotę jego rozwiązania

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Instrukcja 4 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwa klienta: Interfejs graficzny użytkownika

1 Wprowadzenie do J2EE

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Diagram stanów Laboratorium 9

{ Dane1 d=(dane1)o; return nazwisko.equals(d.nazwisko) && srednia==d.srednia && uwagi.equals(d.uwagi); }

Instrukcja 3 Laboratoria 3, 4 Specyfikacja wymagań funkcjonalnych za pomocą diagramu przypadków użycia

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Instrukcja 3 Laboratoria 3, 4 Specyfikacja wymagań funkcjonalnych za pomocą diagramu przypadków użycia

Instrukcja 3 Laboratoria 3, 4 Specyfikacja wymagań funkcjonalnych za pomocą diagramu przypadków użycia

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Modele cyklu życia systemu cd Zasady programowania zwinnego Wykład 3

Podrozdziały te powinny zawierać informacje istotne z punktu widzenia przyjętego celu pracy

Języki i metody programowania Java. Wykład 2 (część 2)

Aplikacje RMI Lab4

Instrukcja 5 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwy integracji z bazą danych: Wzorzec DAO Technologia ORM

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Wzorce logiki dziedziny

Programowanie obiektowe

Diagramy czynności Na podstawie UML 2.0 Tutorial

Podstawy programowania III WYKŁAD 4

Zagadnienia projektowania aplikacji J2EE

Analiza i projektowanie aplikacji Java

Grupy pytań na egzamin magisterski na kierunku Informatyka (dla studentów niestacjonarnych studiów II stopnia)

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Programowanie Zespołowe

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Szkolenie wycofane z oferty. Program szkolenia: Enterprise Java Beans 3.0/3.1

Szablony klas, zastosowanie szablonów w programach

Aplikacje RMI

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Wprowadzenie do programowania aplikacji mobilnych

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Wstęp - Prosta aplikacja internetowa w technologii Java EE 5. Programowanie komponentowe 1

Diagramy stanów tworzenie modeli analizy i projektowania Na podstawie UML 2.0 Tutorial

Enterprise JavaBeans

Wykład 4_2 część druga. Iteracyjno-rozwojowy cykl oprogramowania 4

Szczególne problemy projektowania aplikacji internetowych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Dokumentacja do API Javy.

Programowanie obiektowe

UML w Visual Studio. Michał Ciećwierz

Java Enterprise Edition spotkanie nr 1. Sprawy organizacyjne, wprowadzenie

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Tworzenie komponentów logiki biznesowej i warstwy dostępu do danych w oparciu o EJB3.0/JPA lub EJB 3.1/JPA2

Grupy pytań na egzamin magisterski na kierunku Informatyka (dla studentów dziennych studiów II stopnia)

EJB 3.0 (Enterprise JavaBeans 3.0)

Wzorce projektowe i refaktoryzacja

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 2

Zastosowanie komponentów EJB typu Session

Zasady generowania kluczy głównych Język Java Persistence Podstawowa architektura wielowarstwowych aplikacji w oparciu o wzorce oprogramowania

Spring Framework - wprowadzenie i zagadnienia zaawansowane

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

PROJEKT Z BAZ DANYCH

Projekt INP Instrukcja 2. Autor Dr inż. Zofia Kruczkiewicz

Autor Zofia Kruczkiewicz Wzorce oprogramowania - laboratorium5_6

Java Persistence API - zagadnienia zaawansowane

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Transkrypt:

Koncepcja, projekt i implementacja wielowarstwowego systemu informatycznego Inżynieria oprogramowania Zofia Kruczkiewicz 1

Literatura 1. Roger S. Pressman, Praktyczne podejście do oprogramowania, WNT, 2004 2. Stephen H. Kan, Metryki i modele w inżynierii jakości oprogramowania, Mikom, 2006 3. Jacobson, Booch, Rumbaung, The Unified Software Development Process,Addison Wesley, 1999 4. Shalloway A.,Trott James R.,Projektowanie zorientowane obiektowo. Wzorce projektowe. Gliwice, Helion, 2005 5. Robert C. Martin, Micah Martin, Agile Programowanie zwinne. Zasady, wzorce i praktyki zwinnego wytwarzania oprogramowania w C#, Helion 2008 6. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe 7. https://docs.oracle.com/javaee/7/jeett.pdf 2

Zagadnienia 1. Wielowarstwowa architektura systemu informatycznego 2. Ocena i poprawa (refaktoryzacja) architektury wielowarstwowej systemu informatycznego 3. Wzorce projektowe stosowane przy budowie wielowarstwowej aplikacji internetowej 4. Przykład części warstwy biznesowej z obiektami typu POJO w projekcje typu Java Class Library Zastosowanie UML do modelowania tej warstwy 5. Zasady procesu zwinnego 6. Przykłady architektury wielowarstwowej aplikacji internetowej typu EE 7. Warstwa zasobów - baza danych w systemie baz danych Derby 8. Warstwa integracji w projekcje typu Java Class Library Zastosowanie wzorca projektowego typu Domain Store 9. Warstwa biznesowa: komponenty typu EJB + obiekty POJO 10. Warstwa prezentacji - JSF 11. Dodatek 3

1. Wielowarstwowa architektura systemu informatycznego 4

Definicja systemu informatycznego (wykład 1) Nieformalny system informacyjny: zasoby osobowe - ludzie Formalny system informacyjny: procedury zarządzania, bazy wiedzy Techniczny system informacyjny: Sprzęt Oprogramowanie Bazy danych, bazy wiedzy System informatyczny jest to zbiór powiązanych ze sobą elementów nieformalnych, formalnych i technicznych, którego funkcją jest przetwarzanie danych przy użyciu techniki Techniczny system informacyjny zorganizowany zespół środków technicznych (komputerów, oprogramowania, urządzeń teletransmisyjnych itp.) służący do gromadzenia, przetwarzania i przesyłania informacji 5

Java EE 7 ze strony https://docs.oracle.com/javaee/7/tutorial Pięciowarstwowy model logicznego rozdzielania zadań [6] Warstwa klienta Klienci aplikacji, aplety, aplikacje i inne elementy z graficznym interfejsem użytkownika Warstwa prezentacji Strony JSP, serwlety i inne elementy interfejsu użytkownika Warstwa biznesowa Komponenty EJB i inne obiekty biznesowe Interakcja z użytkownikiem, urządzenia i prezentacja interfejsu użytkownika Logowanie, zarządzanie sesją, tworzenie zawartości, formatowania i dostarczanie Logika biznesowa, transakcje, dane i usługi Warstwa integracji JMS, JDBC, konektory i połączenia z systemami zewnetrznymi Warstwa zasobów Bazy danych, systemy zewnętrzne i pozostałe zasoby Adaptery zasobów, systemy zewnętrzne, mechanizmy zasobów, przepływ sterowania Zasoby, dane i usługi zewnętrzne 6

Komponent element do budowy warstw skompilowany moduł programowy, funkcjonalność dostarczana za pomocą interfejsu, zdolny do współdziałania z innymi komponentami oraz innymi częściami systemu informatycznego. 7

Elementy tworzenia oprogramowania struktura (wykład 1) Ludzie Proces Wzorzec Uczestnicy Projekt Rezultat Produkt Automatyzacja Narzędzia 8

2. Ocena i poprawa (refaktoryzacja) architektury wielowarstwowej systemu informatycznego [6] 9

Ocena oprogramowania metryki Refaktoryzacja to poprawa struktury oprogramowania bez utraty funkcjonalności w celu poprawy jego metryk: wydajności funkcjonalności kosztu jakości oprogramowania: Testowalności Pielęgnowalności Wieloużywalności Zrozumiałości Stopnia osiągniętej abstrakcji 10

Refaktoryzacja architektury wielowarstwowej - część 1 1. Przeniesienie kodu dostępu do danych logicznie lub fizycznie bliżej rzeczywistego źródła danych warstwa integracji 2. Przeniesienie kodu logiki przetwarzania z klienta i warstwy prezentacji warstwy biznesowej zawierającej fasadowe komponenty sesyjne typu Control. Komponenty Business Delegate typu Control hermetyzują dostęp do warstwy biznesowej z warstwy prezentacji. Servlety lub JSP zawierają logikę biznesową i prezentacyjną Klient Servlety lub JSP Kod dostępu do danych Baza danych Warstwa klienta Warstwa prezentacji Warstwa zasobów Servlety lub JSP zawierają logikę prezentacyjną oraz fasadę rozdzielającą warstwy Komponent sesyjny zawiera logikę biznesową Logika dostępu do danych Klient Servlety, JSP Business Delegate 1 Komponent sesyjny typu fasada Kod dostępu do danych Baza danych Warstwa klienta Warstwa prezentacji Warstwa biznesowa Warstwa integracji Warstwa 11 zasobów

Refaktoryzacja architektury wielowarstwowej - część 2 3. Należy zdefiniować obiektowy model danych, który zbudowany jest z obiektów danych typu Entity 12

3. Wzorce projektowe stosowane przy budowie wielowarstwowej aplikacji internetowej 13

Wzorce projektowe Dobrze zbudowany system obiektowy jest pełen wzorców obiektowych Wzorzec to zwyczajowo przyjęte rozwiązanie typowego problemu w danym kontekście Strukturę wzorca przedstawia się w postaci diagramu klas Zachowanie się wzorca przedstawia się za pomocą diagramu sekwencji Wzorce projektowe: Wzorzec reprezentuje powiązanie problemu z rozwiązaniem (wg Booch G., Rumbaugh J., Jacobson I., UML przewodnik użytkownika) Wzorzec to pomysł, który okazał się użyteczny w jednym rzeczywistym kontekście i prawdopodobnie będzie użyteczny w innym. (Martin Fowler) 14

3.1. Wzorzec uniwersalny kreacyjny stosowany w każdej z warstw: Fabryka obiektów oddzielenie tworzenia obiektów od zarządzania nimi i używania ich Fabryka_bazowa Fabryka_1 Fabryka_2 Klient Fasada Klasa_1 Klasa_2 Klasa_3 Warstwa 1 Warstwa 2 15

3.2. Wzorzec uniwersalny strukturalny: Fasada hermetyzacja logiki biznesowej Klient 1 Klasa_A Klasa_1 Klient 1 fasada A Klasa_A Klasa_1 Klient 2 Klasa_B Klasa_2 Klient 2 Klasa_B Klasa_2 Klient 3 Klasa_C Klasa_3 Klient 3 fasada B Klasa_C Klasa_3 Warstwa 1 Warstwa 2 Warstwa 1 Warstwa 2 16

3.3. Wzorzec uniwersalny czynnościowy kreacyjny stosowany w każdej z warstw: : Strategia zastosowanie polimorfizmu do wyboru algorytmu Strategia Strategia_1 Strategia_2 Klient Fasada Kontekst Kontekst_1 Kontekst_3 Warstwa 1 Warstwa 2 17

3.4. Wzorzec EE warstwy prezentacji: FrontController scentralizowany punkt dostępowy dla obsługi żądań w warstwie prezentacji [6] Wywołanie metod z warstwy biznesowej np. za pośrednictwem wzorca ApplicationService (następny slajd) 18

3.5. Wzorce EE warstwy biznesowej: SessionFacade, ApplicationService udostępnianie i centralizacja logiki biznesowej kilku komponentów i usług biznesowych [6] Centralizacja logiki biznesowej realizowanej w różnorodny sposób Udostępnianie logiki biznesowej logika biznesowej wykonana w 19 projekcie

3.6. Wzorzec EE warstwy integracji: DomainStore (ORM) oddzielenie mechanizmów trwałości od modelu obiektowego [6] Warstwa biznesowa Odwzorowany model obiektowy z warstwy biznesowej

4. Przykład części warstwy biznesowej z obiektami typu POJO Zastosowanie UML do modelowania tej warstwy 21

Model procesu wytwarzania oprogramowania - czyli model cyklu życia oprogramowania wykład 1 Tworzenie technicznego systemu informacyjnego jest powiązane z: budową oprogramowania: co i jak wykonać? kiedy wykonać? wdrażaniem oprogramowania Modelowanie struktury i dynamiki systemu Implementacja systemu, struktury i dynamiki generowanie kodu Perspektywa koncepcji co należy wykonać? Perspektywa specyfikacji jak należy używać? Perspektywa implementacji jak należy wykonać? model problemu np. przedsiębiorstwa wymagania analiza (model konceptualny ) testy modelu projektowanie (model projektowy: architektura sprzętu i oprogramowania; dostęp użytkownika; przechowywanie danych) testy projektu programowanie (specyfikacja programu : deklaracje, definicje; dodatkowe struktury danych: struktury pojemnikowe, pliki, bazy danych) testy oprogramowania wdrażanie testy wdrażania 22

System informacyjny Katalogu tytułów i książek 1. Opis biznesowy świata rzeczywistego 2. Sformułowanie wymagań funkcjonalnych i niefunkcjonalnych aplikacji 3. Model analizy aplikacji oparty na diagramie przypadków użycia 4. Model projektowy i implementacja warstwy biznesowej warstwy biznesowej oparty na diagramie klas i diagramie sekwencji tworzony metodą iteracyjno-rozwojową, sterowany realizacją przypadków użycia 23

1. Opis biznesowy świata rzeczywistego w języku klienta - Katalog tytułów i książek (wg wykład 4) 1.1. Opis zasobów ludzkich Co robią pracownicy? 1.2. Przepisy i strategia firmy Co ogranicza działalność firmy? 1.3. Dane techniczne Dane ilościowe: ilu pracowników, ile danych, jak często, Dane o lokalizacji firmy Dane o klientach firmy Dane o używanym sprzęcie i oprogramowaniu 24

2. Lista wymagań Lista wymagań funkcjonalnych całej aplikacji 1. System zawiera katalog tytułów 2. System zawiera dwa typy egzemplarzy do wypożyczenia: książki i kasety z nagraniami dźwiękowymi książek. 3. Każdy egzemplarz zawiera tytuł, nazwisko autora, ISBN, wydawnictwo, jeśli jest to książka oraz dodatkowo nazwisko aktora, jeżeli jest to nagranie dźwiękowe. 4. Może wystąpić wiele egzemplarzy książek oraz kaset z tymi samymi tytułami. Każdy egzemplarz, zarówno książka i kaseta, posiadają numer niepowtarzający się w ramach pozostałych identycznych danych (ISBN lub ISBN i nazwisko aktora). 4. W celu znalezienia tytułu należy podać ISBN lub ISBN i nazwisko aktora, jeżeli należy odszukać tytuł nagranej książki. 5. W celu wybrania właściwego egzemplarza należy podać ISBN, jeśli jest to książka oraz dodatkowo nazwisko aktora, jeśli jest to kaseta oraz numer egzemplarza. 6. Zarówno egzemplarze typu książka lub kaseta, mogą być przeznaczane do wypożyczenia na okres umowny oraz na okres ściśle określony. Lista wymagań niefunkcjonalnych 1. Wstawianie danych o tytułach i egzemplarzach może odbywać się tylko przez uprawnione osoby 2. Wyszukiwanie informacji powinno odbywać się samodzielnie przez klienta 3. Operacje zarządzania i wyszukiwania informacji mogą być dokonane przez Internet przez aplikację uruchamianą przez przeglądarkę lub bez jej pośrednictwa 25

3. Diagram przypadków użycia całej aplikacji Katalog tytułów i książek 26

AKTOR OPIS PRZYPADKI UŻYCIA Bibliotekarz Bibliotekarz jest odpowiedzialny za utrzymywanie zasobów biblioteki (wstawianie i usuwanie: tytułów książek, egzemplarzy książek). Może on również przeszukiwać zasoby katalog tytułów i egzemplarzy książek Dodaj tytul Dodaj egzemplarz Wyszukiwanie tytulow Wyszukiwanie egzemplarzy Klient Klient może jedynie przeszukiwać zasoby katalog tytułów i egzemplarzy książek Wyszukiwanie tytulow Wyszukiwanie egzemplarzy 27

PU Szukanie tytulu OPIS CEL: Poszukiwanie tytulu WS (warunki wstępne): może być wywołany z PU Wyszukiwanie tytulow, PU Wyszukiwanie egzemplarzy, PU Dodaj tytul, PU Dodaj egzemplarz WK (warunki końcowe): podanie tytułu zawierającego identyczne dane, jakie posiada tytuł wzorcowy lub podanie informacji o braku tytułu PRZEBIEG: 1. Szukanie tytułu przebiega według atrybutów: ISBN (obowiązkowo) oraz aktor (jeśli jest to wymagane) zgodnie z danymi tytułu podanego do przypadku użycia 2. Jeśli istnieje tytuł o podanych atrybutach, zwracany jest tytuł z zasobów wypożyczalni, w przeciwnym wypadku zwracana jest informacja o braku tytułu. PU Wyszukiwanie tytulow OPIS CEL: Wyszukiwanie tytulow WS (warunki wstępne): inicjalizacja przez uruchomienie programu (np. otwarcie strony WWW, start aplikacji) WK (warunki końcowe): wyszukanie tytułu o podanym atrybutach obowiązkowych ISBN lub ISBN i aktor w przypadku nagrania dźwiękowego lub podanie informacji o braku tytułu PRZEBIEG: 1. Należy podać atrybuty tytułu: ISBN jako obowiązkowa dana oraz dodatkowo aktor, jeśli poszukiwany jest tytuł książki jako nagranie dźwiękowe. Tworzony jest tytuł wzorcowy do wyszukiwania rzeczywistego tytułu 2. Należy wywołać PU Szukanie tytułu. Należy sprawdzić, czy tytuł o podanych atrybutach już istnieje. Jeśli nie, należy zakończyć PU podając informację o braku tytułu, w przeciwnym wypadku należy podać 28 znaleziony tytuł.

PU Szukanie egzemplarza OPIS CEL: Poszukiwanie egzemplarza WS (warunki wstępne): może być wywołany z PU Wyszukiwanie egzemplarzy, PU Dodaj egzemplarz WK (warunki końcowe): podanie egzemplarza zawierającego identyczne dane, jakie posiada egzemplarz wzorcowy lub podanie informacji o braku egzemplarza PRZEBIEG: 1. Szukanie egzemplarza przebiega według atrybutu: numer egzemplarza (obowiązkowo) zgodnie z danymi tytułu podanego do przypadku użycia. Przeszukiwane są egzemplarze należące do konkretnego tytułu 2. Jeśli istnieje egzemplarz o podanym numerze, zwracany jest egzemplarz z zasobów wypożyczalni, w przeciwnym wypadku zwracana jest informacja o braku egzemplarza. PU Wyszukiwanie egzemplarzy OPIS CEL: Wyszukiwanie egzemplarzy książek o podanym tytule WS (warunki wstępne): inicjalizacja przez uruchomienie programu (np. otwarcie strony WWW, start aplikacji) WK (warunki końcowe): wyszukanie egzemplarza o tytule zgodnym z podanymi atrybutami obowiązkowymi ISBN lub ISBN i aktor w przypadku nagrania dźwiękowego oraz podanym numerze lub podanie informacji o braku egzemplarza PRZEBIEG: 1. Należy podać atrybuty tytułu: ISBN jako obowiązkowa dana oraz dodatkowo aktor, jeśli poszukiwany jest tytuł książki jako nagranie dźwiękowe. Tworzony jest tytuł wzorcowy do wyszukiwania rzeczywistego tytułu 2. Należy wywołać PU Szukanie tytułu. Należy sprawdzić, czy tytuł o podanych atrybutach już istnieje. Jeśli nie, należy zakończyć PU podając informację o braku tytułu. 3. Należy utworzyć wzorcowy egzemplarz zawierający numer podany do wyszukiwania egzemplarza 29 i przekazać go do PU Szukanie egzemplarza. Wynik podany przez wywołany PU jest wynikiem końcowy.

PU Dodaj tytul OPIS CEL: Wstawienie nowego tytułu WS (warunki wstępne): inicjalizacja przez uruchomienie programu (np. otwarcie strony WWW, start aplikacji) WK (warunki końcowe): dodanie tytułu o podanych atrybutach obowiązkowych: tytul, autor, ISBN, wydawnictwo oraz nazwisko aktora gdy to nagranie dźwiękowe, lub informacja o istnieniu takiego tytułu PRZEBIEG: 1. Należy podać atrybuty tytułu: tytul, autor, ISBN, wydawnictwo oraz jeśli jest to nagranie dźwiękowe, to nazwisko aktora. Należy utworzyć tytuł do wyszukiwania i ewentualnego wstawienia. 2. Należy wywołać PU Szukanie tytulu. Należy sprawdzić, czy tytuł o podanych atrybutach juz istnieje. Jeśli tak, należy zakończyć PU, w przeciwnym wypadku należy wstawić nowy tytuł. PU Dodaj egzemplarz OPIS CEL: Wstawianie nowego egzemplarza WS (warunki wstępne): inicjalizacja przez uruchomienie programu (np. otwarcie strony WWW, start aplikacji) WK (warunki końcowe): wstawienie egzemplarza o tytule zgodnym z podanymi atrybutami obowiązkowymi ISBN lub ISBN i aktor w przypadku nagrania dźwiękowego oraz podanym numerze i ewentualnie atrybucie do określania terminu zwrotu, jeśli należy wstawić egzemplarz z wyznaczonym terminem zwrotu lub podanie informacji o istnieniu takiego egzemplarza PRZEBIEG: 1. Należy podać atrybuty tytułu: ISBN jako obowiązkowa dana oraz dodatkowo aktor, jeśli poszukiwany jest tytuł książki jako nagranie dźwiękowe. Tworzony jest tytuł wzorcowy do wyszukiwania rzeczywistego tytułu 2. Należy wywołać PU Szukanie tytułu. Należy sprawdzić, czy tytuł o podanych atrybutach już istnieje. Jeśli nie, należy zakończyć PU podając informację o braku tytułu. 3. Należy utworzyć egzemplarz zawierający numer podany do wyszukiwania egzemplarza oraz atrybut terminu zwrotu, jeśli jest to wymagane i należy przekazać go do PU Szukanie egzemplarza. Jeśli nie istnieje egzemplarz o danym numerze, należy wstawić ten egzemplarz, w przeciwnym wypadku należy podać 30 informację o istnieniu takiego egzemplarza.

Produkt Modele (wykład 1) Modele: Abstrakcja systemu Przedstawianie różnych perspektyw systemu Związki między modelami Model use-case Model analizy Model projektu Model wdrożenia Model implementacji Model testów 31

3.1. Analiza wspólności identyfikacja klas bazowych (wg wykład 4) Przypadki użycia Atrybuty Wykryte klasy bazowe PU Szukanie tytulu PU Wyszukiwanie tytulow PU Dodaj tytul PU Szukanie egzemplarza PU Wyszukiwanie egzemplarzy PU Dodaj egzemplarz tytul autor wydawnictwo ISBN numer klasa typu Entity : TTytul_ksiazki klasy typu Entity : TTytul_ksiazki (zawiera atrybuty tytułu, posiada książki wstawia i wyszukuje je), TEgzemplarz (książka) 32

3.2. Analiza zmienności - identyfikacja podklas (wg wykład 4) Przypadki użycia Atrybuty Wykryte podklasy PU Szukanie tytulu PU Wyszukiwanie tytulow PU Dodaj tytul PU Szukanie egzemplarza PU Wyszukiwanie egzemplarzy PU Dodaj egzemplarz aktor termin klasa TTytul_ksiazki_na_kasecie typu Entity, która dziedziczy od klasy TTytul_ksiazki Wyróżniono egzemplarze zwykłe typu TEgzemplarz, oraz egzemplarze TEgzemplarz_termin z dodatkowo oznaczonym terminem oddania - rozróżniane w ramach danego tytułu książki zwyklej (TTytul_ksiazki ) lub nagranej w postaci dźwiękowej (TTytul_ksiazki_na_kasecie) za pomocą numeru 33

3.3. Analiza wspólności i zmienności - identyfikacja typów relacji (wg wykład 4) Zależność między obiektami typu TTytul_ksiazki oraz TEgzemplarz są w relacji 1 do 0..*. Związek ten dziedziczą obiekty typu TTytul_ksiazki_na_kasecie. Implementacja związku: kolekcja obiektów typu TEgzemplarz w klasie typu TTytul_ksiazki Związek 0..* do 1 między obiektami typu TEgzemplarz oraz TTytul_ksiazki są dziedziczone przez obiekty typu TEgzemplarz_termin. Stąd zwykłe książki mogą być oznaczone jedynie numerami lub numerami i terminem zwrotu. Dotyczy to również książek w postaci nagrań dźwiękowych. Implementacja związku: referencja typu TTytul_ksiazki w klasie typu TEgzemplarz 34

3.3 (cd). Analiza wspólności i zmienności - identyfikacja typów relacji Oszacowania dla przyjętego modelu powiązań: Liczba obiektów z rodziny TTytul_ksiazki: 5000, Przybliżony największy rozmiar obiektu z rodziny TTytul_ksiazki: R1 Przybliżony największy rozmiar obiektu z rodziny TEgzemplarz: R2 Średnia liczba książek na 1 obiekt z rodziny typu TTytul_ksiazki: 50 Liczba wszystkich książek: 250000 Oszacowania dla częściowo równoważnego modelu dziedziczenia: TTytul_ksiazki TTytul_ksiazki _na_kasecie TEgzemplarz TEgzemplarz_termin Liczba obiektów z rodziny TTytul_ksiazki: 5000, Przybliżony największy rozmiar obiektu z rodziny TTytul_ksiazki: R1 Przybliżony największy rozmiar obiektu z rodziny TEgzemplarz: R1+R2 Średnia liczba książek na 1 obiekt z rodziny typu TTytul_ksiazki: 50 Liczba wszystkich książek: 250000 Przyjęty model powiązań Model oparty na dziedziczeniu Rozmiar pamięci 5000*R1 + 5000*50*R2 5000*R1 + 5000*50*(R1 + R2) Liczba przeszukań obiektów z rodziny TEgzemplarz od 1 do (5000 + 50) Od 1 do 5000*50 35

3.4. Analiza wspólności i zmienności - identyfikacja wzorców projektowych (wg wykład 4) Wykryto związki silnej agregacji między tytułem i egzemplarzem egzemplarz nie może istnieć bez tytułu. Wybrano wzorzec strategii do implementacji obiektów typu TEgzemplarz Zastosowano klasę TAplikacja typu Control jako wzorzec fasady do oddzielenia obiektów typu Entity od pozostałej części systemu oraz klasę typu Control jako wzorzec fabryki obiektów (TFabryka) do tworzenia różnych typów tytułów oraz egzemplarzy. 36

4 Model projektowy oraz implementacja warstwy biznesowej oparty na diagramie klas i diagramie sekwencji tworzony metodą iteracyjno-rozwojową sterowany realizacją przypadków użycia (szczegóły w Dodatku do wykładu). Efekt końcowy: slajdy 39-44 37

Implementacja powiązań Metody przypadków użycia Decyzja projektowa Wzorzec fasady Wzorzec strategii Wzorzec fabryki obiektów 38

Dodaj tytul void TAplikacja::dodaj_tytul(String dane[]) 39

Dodaj egzemplarz TTytul_ksiazki TAplikacja::dodaj_ksiazke(String dane1[], String dane2[]) 40

Wyszukiwanie tytulow TTytul_ksiazki TAplikacja::Wyszukaj_tytul (String[] dane) 41

(11) Wyszukiwanie egzemplarzy TEgzemplarz TAplikacja::Wyszukaj_egzemplarz (String[] dane1, String[] dane2) 42

package wypozyczalnia1; import java.util.arraylist; public class TAplikacja { private ArrayList<TTytul_ksiazki> mtytul_ksiazki = new ArrayList<TTytul_ksiazki>(); public TAplikacja () {/* */ } public static void main (String[] t) {/* */ } public ArrayList<TTytul_ksiazki> gettytul_ksiazki () {/* */ } public void settytul_ksiazki (ArrayList<TTytul_ksiazki> val) {/* */ } } public TTytul_ksiazki Szukaj_tytul (TTytul_ksiazki tytul_) {/* */ } public void dodaj_tytul (String[] dane) {/* */ } public TTytul_ksiazki dodaj_ksiazke (String[] dane1, String[] dane2) {/* */ } public TTytul_ksiazki Wyszukaj_tytul (String[] dane) {/* */ } public TEgzemplarz Wyszukaj_egzemplarz (String[] dane1, String[] dane2) {/* */ } package wypozyczalnia1; public class TEgzemplarz { private int numer; private TTytul_ksiazki mtytul_ksiazki; } public TEgzemplarz () {/* */ } public int getnumer () {/* */ } public void setnumer (int numer_) {/* */ } public TTytul_ksiazki gettytul_ksiazki () {/* */ } public void settytul_ksiazki (TTytul_ksiazki val) {/* */ } public boolean equals (Object ob) {/* */ } public String tostring () {/* */ } 43

package wypozyczalnia1; import java.util.date; public class TEgzemplarz_termin extends TEgzemplarz { private Date termin; } public Date gettermin () {/* */ } public void settermin (Date termin) {/* */ } public boolean termin_minal (Date termin_) {/* */ } public String tostring () {/* */ } package wypozyczalnia1; public class TFabryka { } public TTytul_ksiazki Podaj_tytul (String[] dane) {/* */ } public TEgzemplarz Podaj_egzemplarz (String[] dane) {/* */ } 44

package wypozyczalnia1; import java.util.arraylist; public class TTytul_ksiazki { private String wydawnictwo; private String ISBN; private String tytul; private String autor; private ArrayList<TEgzemplarz> mksiazka = new java.util.arraylist<tegzemplarz>(); public TTytul_ksiazki () {/* */ } public String getwydawnictwo () {/* */ } public void setwydawnictwo (String e) {/* */ } public String gettytul () {/* */ } public void settytul (String a) {/* */ } public String getisbn () {/* */ } public void setisbn (String ISBN_) {/* */ } public String getautor () {/* */ } public void setautor (String autor_) {/* */ } public String getaktor () {/* */ } public void setaktor (String autor_) {/* */ } public ArrayList<TEgzemplarz> getksiazka () {/* */ } public void setksiazka (ArrayList<TEgzemplarz> mksiazka_) {/* */ } public String tostring () {/* */ } public boolean equals (Object ob) {/* */ } public void dodaj_ksiazke (String[] dane) {/* */ } public TEgzemplarz Szukaj_egzemplarz (TEgzemplarz egzemplarz_) {/* */ } } package wypozyczalnia1; public class TTytul_ksiazki_na_kasecie extends TTytul_ksiazki { private String aktor; public String getaktor () {/* */ } public void setaktor (String aktor) {/* */ } public String tostring () {/* */ } } 45

Proponowany kod funkcji main w klasie fasadowej TAplikacja public static void main(string t[]) // your code here {TAplikacja ap = new TAplikacja(); String t1[] = {"1", "1", "1", "1", "1"}; //t1, t2, t3 tablice łańcuchów do tworzenia tytułu książki zwyklej pierwszy łańcuch String t2[] = {"1", "2", "2", "2", "2"}; // jest informacją dla fabryki, jaki obiekt wygenerować String t3[] = {"1", "3", "3", "3", "3"}; // 1 oznacza utworzenie obiektu klasy TTytul_ksiazki, a pozostałe łańcuchy to kolejno // autor, tytul, ISBN, wydawnictwo dla uproszczenia w postaci cyfr - obiekty do wstawiania String t4[] = {"3", "1", "1", "1", "1", "1"}; // t4, t5,t6 tablice łańcuchów do tworzenia tytułu książki jako nagranie dźwiękowe String t5[] = {"3", "2", "2", "2", "2", "2"}; // pierwszy łańcuch jest informacją dla fabryki, jaki obiekt wygenerować String t6[] = {"3", "4", "4", "4", "4", "4"}; // 3 oznacza utworzenie obiektu klasy TTytul_ksiazki_na_kasecie, a pozostałe //łańcuchy to kolejno autor, tytul, ISBN, wydawnictwo, aktor dla uproszczenia w postaci cyfr- obiekty do wstawiania ap.dodaj_tytul(t1); ap.dodaj_tytul(t2); ap.dodaj_tytul(t2); //naruszenie integralności danych tytułów ap.dodaj_tytul(t3); ap.dodaj_tytul(t4); ap.dodaj_tytul(t5); ap.dodaj_tytul(t5); //naruszenie integralności danych tytułów ap.dodaj_tytul(t6); String lan = ap.gettytul_ksiazki().tostring(); System.out.println(lan); String d1[] = {"0", "1"}; // d1, d2, d3 - tablice łańcuchów do tworzenia wzorcowego tytułu książki zwyklej do wyszukiwania String d2[] = {"0", "2"}; // pierwszy łańcuch jest informacją dla fabryki, jaki obiekt wygenerować: 0 oznacza generowanie String d3[] = {"0", "5"}; // obiektu klasy TTytul_ksiazki, drugi łańcuch jest ISBN obiekty do wyszukiwania String d4[] = {"2", "1", "1"}; //d4, d5 - tablice łańcuchów do tworzenia wzorcowego tytułu książki jako nagranie dźwiękowe String d5[] = {"2", "4", "4"}; //pierwszy łańcuch 2 oznacza generowanie obiektu typu TTytul_ksiazki_na_kasecie // drugi łańcuch to ISBN, trzeci jest nazwiskiem aktora-obiekty do wyszukiwania String tr1[] = {"0", "1"}; //tablice tr1 i tr2 zawierają informację o tworzeniu obiektu typu TEgzemplarz: pierwszy łańcuch String tr2[] = {"0", "2"}; //równy 0 oznacza tworzenie obiektu typu typu TEgzemplarz, drugi jest numerem egzemplarza String tr3[] = {"1", "3", "April 10, 2008, 00:00:00 GMT"}; //pierwszy łańcuch równy 1 oznacza tworzenie obiektu klasy 46 String tr4[] = {"1", "2", "April 10, 2008, 00:00:00 GMT"}; //TEgzemplarz_termin, drugi oznacza numer, trzeci termin

// W trakcie tworzenia kodu aplikacji można odsłaniać kod z // komentarza w celu przetestowania kolejnych przypadków użycia TTytul_ksiazki pom = ap.dodaj_ksiazke(d1, tr1); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d2, tr1); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d2, tr1); //naruszenie integralności danych książek if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d2, tr2); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d3, tr2); //naruszenie integralności danych książek if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d4, tr3); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d4, tr3); //naruszenie integralności danych książek if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d4, tr4); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d5, tr2); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } } System.out.println("Wyszukiwanie"); System.out.println(ap.Wyszukaj_tytul(t5).toString()); System.out.println(ap.Wyszukaj_egzemplarz(d4, tr4).tostring()); 47

Działanie próbne kodu warstwa biznesowej jako element składowy realizacji wzorca Application Service po wykonaniu modelu i impelentacji poszczególnych przypadków użycia 48

5. Zasady procesu zwinnego [5] 49

1. Zasada pojedynczej odpowiedzialności (Single-Responsibility Principle SRP) Żadna klasa nie może być modyfikowana z więcej niż jednego powodu. 1) Klasa obsługująca reguły biznesowe nie powinna zarządzać trwałością 2) Klasa tworząca obiekty nie powinna ich używać 3) Oddzielanie wzajemnie powiązanych odpowiedzialności- np. obiektowa idea katalogu książek: Zmiana sposobu przechowywania treści książki: papierowej lub w formie nagrania - tylko modyfikacja kodu klas z rodziny TTytul_ksiazki, TTytul_ksiazki_na_kasecie Zmiana czasu przeznaczonego na wypożyczenie egzemplarza książki standardowy czas lub ściśle związany z egzemplarzem książki TEgzemplarz, TEgzemplarz_termin 50

2. Zasada otwarte-zamknięte (Open/Closed Principle OCP) Składniki oprogramowania (klasy, moduły, funkcje itp.) powinny być otwarte na rozbudowę, ale zamknięte dla modyfikacji. 1) Stosowanie dziedziczenia, polimorfizmu, implementacji interfejsów tylko w takich przypadkach, gdy istnieje możliwość zmian. 2) Należy wyeliminować rozpoznawanie klas zarządzanych lub używanych np. instrukcją switch przez klasy, które używają lub zarządzają tymi klasami 3) Przykłady: obiektowa idea katalogu książek: Zmiana strategii przechowywania treści książki (z papierowej do formy nagrania) - tylko modyfikacja kodu klas przez polimorfizm i dziedziczenie: tylko klasa TTytul_ksiazki_na_kasecie Zmiana czasu przeznaczonego na wypożyczenie egzemplarza książki z czasu standardowego do czasu lub ściśle związanym z egzemplarzem książki: tylko klasa TEgzemplarz_termin 51

3. Zasada podstawiania Liskov Musi istnieć możliwość zastępowania typów bazowych ich podtypami. Jest to warunek zasady otwarte-zamknięte (OCP). 1) Klasa potomna nie może mieć mniejszej funkcjonalności niż jej klasa bazowa. Podstawianie klasy potomnej powinno następować automatycznie, bez potrzeby rozpoznawania typu obiektu np. instrukcją switch 2) Przykład: obiektowa idea katalogu książek: automatyczne dostosowanie się do formy przechowywania zawartości książki (klasy: TTytul_ksiazki, TTytul_ksiazki_na_kasecie) automatyczne dostosowanie się do czasu wypożyczania książki, niezależnie od jej formy przechowywania zawartości (klasy: TEgzemplarz, TEgzemplarz_termin) 52

4. Zasada odwracania zależności (Dependancy Inversion Principle DIP) A. Moduły wysokopoziomowe nie powinny zależeć od modułów niskopoziomowych. Obie grupy modułów powinny zależeć od abstrakcji B. Abstrakcje nie powinny zależeć od szczegółowych rozwiązań. To szczegółowe rozwiązania powinny zależeć od abstrakcji. 1. Strategia programu nie powinna zależeć od szczegółowych rozwiązań w zakresie implementacji. 2. Interfejsy są związane ze swoimi właścicielami, a nie implementującymi je klasami 3. Warstwa strategii może być wielokrotnie używana w dowolnym kontekście pod warunkiem, że moduły niższego poziomu implementują interfejs usług strategii 53

4 A - Podział oprogramowania na poziomy abstrakcji Warstwy niższe zależą od wyższych Eliminacja zależności przechodniej: warstwa strategii warstwa narzędzi Eliminacja zależności bezpośredniej: warstwa strategii warstwa mechanizmu 54

4 B- Zasady procesu zwinnego - przykład Fabryka abstrakcyjna Abstract Factory Warstwa strategii Warstwa mechanizmu 55

5. Zasada segregacji interfejsów (Interface Segregation Principle ISP) Klasa implementująca nie powinna być zmuszana do zależności od metod, których nie używa. 1) Separacja przez implementowanie wielu interfejsów 2) Dziedziczenie wielobazowe 56

Przykład ISP -Trzy różne interfejsy xxxui -Możliwa jedna implementacja UI -Możliwa definicja: -void g(depositui depositui, TransferUI transferui) -Możliwe wywołania: g(ui, ui); g(ui1, ui2); gdzie ui, ui1, ui2 są obiektami klasy implementującej interfejs UI. 57

Podsumowanie zasad procesu zwinnego Kluczowy mechanizm niskiego poziomu Podwyższa odporność kodu na zmiany Prowadzi do tworzenia kodu wielokrotnego użycia 58

6. Przykłady architektury wielowarstwowej aplikacji internetowej typu EE 59

(1)Architektura aplikacji pięciowarstwowej Java EE 7.0 JavaServer Faces Baza danych katalog Warstwa integrująca (EntityManager, ) Technologia TopLink Wzorce: Domain Store Technologia Transfer Object EclipseLink fasady (XXXController) fabryki obiektów Warstwa zasobów Warstwa integracji Komponent ApplicationBean1 EJB Wzorzec fasady usług Obiektowy model danych Wzorce: fasady TAplikacja fabryki obiektów strategii Warstwa biznesowa Warstwa biznesowa SessionBean1 Komponent Wzorzec typu ManagedBean fasady sesji SessionBean1 Komponent Wzorzec typu ManagedBean fasady sesji SessionBean1 Komponent Wzorzec typu ManagedBean fasady sesji Warstwa prezentacji Strony JSF Strony JSF Strony JSF Warstwa prezentacji Przeglądarka Klient1 - Przeglądarka Klient2 - Przeglądarka Klient3 - klient klient klient Warstwa klienta

(2)Architektura aplikacji pięciowarstwowej Java EE 7.0 JavaServer F Baza danych Warstwa zasobów katalog Warstwa integrująca (EntityManager, ) Technologia EclipseLink TopLink Wzorce: Domain Store Transfer Object fasady (XXXController) fabryki obiektów Warstwa integrująca (EntityManager, ) Technologia EclipseLink TopLink Wzorce: Domain Store Transfer Object fasady (XXXController) fabryki obiektów Warstwa integrująca (EntityManager, ) Technologia EclipseLink TopLink Wzorce: Domain Store Transfer Object fasady (XXXController) fabryki obiektów Warstwa integracji Obiektowy model danych Wzorce: fasady TAplikacja fabryki obiektów strategii Komponent EJB Obiektowy model danych Wzorce: fasady TAplikacja fabryki obiektów strategii Obiektowy model danych Wzorce: fasady TAplikacja fabryki obiektów strategii (1) (2) (3) Komponent EJB Komponent EJB Warstwa biznesowa ApplicationBean1 Wzorzec fasady usług SessionBean1 Komponent (1) Wzorzec typu ManagedBean fasady sesji SessionBean1 Komponent (2) Wzorzec typu ManagedBean fasady sesji SessionBean1 Komponent Wzorzec (3) typu ManagedBean fasady sesji (1) Strony JSF (2) Strony JSF (3) Strony JSF Warstwa prezentacji Przeglądarka Klient1 - Przeglądarka Klient2 - Przeglądarka Klient3 - (1) klient (2) klient (3) klient Warstwa klienta

Przykład tworzenia aplikacji wielowarstwowej opartej na (1) architekturze. 62

7. Warstwa zasobów (EIS)- baza danych w systemie baz danych Derby 63

Zakładanie pustej bazy danych dla systemu baz danych Derby (1) 64

Zakładanie pustej bazy danych katalog w systemie baz danych Derby (2) 65

Utworzona pusta baza danych 66

7. Warstwa integracji w projekcje Java Class Library. Zastosowanie wzorca projektowego typu Domain Store. 67

Diagram klas uproszczony schemat warstwy integracji Część klas należących do Persistence Library Do wykonania fasady warstwy integracji 68

Dodanie adnotacji do klas typu dane ( Entity ) wspierających mapowanie obiektowo-relacyjne 69

Zmiana typu klas danych na typ @Entity (10) dodano adnotacje, nowe atrybuty (Id, Ksiazka) z metodami. Należy zestandaryzować nazwy metod dostępu do składowych mksiazka oraz Ksiazka! 70

71

72

73

Wstawienie do modułu typu Persistence Unit wybrane klasy typu Entity 74

Wygenerowane tabele bazy danych po uruchomieniu wielowarstowej aplikacji internetowej KATALOG.TEGZEMPLARZ 75

KATALOG. 76

8. Warstwa biznesowa: komponenty typu EJB + obiekty POJO Realizacja: PU Dodaj tytul PU Dodaj egzemplarz + połączenie z warstwą integracji 77

Interfejs komponentu EJB 78

Komponent EJB 79

Projekt warstwy biznesowej z definicją komponentu EJB Definicja komponentu EJB Definicja interfejsu warstwy biznesowej Projekt z kodem warstwy biznesowej utworzonej w procesie iteracyjnorozwojowym (rozdział 4 + Dodatek) i uzupełniony o warstwę integracji opartą na technologii ORM (rozdział 7) 80

8. Warstwa prezentacji JSF Przykład implementacji PU Dodaj tytul 81

Komponent typu ManagedBean //komponent EJB połączenie //warstw: biznesowej oraz integracji //z warstwą prezentacji //dane wyprowadzone na stronę JSF //dane wprowadzone na stronie JSF //do komponentu EJB //z komponentu EJB 82

Strona JSF: dodaj_tytul.xhtml Wywołanie metody komponentu typu Managed Bean 83

Strona JSF: lista_tytulow.xhtml Wywołanie właściwości items typu DataModel z komponentu typu Managed Bean model widoku typu datatable 84

Projekt typu Java Web Application zawierający elementy warstwy prezentacji Kod warstwy prezentacji (internetowej) Projekt zawierający kod interfejsu warstwy biznesowej i integracji 85

Widok stron: dodaj_tytul.xhtml oraz lista_tytulow.xhtml 86

Dodatek 1. Refaktoryzacja warstwy prezentacji 2. Refaktoryzacja warstwy biznesowej 3. Tworzenie warstwy integracji 4. Modelowanie i implementacja logiki biznesowej Katalogu tytułów i książek 87

1. Refaktoryzacja warstwy prezentacji 88

Ukrywanie zasobów przed klientem za pomocą konfiguracji kontenera uwierzytelnianie i autoryzacja JSP Sprawdzanie zabezpieczeń JSP Klient JSP Klient Kontroler JSP JSP JSP Warstwa klienta Warstwa prezentacji Warstwa klienta Możliwy dostęp jedynie przez kontroler Warstwa prezentacji 89

Przebieg uwierzytelniania (logowania) http://download.oracle.com/javaee/5/tutorial/doc/bncbe.html 90

Bazy użytkowników i grup, Użytkownik, Grupa, Rola http://download.oracle.com/javaee/5/tutorial/doc/bnbxj.html 91

Rodzaje mechanizmów bezpieczeństwa w kontenerach (kod do zarządzania aplikacją przez serwer aplikacji m.in. Bezpieczeństwem aplikacji) Deklaratywne mechanizmy bezpieczeństwa deklarowane za pomocą tzw. deployment descriptors (deskryptory aplikacji np. web.xml dla aplikacji typu web ). Deskryptory jako zewnętrzny element aplikacji zawierają informację specyfikującą role bezpieczeństwa i wymagania dostępu są mapowane w role specyficzne dla środowiska oraz użytkowników i polisy bezpieczeństwa. Programowe mechanizmy bezpieczeństwa - są osadzone w aplikacji i służą do podejmowanie decyzji o bezpieczeństwie. Uzupełniają deklaratywne mechanizmy bezpieczeństwa lepiej wyrażają model bezpieczeństwa aplikacji. API mechanizmów programowych: metody interfejsu EJBContext metody interfejsu HttpServletRequest. Metody te pozwalają na podejmowanie decyzji biznesowych opartych na rolach bezpieczeństwa nadawcy lub zdalnego odbiorcy Adnotacje lub metadane są używane do specyfikowania informacji wewnątrz pliku z kodem klasy. Kiedy aplikacja jest uruchamiana, informacja ta jest używana lub pokrywana przez deskryptor aplikacji. Np. @DeclareRoles( klient") public class Page1 extends AbstractPageBean { //... } 92

2. Refaktoryzacja warstwy biznesowej 93

Refaktoryzacja warstwy biznesowej 1 Obiekty danych typu Entity (obiekty biznesowe) z warstwy biznesowej są udostępniane klientom w innych warstwach za pomocą fasadowych komponentów sesyjnych typu Control (komponent typu fasada - hermetyzujący dostęp do usług biznesowych) Klient Logika biznesowa Obiekty Entity A Obiekty Entity B Klient Komponent sesyjny typu fasada Logika biznesowa Obiekty Entity A Obiekty Entity B Logika transakcyjna Warstwa prezentacji lub klienta Obiekty Entity C Warstwa biznesowa Warstwa prezentacji lub klienta Logika transakcyjna zarządzająca przez obiekty typu entity lub zarządzana przez kontener lub zarządzana przez specjalizowane komponenty Warstwa biznesowa Obiekty Entity C 94

Refaktoryzacja warstwy biznesowej 2 Komponenty sesyjne typu Control (pośredniczące w dostępie do obiektów danych typu Entity ) z warstwy biznesowej są udostępniane klientom w innych warstwach za pomocą obiektów fasadowych typu Control (hermetyzujących dostęp do warstwy biznesowej- komponentów Business Delegate) Komponent sesyjny 1 Obiekty Entity 1 Business Delegate 1 Komponent sesyjny 1 Obiekty Entity 1 Klient Komponent sesyjny 2 Obiekty Entity 2 Klient Business Delegate 1 Komponent sesyjny 2 Obiekty Entity 2 Komponent sesyjny 3 Obiekty Entity 3 Business Delegate 1 Komponent sesyjny 3 Obiekty Entity 3 Warstwa prezentacji lub klienta Warstwa biznesowa Warstwa prezentacji lub klienta Warstwa biznesowa 95

Refaktoryzacja warstwy biznesowej 3 Sesyjne komponenty fasadowe typu Control (każdy komponent jako odrębna usługa biznesowa), hermetyzujące obiekty danych typu Entity z warstwy biznesowej są udostępniane klientom w innych warstwach. Zwykłe obiekty sesyjne są jedynie pośrednikami obiektów Entity, natomiast nie hermetyzują całych usług, które wymagają odwołania do wielu zwykłych komponentów sesyjnych. Klient 1 Komponent sesyjny 1 Obiekty Entity 1 Klient 1 Komponent Sesyjny typu fasada A Obiekty Entity 1 Klient 2 Komponent sesyjny 2 Obiekty Entity 2 Klient 2 Obiekty Entity 2 Klient 3 Komponent sesyjny 3 Obiekty Entity 3 Klient 3 Komponent sesyjny typu fasada B Obiekty Entity 3 Warstwa prezentacji lub klienta Warstwa biznesowa Warstwa prezentacji lub klienta Warstwa biznesowa 96

3. Tworzenie warstwy integracji 97

Wydzielanie kodu dostępu do danych Kod dostępu do danych jest wydzielany z klas, które są używane do spełniania również innych celów Kod dostępu do danych powinno umieszczać się logicznie i fizycznie bliżej źródła danych Dowolna klasa Dowolna klasa Kod dostępu do danych Baza danych Kod dostępu do danych Baza danych Warstwa klienta, prezentacji lub biznesowa Warstwa zasobów Warstwa klienta, prezentacji lub biznesowa Warstwa integracji Warstwa zasobów 98

Refaktoryzacja dostępu do danych pula połączeń Liczba połączeń kodu dostępu do danych (DAO) z bazą danych jest ograniczona Połączenia kodu dostępu do danych (DAO) nie zawsze są wykorzystywane, lecz są utrzymywane, ponieważ otwarcie połączenia z bazą danych zabiera i zasoby Pula połączeń kodu dostępu do danych (DAO) pozwala racjonalnie zarządzać połączeniami aplikacji z bazą danych DAO Połączenia aktywne wolne DAO Połączenia zwrócone do puli Połączenia aktywne wolne DAO Baza danych DAO Baza danych DAO Połączenie aktywne wykorzystywne DAO Połączenie aktywne wykorzystywne Warstwa prezentacji, biznesowa lub integracji Warstwa zasobów Warstwa prezentacji, biznesowa lub integracji Warstwa zasobów

4. Modelowanie i implementacja logiki biznesowej Katalogu tytułów i książek 100

Projekt przypadku użycia Dodaj tytul za pomocą diagramu sekwencji i diagramu klas. Diagram klas jest uzupełniany metodami zidentyfikowanymi podczas projektowania scenariusza przypadku użycia za pomocą diagramu sekwencji. Definiowanie kodu metod realizujących przypadek użycia na podstawie diagramów sekwencji 101

(1) Dodaj tytul void TAplikacja::dodaj_tytul(String dane[]) 102

//TAplikacja public void dodaj_tytul(string dane[]) { } TFabryka fabryka = new TFabryka(); TTytul_ksiazki tytul = fabryka.podaj_tytul(dane); if (Szukaj_tytul(tytul) == null) mtytul_ksiazki.add(tytul); 103

(2) TTytul_ksiazki TFabryka::Podaj_tytul (String[] dane) 104

(3) Szukanie tytulu TTytul_ksiazki TAplikacja::Szukaj_tytul(TTytul_ksiazki tytul_) 105

//TAplikacja private ArrayList <TTytul_ksiazki> mtytul_ksiazki = new ArrayList < TTytul_ksiazki >(); public TTytul_ksiazki Szukaj_tytul (TTytul_ksiazki tytul_ ) { int idx; if ((idx=mtytul_ksiazki.indexof(tytul_))!=-1 ) { tytul_=mtytul_ksiazki.get(idx); return tytul_; } return null; } 106

(4) boolean TTytul_ksiazki::equals(Object ob) [getisbn().equals(((ttytul_ksiazki) ob).getisbn())] [getaktor().equals(((ttytul_ksiazki) ob).getaktor())] 107

//TTytul_ksiazki @Override public boolean equals(object ob) { boolean rezultat = false; if (getisbn().equals(((ttytul_ksiazki) ob).getisbn())) if (getaktor().equals(((ttytul_ksiazki) ob).getaktor())) rezultat = true; return rezultat; } 108

// ten kod powinien działać po uzupełnieniu kodu dla wskazanych klas // biorących udział w wykonanych przypadkach użycia oraz // po wykonaniu metody tostring() w tych klasach (TTytul_ksiazki oraz TTytul_ksiazki_na_kasecie) i gettytul_ksiazki() w klasie TAplikacja public static void main(string t[]) // your code here { TAplikacja ap = new TAplikacja(); String t1[] = {"1", "1", "1", "1", "1"}; //t1, t2, t3 tablice łańcuchów do tworzenia tytułu książki zwyklej pierwszy łańcuch String t2[] = {"1", "2", "2", "2", "2"}; // jest informacją dla fabryki, jaki obiekt wygenerować String t3[] = {"1", "3", "3", "3", "3"}; // 1 oznacza utworzenie obiektu klasy TTytul_ksiazki, a pozostałe łańcuchy to kolejno // autor, tytul, ISBN, wydawnictwo dla uproszczenia w postaci cyfr - obiekty do wstawiania String t4[] = {"3", "1", "1", "1", "1", "1"}; // t4, t5,t6 tablice łańcuchów do tworzenia tytułu książki jako nagranie //dźwiękowe String t5[] = {"3", "2", "2", "2", "2", "2"}; // pierwszy łańcuch jest informacją dla fabryki, jaki obiekt wygenerować String t6[] = {"3", "4", "4", "4", "4", "4"}; // 3 oznacza utworzenie obiektu klasy TTytul_ksiazki_na_kasecie, a pozostałe //łańcuchy to kolejno autor, tytul, ISBN, wydawnictwo, aktor dla uproszczenia w postaci cyfr- obiekty do wstawiania ap.dodaj_tytul(t1); ap.dodaj_tytul(t2); ap.dodaj_tytul(t2); //naruszenie integralności danych tytułów ap.dodaj_tytul(t3); ap.dodaj_tytul(t4); ap.dodaj_tytul(t5); ap.dodaj_tytul(t5); //naruszenie integralności danych tytułów ap.dodaj_tytul(t6); String lan = ap.gettytul_ksiazki().tostring(); System.out.println(lan); } 109

Projekt przypadku użycia Dodaj egzemplarz za pomocą diagramu sekwencji i diagramu klas. Diagram klas jest uzupełniany metodami zidentyfikowanymi podczas projektowania scenariusza przypadku użycia za pomocą diagramu sekwencji. Definiowanie kodu metod realizujących przypadek użycia na podstawie diagramów sekwencji 110

(5) Dodaj egzemplarz TTytul_ksiazki TAplikacja::dodaj_ksiazke(String dane1[], String dane2[]) 111

//TAplikacja public TTytul_ksiazki dodaj_ksiazke(string dane1[], String dane2[]) { TTytul_ksiazki pom, pom1 = null; TFabryka fabryka = new TFabryka(); pom = fabryka.podaj_tytul(dane1); if ((pom1 = Szukaj_tytul(pom))!= null) pom1.dodaj_ksiazke(dane2); return pom1; } 112

(6)Szukaj egzemplarz TEgzemplarz TTytul_ksiazki::Szukaj_egzemplarz(TEgzemplarz egzemplarz_) 113

//TTytul_ksiazki private ArrayList <TEgzemplarz> mksiazka = new ArrayList < TEgzemplarz >(); public TEgzemplarz Szukaj_egzemplarz (TEgzemplarz egzemplarz_ ) { int idx; if ((idx=mksiazka.indexof(egzemplarz_))!=-1 ) { egzemplarz_=mksiazka.get(idx); return egzemplarz; } return null; } 114

(7) boolean TEgzemplarz::equals(Object ob) 115

(8) void TTytul_ksiazki::dodaj_ksiazke(String dane[]) 116

//TTytul_ksiazki public void dodaj_ksiazke(string dane[]) { } TFabryka fabryka = new TFabryka(); TEgzemplarz nowa; nowa = fabryka.podaj_egzemplarz(dane); if (Szukaj_egzemplarz(nowa) == null) { } mksiazka.add(nowa); nowa.settytul_ksiazki(this); 117

(9) TEgzemplarz TFabryka::Podaj_egzemplarz (String[] dane) 118

Proponowany kod funkcji main w klasie fasadowej TAplikacja public static void main(string t[]) // your code here {TAplikacja ap = new TAplikacja(); String t1[] = {"1", "1", "1", "1", "1"}; //t1, t2, t3 tablice łańcuchów do tworzenia tytułu książki zwyklej pierwszy łańcuch String t2[] = {"1", "2", "2", "2", "2"}; // jest informacją dla fabryki, jaki obiekt wygenerować String t3[] = {"1", "3", "3", "3", "3"}; // 1 oznacza utworzenie obiektu klasy TTytul_ksiazki, a pozostałe łańcuchy to kolejno // autor, tytul, ISBN, wydawnictwo dla uproszczenia w postaci cyfr - obiekty do wstawiania String t4[] = {"3", "1", "1", "1", "1", "1"}; // t4, t5,t6 tablice łańcuchów do tworzenia tytułu książki jako nagranie dźwiękowe String t5[] = {"3", "2", "2", "2", "2", "2"}; // pierwszy łańcuch jest informacją dla fabryki, jaki obiekt wygenerować String t6[] = {"3", "4", "4", "4", "4", "4"}; // 3 oznacza utworzenie obiektu klasy TTytul_ksiazki_na_kasecie, a pozostałe //łańcuchy to kolejno autor, tytul, ISBN, wydawnictwo, aktor dla uproszczenia w postaci cyfr- obiekty do wstawiania ap.dodaj_tytul(t1); ap.dodaj_tytul(t2); ap.dodaj_tytul(t2); //naruszenie integralności danych tytułów ap.dodaj_tytul(t3); ap.dodaj_tytul(t4); ap.dodaj_tytul(t5); ap.dodaj_tytul(t5); //naruszenie integralności danych tytułów ap.dodaj_tytul(t6); String lan = ap.gettytul_ksiazki().tostring(); System.out.println(lan); String d1[] = {"0", "1"}; // d1, d2, d3 - tablice łańcuchów do tworzenia wzorcowego tytułu książki zwyklej do wyszukiwania String d2[] = {"0", "2"}; // pierwszy łańcuch jest informacją dla fabryki, jaki obiekt wygenerować: 0 oznacza generowanie String d3[] = {"0", "5"}; // obiektu klasy TTytul_ksiazki, drugi łańcuch jest ISBN obiekty do wyszukiwania String d4[] = {"2", "1", "1"}; //d4, d5 - tablice łańcuchów do tworzenia wzorcowego tytułu książki jako nagranie dźwiękowe String d5[] = {"2", "4", "4"}; //pierwszy łańcuch 2 oznacza generowanie obiektu typu TTytul_ksiazki_na_kasecie // drugi łańcuch to ISBN, trzeci jest nazwiskiem aktora - obiekty do wyszukiwania String tr1[] = {"0", "1"}; //tablice tr1 i tr2 zawierają informację o tworzeniu obiektu typu TEgzemplarz: pierwszy łańcuch String tr2[] = {"0", "2"}; //równy 0 oznacza tworzenie obiektu typu typu TEgzemplarz, drugi jest numerem egzemplarza String tr3[] = {"1", "3", "April 10, 2008, 00:00:00 GMT"}; //pierwszy łańcuch równy 1 oznacza tworzenie obiektu klasy String tr4[] = {"1", "2", "April 10, 2008, 00:00:00 GMT"}; //TEgzemplarz_termin, drugi oznacza numer, trzeci termin 119

TTytul_ksiazki pom = ap.dodaj_ksiazke(d1, tr1); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d2, tr1); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d2, tr1); //nie wstawi powtórzenie numeru ksiażki if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d2, tr2); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d3, tr2); //nie wstawi brak tytułu if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d4, tr3); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d4, tr3); //nie wstawi powtórzenie numeru ksiażki if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d4, tr4); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } pom = ap.dodaj_ksiazke(d5, tr2); if (pom!= null) { System.out.println(pom.getKsiazka().toString()); } } 120

Tak może działać aplikacja po wykonaniu poszczególnych przypadków użycia 121

Projekt przypadku użycia Wyszukiwanie tytulow za pomocą diagramu sekwencji i diagramu klas. Diagram klas jest uzupełniany metodami zidentyfikowanymi podczas projektowania scenariusza przypadku użycia za pomocą diagramu sekwencji. Definiowanie kodu metod realizujących przypadek użycia na podstawie diagramów sekwencji 122

(10) Wyszukiwanie tytulow TTytul_ksiazki TAplikacja::Wyszukaj_tytul (String[] dane) 123

Projekt przypadku użycia Wyszukiwanie egzemplarzy za pomocą diagramu sekwencji i diagramu klas. Diagram klas jest uzupełniany metodami zidentyfikowanymi podczas projektowania scenariusza przypadku użycia za pomocą diagramu sekwencji. Definiowanie kodu metod realizujących przypadek użycia na podstawie diagramów sekwencji 124

(11) Wyszukiwanie egzemplarzy TEgzemplarz TAplikacja::Wyszukaj_egzemplarz (String[] dane1, String[] dane2) 125

package wypozyczalnia1; import java.util.arraylist; public class TAplikacja { private ArrayList<TTytul_ksiazki> mtytul_ksiazki = new ArrayList<TTytul_ksiazki>(); public TAplikacja () {/* */ } public static void main (String[] t) {/* */ } public ArrayList<TTytul_ksiazki> gettytul_ksiazki () {/* */ } public void settytul_ksiazki (ArrayList<TTytul_ksiazki> val) {/* */ } } public TTytul_ksiazki Szukaj_tytul (TTytul_ksiazki tytul_) {/* */ } public void dodaj_tytul (String[] dane) {/* */ } public TTytul_ksiazki dodaj_ksiazke (String[] dane1, String[] dane2) {/* */ } public TTytul_ksiazki Wyszukaj_tytul (String[] dane) {/* */ } public TEgzemplarz Wyszukaj_egzemplarz (String[] dane1, String[] dane2) {/* */ } package wypozyczalnia1; public class TEgzemplarz { private int numer; private TTytul_ksiazki mtytul_ksiazki; } public TEgzemplarz () {/* */ } public int getnumer () {/* */ } public void setnumer (int numer_) {/* */ } public TTytul_ksiazki gettytul_ksiazki () {/* */ } public void settytul_ksiazki (TTytul_ksiazki val) {/* */ } public boolean equals (Object ob) {/* */ } public String tostring () {/* */ } 126