lec2tdp024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt...

76
Enterprise Systems Informationssökning Datalayer JPA - Facade, Logging, Testing TDP024 Anders Fröberg Institutionen för Datavetenskap (IDA)

Upload: others

Post on 03-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

1

Enterprise SystemsInformationssökning Datalayer JPA - Facade, Logging, Testing

TDP024

Anders Fröberg

Institutionen för Datavetenskap (IDA)

Page 2: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

Agenda

• Skrivuppgiften • Programming to an interface • JPA

2

Page 3: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

3

3

TDP024 – IN A NUTSHELL

•   I examensordningen står det att för alla kandidatexamina skall bland andra följande mål uppnås: (Även andra examina än kandidatexamina har nästan identiska mål)

1.  visa förmåga att söka, samla, värdera och kritiskt tolka relevant information i en problemställning samt att kritiskt diskutera företeelser, frågeställningar och situationer

2.  visa sådan färdighet som fordras för att självständigt arbeta inom det område som utbildningen avser

3.  visa förmåga att självständigt identifiera, formulera och lösa problem samt att genomföra uppgifter inom givna tidsramar

4.  visa förmåga att muntligt och skriftligt redogöra för och diskutera information, problem och lösningar i dialog med olika grupper

Page 4: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

4

TDP024 – Informationssökning

 Visa förmåga att söka, samla, värdera och kritiskt tolka relevant information i en problemställning samt att kritiskt diskutera företeelser, frågeställningar och situationer

Individuell rapport och seminarier 1Hp Sök och välj ut tre bra forskningsartiklarna relaterade till kursens innehåll . Skriv en sammanfattning och analys av alla tre artiklarna på en A4-sida vardera. Värdera varje artikel - Varför är den bra

4

Page 5: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

UppgiftIndividuell rapport och seminarie 1Hp

Denna uppgift går ut på att genomföra en fördjupning i aktuell forskning inom kursens områden samt träna på att utvärdera vetenskaplig litteratur. Samt diskutera innehållet av de ni läst på ett seminarie med de andra studenterna.

Sök och välj ut tre bra forskningsartiklarna relaterade till kursens innehåll . Skriv en sammanfattning och analys av alla tre artiklarna på en A4-sida vardera. Som språk kan antingen svenska eller engelska använda. Sammanfattningen/analysen ska utförligt besvara följande frågor:

• Vad är artikelns syfte? • Hur har det presenterade arbetet lagts upp (tillvägagångssätt/metod)? • Vilka resultat kommer artikeln fram till? • Vad finns det för begränsningar i arbetet? Avsluta varje analys med att redogöra varför artikel är en bra artikel. 5

Page 6: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

Hitta• http://scholar.google.se/ • http://dl.acm.org/ • http://ieeexplore.ieee.org/Xplore/home.jsp

6

Page 7: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

Vad gör en artikel bra?• Vem

• Hur många artiklar • Erkänd inom området

• Var • Tidskrift eller Konferensbidrag (ev Workshop) • Ranking och Impact Factor

• (http://www.cse.chalmers.se/~feldt/advice/isi_listed_se_journals.html)

• Vilka andra • Hur många andra har citerat artikeln

7

Page 8: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

Enterprise Systems

Program to an Interface och Dependency Injection

TDP024

Anders FröbergInstitutionen för Datavetenskap (IDA)

Page 9: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

9

Program to an interface

•  ”Program to an interface” är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och hållbara.

•  För en programmerare är det bland de viktigaste kunskaper man kan ta med sig in i ett projekt.

•  Projekt som väljer enklare metoder, eller hittar genvägar runt, har en drastiskt förkortad livslängd.

•  Det är på abstraktionsnivån programmering som denna metod befinner sig, inte på samma abstraktionsnivå som SCRUM eller arkitektur, etc.

2

Page 10: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

10

Program to an interface

•  I den här kursen är det omöjligt att klara laborationerna utan att ha förståelse för ”program to an interface”.

•  Eventuella avvikelser från metoden i laborationerna kommer ge komplettering.

•  I arbetslivet är det en självklarhet att man har denna kunskap med sig, och deltar man i ett projekt som inte använder sig av ”program to an interface” ska man kämpa för att de börjar med det.

3

Page 11: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

11

Program to an interface

•  I den här kursen är det omöjligt att klara laborationerna utan att ha förståelse för ”program to an interface”.

•  Eventuella avvikelser från metoden i laborationerna kommer ge komplettering.

•  I arbetslivet är det en självklarhet att man har denna kunskap med sig, och deltar man i ett projekt som inte använder sig av ”program to an interface” ska man kämpa för att de börjar med det.

3

Program to an interface

•  I korthet:

•  Systemet man bygger skall knytas samman och bero på kontrakt mellan olika delar.

•  Det skall inte bero på en viss implementation.

•  T ex. ett system skall vara beroende på ”sorterar en lista”, inte på ”bubble sort”.

•  Att ”sortera en lista” är ett kontrakt, jag säger till ett annat system ”sortera denna lista” och får tillbaka en sorterad lista. Det spelar dock inte mig någon roll hur detta gick till, jag har skrivit kod som jobbar mot kontraktet inte mot en viss implementation av kontraktet.

4

Page 12: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

12

Program to an interface

public interface Sort {

List sort(List list);

}

5

public class BubbleSort implements Sort { public List sort(List list) { //Do bubble sort } }

public class QuickSort implements Sort { public List sort(List list) { //Do quick sort } }

När jag skriver kod så jobbar jag mot interfacet, jag vet att alla klasser som uppfyller kontraktet kommer ha en funktion som heter sort och tar en lista och returnerar en lista.

Page 13: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

13

Program to an interface

public interface Sort {

List sort(List list);

}

6

public class BubbleSort implements Sort { public List sort(List list) { //Do bubble sort } }

public class QuickSort implements Sort { public List sort(List list) { //Do quick sort } } När någon sedan kommer fram till

en snabbare sorteringsalgoritm så behöver jag inte ändra i min kod, för den är skriven mot ett kontrakt, inte mot en implementation.

public class QuantSort implements Sort { public List sort(List list) { //Do quick sort } }

Page 14: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

14

Program to an interface

7

public class ListUtils { private Sort sort; public List findSmallest(List list) { list = sort.sort(list); return list.get(0); } }

Interface, det står inte: private BubbleSort sort;

Använder en metod som jag vet finns enligt kontraktet, oavsett vilken implementation jag använder.

”That’s a null pointer exception!”

Page 15: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

15

Dependency Injection

8

public class ListUtils { private Sort sort; public ListUtils(Sort sort) { this.sort = sort; } public List findSmallest(List list) { list = sort.sort(list); return list.get(0); } }

ListUtils väljer inte vilken implementation den skall använda. I sin konstruktor så accepterar den en instans av en implementation. (Notera att vi fortfarande endast använder interfaces).

Detta kallar vi dependency injection det består alltså av en klass som har en instansvariabel som blir satt i konstruktorn.

Page 16: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

16

Dependency Injection

9

public static void main(String [] args) { ListUtil listUtil = new ListUtil(new QuickSort()); int min = listUtil.findSmallest([21,13,55,34]) }

Någon gång måste man välja implementation, i detta fall är det koden som skapar ett nytt objekt av ListUtil som måste välja vilken implementation som skall användas.

För den intresserade så går det även att få bort detta beroende. Med hjälp av ”Inversion of Control” kan man få ”program to an interface on steroids”. Du anger aldrig vilken implementation som skall användas i koden, utan detta löses ”runtime” från t ex en XML fil som säger vilken implementation av Sort som skall användas just nu. Vi har inte tid med ”Inversion of Control” i denna kurs, men det rekommenderas till den intresserade.

Page 17: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

17

Program to an interface

•  Enhetstestning drar också stora fördelar från att fokusera på kontrakt snarare än implementation.

•  ”Test the contract, not the implementation”

•  Om vi skriver våra test mot kontrakt så kan vi testa oändligt många implementationer av samma kontrakt.

•  Om någon kommer och påstår att de har en ny implementation som är bättre, så kan man testa implementationen mot redan existerande tester.

10

Page 18: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

18

Program to an interface

public class Test {

//--- Unit under test ---//

private Sort sort = new BubbleSort();

//----------------------//

public void test() {

List a = [4,3,5,2,6];

List b = sort.sort(a);

Assert.assertTrue(b[0] == 2);

}

}

•  Koden i testet är oberoende av implementationen.

•  Innan vi kör testet kan vi byta implementation.

•  Om någon kommer och påstår att de har en bättre implementation, så tar vi deras kod och instansierar deras lösning istället.

•  Testen är exakt desamma.

11

Page 19: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

19

Data – Logic - Web

12

API

Data och Logik teamen sitter tillsammans och kommer överens om ett API (dvs ett kontrakt) för vilka funktioner som kommer behövas från datalagret. Som en del av detta arbete så skrivs också alla tester, dvs alla tester som måste vara uppfyllda för att logik teamet skall känna sig trygga i att använda data lagret.

Logik Data

Tests

Page 20: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

20

Data – Logic - Web

13

API

Logik Data

Tests API

Tests Data teamet tar sin kopia av kontrakt och tester och börjar sedan implementera. De är helt oberoende av alla andra delar av projektet. Och resten av projektet är helt oberoende av deras implementationsdetaljer.

Page 21: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

21

Data – Logic - Web

14

API Logik

Data

Tests

API

Tests

Web

Web och logik teamen gör precis samma sak. De kommer överens om ett kontrakt för kommunikation mellan web och logiklagret. I denna process skrivs även tester.

API

Tests

Page 22: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

22

Data – Logic - Web

15

API

Logik

Data

Tests

API

Tests

API

Tests

Nu har logik lagret ett kontrakt som de vet kommer bli uppfyllt (samt tester). Och de har ett kontrakt som de skall uppfylla (samt tester).

Web Data

Page 23: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

23

Data – Logic - Web

16

API

Logik

Data

Tests

API

Tests

API

Tests

Men hur kan man testa sin logik utan att kunna skapa instanser av de kontrakt som data lagret ska leverera? Måste man vänta på att data lagret blir klara?

Web

Data

Logiklagret kan skriva all sin kod så att den uppfyller kontraktet mot web. Eftersom logiklagret ALLTID jobbar mot kontraktet så behöver man inte vänta på en implementation från datalagret.

Page 24: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

24

Data – Logic - Web

17

API

Logik

Data

Tests

API

Tests

API

Tests

Just fake it! Logik lagret har ju kontrakten från data lagret, de kan skapa sitt egna lilla fejk datalager som de kan använda för att testa med. Detta kallas ofta ”mocking” eller ”creating mock objects”

Web

Data

Page 25: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

25

Mock objects - Mocking

18

public class Test {

//--- Unit under test ---//

private Sort sort = new Sort() {

public List sort(List sort) {

return [2];

}

}

//----------------------//

public void test() {

List a = [4,3,5,2,6];

List b = sort.sort(a);

Assert.assertTrue(b[0] == 2);

}

}

•  Så vi skapar en egen implementation av Sort (till dess att data lagret är klara med sin) som vi kan testa med.

•  Den behöver inte vara bra, så länge den gör vad den ska.

•  När data lagret sedan är klara så stoppar vi in deras implementation istället.

Page 26: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

26

Data – Logic - Web

19

Logik

API

Tests

Web

API

Tests

Data

DB implementation

Logic implementation

Web implementation

När alla delar är på plats så har man ett system som är modulärt och hållbart. De olika implementationerna är endast beroende på kontrakten.

Page 27: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

27

Data – Logic - Web

20

Logik

API

Tests

Web

API

Tests

Data

DB implementation

Logic implementation

Web implementation

Om datalagret får för sig att byta sin implementation till t ex. ett system som sparar i en molntjänst istället för på lokal databas, eller vill helt plötsligt börja spara i flat-files, så spelar det ingen roll för de andra. Så länge datalagret lovar att upprätthålla kontraktet och testerna så behöver ingen ändra sin kod.

Cloud implementation

Page 28: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

28

Data – Logic - Web

21

API

Tests

Data

DB 1.0 implementation

Även inom data lagret är det smidig att testa nya implementationer (eftersom de redan har tester). Antag att ett av biblioteken som data lagret använder uppdateras från 1.0 till 2.0, och mycket har ändrats i den nya versionen. Istället för att börja ändra i sin existerande implementation så skapar man en ny, som är helt baserad på 2.0, men testerna är de samma. När man väl är färdig med implementationen (och den passerar alla tester) så kan man byta ut den gamla utan att någon behöver ändra på sin kod.

DB 2.0 implementation

Page 29: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

29

Summering av Föreläsning 1

•  Vi tittade på HSV’s examensmål, och fick en överblick av kursdesignen utifrån dessa.

•  Vi definierade: Multi-Tier, SOA, Enterprise Systems, ”program to an interface” och dependency injection.

•  Vi tittade på våra SOA principer: Contract, Abstraction, Autonomy och Stateless

•  Vi tittade på kursens fokus på arkitektur, och tog med oss Bezos kommentar: All service interfaces, without exception, must be designed from the ground up to be externalizable. That is to say, the team must plan and design to be able to expose the interface to developers in the outside world. No exceptions.

2

Page 30: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

30

Backend – SOA Tjänst – Egentligen flera lager

3

DATA$

LOGIC$

EXPOSURE$(WEB)$

Konsument Konsument

DB

SOA$TJänster

Klienter kan vara webbsidor, desktop/mobil applikationer,

andra SOA tjänster, ATM, parkeringsautomater etc..

MySQL. MongoDB, LDAP, etc…

Backend – DB, DATA, LOGIC, EXPOSURE (WEB)

Page 31: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

31

Motivation & Problem

•  Sparande och förmedling av information är det centrala i våra tjänster

•  Databaser gör det möjligt för oss att spara information på ett säkert och stabilt sätt

•  Data bör komma in och ut ur applikationen på ett naturligt sätt

•  En SQL databas är en samling tabeller med rader och kolumner

•  En Java applikation består utav objekt

•  JPA är ett Java bibliotek (del utav Java EE) som ”översätter” Java klasser till rader och kolumner - ORM (Objekt-Relational-Mapping)

4

Page 32: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

32

JPA – POJO & @Entity

•  Instanser av klasser annoterade med @Entity kan sparas till databasen

•  Som ett minimum behöver man annotera ett fält med @Id för primary-key

•  Egentligen är klassen en POJO (Pure Old Java Objekt) utan några speciella krafter

•  @Column används för att konfigurera kolumnen för ett fält (nullable, unique, etc)

•  JPA kommer skapa tabeller som anses nödvändiga

•  Kan hantera komplexa relationer mellan klasser och även datatyper så som HashMap och List (med lite konfiguration)

5

Page 33: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

33

JPA - Entity Exempel

public interface Todo {

long getId();

void setId(long id);

String getTitle();

void setTitle(String title);

}

@Entity

public class TodoDB implements Todo {

@Id

private long id;

private String title;

private String body;

@Override

public long getId() {

return id;

}

...

}

6

Interface Implementation

Page 34: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

34

JPA – Table Example

id$6$bigint(20)$ =tle$6$varchar(255)$ content$6$varchar(255)$

1" Title"1" Content"1"

2" Title"2" Content"2"

3" Title"3" Content"3"

…" …" …"

…" …" …"

7

Behöver inte fundera på vilka tabeller eller kolumner som bör skapas, detta görs åt mig. Innebär att det är lättare att byta databas den dagen företaget väljer att köpa in t ex Oracle, eller helt byta till t ex MongoDB (som inte består utav rader och kolumner alls)

Page 35: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

35

EntityManager & Transactions

•  Förutom att använda annotations (@) på klasser som skall sparas i databasen så behöver vi kommunicera med databasen.

•  En EntityManager skapas genom klassen EntityManagerFactory

•  EntityManager ansvarar för att skapa, starta och avsluta transactions

•  All kommunikation som skriver till databasen måste ske inom en transaktion

•  Antingen så lyckas alla operationer inom en transaktion eller så misslyckas alla

8

Page 36: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

369

Transactions

Om något går fel inom transaktionen, så görs först en ”rollback” på alla operationer, och transaktionen stängs. Allt är som det var vid t0.

Transaktionen öppnar vid t0, och under tiden den är öppen görs ett antal skrivningar till databasen. Så länge allt fungerar som det ska, så skrivs allt data till databasen och vi kommer till t1, där transaktionen stängs

Page 37: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

37

FAÇADE DESIGN PATTERN Intermezzo

10

Glöm inte bort EntityManager,"En0tyManagerFactory"och"Transac0ons,"vi"

återkommer"0ll"dessa"strax!

Ett design pattern är ett namn på en ”konstruktion” eller uppsättning klasser som jobbar tillsammans på ett sätt som är användbart för många applikationer. Det ger utvecklare ett vokabulär att kommunicera med istället för att upprepa sig själva hela tiden.

Page 38: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

38

Intermezzo – Façade Design Pattern

11

Har jag glömt något ?

Page 39: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

39

Intermezzo – Façade Design Pattern

12

Klart!

Page 40: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

40

Intermezzo - Facade Design Pattern

•  En klass vars uppgift det är att abstrahera komplexa delar, och på så vis förenkla interaktionen med systemet

•  I datalagret använder vi façades för att erbjuda funktioner för ”verben” create, remove, update, find

•  Det är viktigt att tänka på att de façades som vi skapar i datalagret skall hantera generiska ”verb” som är lika mellan applikationer, inte saker som är unika för just din tjänst.

•  Vi har även façades i logiklagret som kan hantera andra typer av ”verb”, så som ”checkIn” och ”checkOut” … mer om detta på senare föreläsningar

13

Page 41: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

41

JPA – Façade, EMF, Transactions public class TodoEntityFacadeDB implements TodoEntityFacade {

@Overrides public long create(String title, String body) {

EntityManager em = EMF.createEntityManager();

em.getTransaction().begin();

Todo todo = new TodoDB();

todo.setTitle(title);

todo.setBody(body);

em.persist(todo);

em.getTransaction().commit();

return todo.getId();

}

} 14

EMF är en klass som man måste skapa själv, det finns en sådan i kodskelettet . Exemplet är inte komplett då vi inte hanterar eventuella fel på ett bra sätt. Mer om detta senare.

Interface på vänstersidan, implementation på höger!

Page 42: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

42

JPA - Konfiguration

•  JPA behöver konfigureras för att veta vilka klasser som skall sparas

•  JPA behöver information om var databasen är och hur vi kopplar oss mot den

•  /src/META-INF/persistence.xml

•  Vi kommer använda en databas som bara existerar i RAM, så inga ändringar behövs för detta.

•  Finns en hel del andra inställningar som är viktiga, t ex ”drop-and-create”

15

En grundläggande persistence.xml finns i kodskelettet.

src/main/resources/persistence.xml

Page 43: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

43

persistence.xml

….

<persistence-unit name="todo-dataPU" transaction-type="RESOURCE_LOCAL">

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<class>tdp024.todo.data.db.entity.TodoDB</class>

<shared-cache-mode>NONE</shared-cache-mode>

<validation-mode>NONE</validation-mode>

<properties>

<property name="javax.persistence.jdbc.url” value="jdbc:derby:memory:dataPU_embedded;create=true”/>

<property name="javax.persistence.jdbc.password" value=""/>

<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>

<property name="javax.persistence.jdbc.user" value=""/>

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>

</properties>

</persistence-unit></persistence>

16

Lägg till en sådan rad för varje entity

Page 44: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

44

Motivation & Problem

•  Hur vet man att façaden är klar och kan användas av logiklagret ?

•  Om man ändrar i sin façade i efterhand, hur vet man att något inte gått sönder ?

•  Hur vet man att det inte finns några buggar i sin façade ?

17

Page 45: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

45

JPA - JUnit •  Viktigt att enhetstesta sin

façade med Junit

•  ”Test your interface, not your implementation”

•  Under utvecklingen skriver man först test för de funktioner man tror sin façade kommer behöva, sedan skriver man själva funktionerna

•  När alla testen kör så vet man att façaden är klar och fungerar

•  Test Driven Development (TDD) är en del av eXtreme Programming

•  De viktigaste fördelarna är: •  Systemet är testat och fungerar

som tänkt.

•  Endast de funktioner man behöver har utvecklats, dvs lösningen är inte over-engineered.

•  Det går snabbt att kontrollera att ändringar i systemet inte har ändrat funktionaliteten (recession testing)

18

Page 46: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

46

JPA - TDD

19

Realizing quality improvement through test driven development: results and experiences of four industrial teams - Nachiappan Nagappan & E. Michael Maximilien & Thirumalesh Bhat & Laurie Williams - (2008)

(From abstract of paper)

Case studies were conducted with three development teams at Microsoft

and one at IBM that have adopted TDD. The results of the case studies

indicate that the pre-release defect density of the four products decreased

between 40% and 90% relative to similar projects that did not use the TDD

practice. Subjectively, the teams experienced a 15–35% increase in initial

development time after adopting TDD.

Page 47: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

47

JPA – JUnit exempel

@Test

public void test() {

TodoFacade todoFacade = new TodoFacade();

long id = todoFacade.create(”Todo 1”, ”Don’t forget …”);

Assert.assertFalse(id == 0);

}

20

Inte ett komplett exempel, men sådana finns i kodskelet och i föreläsnings kod. Det fina med att skriva testfall på detta sätt är att man kan få ut rapporter på hur många av sina test som gått igenom och att man kan få code-coverage.

Page 48: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

48

Motivation & Problem

21

Page 49: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

49

JPA – Find & JPQL

•  Vi vill kunna hämta enskilda objekt ur databasen

•  Vi vill hitta dessa via valfri column, t ex id eller title

•  Vi vill också kunna hämta alla objekt tillhörande en klass, eller en filtrerad lista

•  JQPL har ett SQL liknande syntax

•  Skapa ett Query objekt genom EntityManager

•  Sätt parametrar i Query objekt

•  Hämta ett objekt eller en lista

22

Page 50: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

50

JPA – Find & JPQL - Exempel

Find by id (@Id) public Todo find(long id) {

EntityManager em = EMF.createEntityManager();

Todo todo = em.find(TodoDB.class, id);

return todo;

}

23

Vi skriver inte till databasen, så vi behöver ingen transaction

Interface Letar efter en implementation

Page 51: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

51

JPA – Find & JPQL - Exempel

Find by title public Todo findByTitle(String title) {

EntityManager em = EMF.createEntityManager();

Query query = em.createQuery(

”SELECT t FROM TodoDB t WHERE t.title = :titleParam”

);

query.setParameter(”titleParam”, title);

return (Todo) query.getSingleResult();

}

24

Vi skriver inte till databasen, så vi behöver ingen transaction. Exemplet är inte komplett då vi inte hanterar eventuella fel.

Page 52: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

52

JPA – Find & JPQL - Exempel

Find all public List<Todo> findAll() {

EntityManager em = EMF.createEntityManager();

Query query = em.createQuery(

”SELECT t FROM TodoDB t”

);

return query.getResultList();

}

25

Vi skriver inte till databasen, så vi behöver ingen transaction. Exemplet är inte komplett då vi inte hanterar eventuella fel.

Page 53: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

53

Motivation & Problem

•  Data -> Databas (Nätverk, inkorrekt data, etc)

•  Databas -> Data (Nätverk)

•  Jordbävning i serverhall ?

•  Strömavbrott ?

•  ”Moth in relay” ?

26

”Anything that can go wrong will go wrong” - Murphy’s Law

Page 54: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

54

JPA - Exceptions

•  Ibland avbryts exekveringen pga ett fel

•  Servrar kan vara nere, nätverk kan vara otillgängliga

•  Ett logiskt fel, t ex samma email för flera konton

•  Viktigt att hantera olika typer av fel på olika sätt

•  Att bara hantera felet ”tyst”, utan att tala om att något har gått fel är oftast inte så användbart

•  Vi vill tala om för anropet att något gått fel, men inte krascha systemet

27

Page 55: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

55

JPA – Exceptions - Exempel

public class TodoEntityFacadeDB implements TodoEntityFacade {

public long create(String title, String body)

throws Exception {

if(title == null || title.isEmpty()) {

throw new IllegalArgumentException(

”Title can’t be null or empty”

);

}

}

}

28

Page 56: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

56

Återblick – Façade, EMF, Transactions public class TodoEntityFacadeDB implements TodoEntityFacade {

public long create(String title, String body) {

EntityManager em = EMF.createEntityManager();

em.getTransaction().begin();

Todo todo = new TodoDB();

todo.setTitle(title);

todo.setBody(body);

em.persist(todo);

em.getTransaction().commit();

return todo.getId();

}

}

29

Page 57: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

57

JPA – Exceptions - Exempel

… samma kod som tidigare exempel …

EntityManager em = EMF.createEntityManager();

try {

//samma kod som i tidigare men vi stänger inte EntityManager.

} catch (Exception e) {

… gör något med felet …

return 0;

} finally {

if(em.getTransaction().isActive()) {

em.getTransaction().rollback();

}

em.close();

}

30

Returnera$0,$då$vet$användaren$a5$objektet$inte$har$sparats$i$databasen$och$a5$något$gå5$fel.$$”finally”$körs$allFd,$oavse5$om$fel$har$uppstå5$eller$inte,$det$ger$oss$möjlighet$a5$göra$rollbacks$på$transakFonen$och$stänga$vår$EnFtyManager$innan$vi$gör$något$annat.$$Vi$F5ar$på$de5a$i$e5$tydligare$exempel$senare…$

Page 58: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

58

JPA - Logging

•  Att logga alla anrop och fel gör att det blir enklare att hitta buggar när systemet väl är igång

•  Genom att skriva till något persistent, istället för bara System.out, så kan vi gå tillbaka i tiden och även visualisera med HTML eller annat format

•  Loggning kan också ske i form av mejl

•  Men det finns ett problem med den modell vi visat här

•  Vad händer om vår tjänst ligger bakom en load-balancer och är skalad till 20 servrar ?

•  Alla anrop hamnar på olika servrar, så då har vi 20 filer som alla har loggat delar av en användares väg genom systemet

31

Page 59: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

59

Motivation & Problem

32

Page 60: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

60

Distribuerad Loggning

•  Istället bör man komplettera sin vanliga loggning med distribuerad loggning

•  T ex en tjänst som tar emot loggmeddelanden och ordnar dessa centralt

•  Vi använder Monlog för detta

•  Monlog är utvecklat vid Linköpings Universitet av IP studenter under VT2012

•  Uppgifter om hur man använder Monlog finns i laborations beskrivningen

•  Användarnamn, lösenord och API nycklar skickas av kursledningen via mejl

33

Page 61: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

61

Motivation & Problem

34

Page 62: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

62

JPA - Mappings

35

id$6$bigint(20)$ =tle$6$varchar(255)$ content$6$varchar(255)$

1" Title"1" Content"1"

2" Title"2" Content"2"

3" Title"3" Content"3"

…" …" …"

…" …" …"

Vår första Entity skapade en tabell som ovan, den innehåll bara strängar och heltal …

Page 63: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

63

Motivation & Problem

36

Page 64: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

64

JPA - Mappings

•  Komplexa förbindelser, Todo <-> Account

•  @OneToMany @OneToOne @ManyToOne @ManyToMany

•  Väldigt viktigt med utförliga testfall för att förstå hur dessa ”mappings” påverkar varandra och databasens uppbyggnad

•  Det finns många inställningsmöjligheter med mappings, och det är ofta viktigt att testa en inställning, titta på hur databasen skapas för detta och ta ett beslut om man vill använda den strukturen

•  Skriv testfall som testar vad som händer om man tar bort, lägger till, uppdaterar objekten i en relation

37

Page 65: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

65

JPA – Mappings exempel

Todo @Entity

public class TodoDB

implements Todo {

@Id

private long id;

private String title;

private String content;

@ManyToOne(targetEntity=CategoryDB.class)

private Category category;

}

Category @Entity

public class CategoryDB

implements Category {

@Id

private long id;

private String username;

@OneToMany(mappedBy=”category”, targetEntity= TodoDB.class)

private List<Todo> todos;

}

38

Page 66: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

6639

Page 67: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

67

JPA - Concurrency

•  Våra tjänster har inte bara en tråd

•  Räkna med att för varje ny användare skapas en ny tråd, och då ofta en ny EntityManager

•  Vad händer om man försöker köra samma funktion samtidigt, t ex uppdatera en Todo ?

•  Pessimistisk: Lås hela raden som skall ändras, ingen annan för röra den tills tråden är klar, lås upp när vi är klara

•  Optimistisk: Hämta objekt och ändra som vanligt, men om objektet har ändrats i databasen när vi försöker skriva så fallerar funktionen

40

Page 68: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

68

JPA – Concurrency Exempel

… public long update(long id, String title, String body) {

Todo todo = em.find(TodoDB.class, id, LockModeType.PESSIMISTIC_WRITE);

}

41

För andra varianter av LockModeType kolla länkar under kurslitteratur på hemsidan

Page 69: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

69

JPA – Concurrency – Klassiskt exempel

42

(OBS: Pseudo kod) function debit(amount) { Account account = findAccount(); if(account.credit >= amount) { account.credit = account.credit – amount; persistToDatabase(account); return true; } else { return false; } }

Antag att Account bara har 100kr på sitt konto, och vi får in två requests samtidigt med en debitering på 100kr

Page 70: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

70

JPA – Concurrency – Klassiskt exempel

43

(OBS: Pseudo kod) function debit(amount) { Account account = findAccount(); if(account.credit >= amount) { account.credit = account.credit – amount; persistToDatabase(account); return true; } else { return false; } }

Antag att Account bara har 100kr på sitt konto, och vi får in två requests samtidigt med en debitering på 100kr

Tråd 1

Tråd 2 väntar….

Page 71: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

71

JPA – Concurrency – Klassiskt exempel

44

(OBS: Pseudo kod) function debit(amount) { Account account = findAccount(); if(account.credit >= amount) { account.credit = account.credit – amount; persistToDatabase(account); return true; } else { return false; } }

Antag att Account bara har 100kr på sitt konto, och vi får in två requests samtidigt med en debitering på 100kr

Tråd 1

Tråd 2

CPU’n har valt att arbeta med tråd 2, tråd 1 står därmed still.

Tråd 2 debiterar och skriver till, databasen. Account har nu 0kr på sitt konto.

Page 72: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

72

JPA – Concurrency – Klassiskt exempel

45

(OBS: Pseudo kod) function debit(amount) { Account account = findAccount(); if(account.credit >= amount) { account.credit = account.credit – amount; persistToDatabase(account); return true; } else { return false; } }

Antag att Account bara har 100kr på sitt konto, och vi får in två requests samtidigt med en debitering på 100kr

Tråd 1

Tråd 1 har redan kollat att account hade >= 100kr, så den kör på.

Tråd 2 är klar…

När Tråd 1 är klar har vi debiterat, 200 kr från account (som bara hade 100kr) och account.credit == 0

Page 73: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

7346

Page 74: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

74

JPA - Validering

•  Det finns bibliotek som del av Java EE som löser detta problem.

•  Man kan automatiskt validera email, siffor, max o min, godtyckliga strängar etc.

•  Biblioteket kallas Bean Validation.

•  Vi kommer inte att ta på oss problemet med validering i denna kurs, men det är naturligtvis ett viktigt problem i större system.

47

Page 75: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

75

Datalayer - DONE

48

Entity

Facade

JUnit

Mapping Validation

Transaction Concurrency

Query Exception

TDD

Code-Coverage

Recession

DB

Del

av

data

lagr

et

Problem som hanteras

Page 76: lec2TDP024/lectures/tdp024-2-2018.pdf · 2018-09-18 · är en metod att organisera och bygga sitt system på som är grundläggande för alla system som skall vara modulära och

76

www.liu.se