DB, DATA, LOGIC, EXPOSURE (WEB)

Relevanta dokument
TDP024. Datalayer JPA - Facade, Logging, Testing. Enterprise Systems. Anders Fröberg Institutionen för Datavetenskap (IDA)

Agenda TDP024 IN A NUTSHELL TDP024. Muddy Card Skrivuppgiften JPA

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

TDP024 Enterprise Systems

TDP024 Enterprise Systems

TDP024. Enterprise Systems. Introduktion, ES, SOA, Multi-Tier. Anders Fröberg Institutionen för Datavetenskap (IDA)

TDP024 Enterprise Systems

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Classes och Interfaces, Objects och References, Initialization

Kopiering av objekt i Java

Webbtjänster med API er

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Objektorienterad Programmering (TDDC77)

TDP013 Node.js, JSCoverage, Mocha. Marcus Bendtsen Institutionen för Datavetenskap

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Felhantering TDDD78, TDDE30, 729A

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Tentamen ITK:P2. Inga hjälpmedel tillåtna förutom penna och papper. Skriv tydligt och texta gärna. 14 st frågor, 70 poäng.

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

Android fortsättning. TDDD80 Mobila och sociala applikationer

Objektorienterad Programmering (TDDC77)

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Föreläsnings 9 - Exceptions, I/O

Att skriva till och läsa från terminalfönstret

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Services + REST och OAuth

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

TDP013. Webbprogrammering och interaktivitet. AJAX, CORS & jquery. Marcus Bendtsen Institutionen för Datavetenskap (IDA)

Webbtjänster med API er

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Fakulteten för ekonomi, kommunikation och IT. Corba. Datum: Mathias Andersson

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

DAT043 Objektorienterad Programmering

Lösningsförslag till tentamen

Tentamen Programmering fortsättningskurs DIT950

Lösningar för tenta 2 DAT043,

MVC med Javascript och Ajax. Filip Ekberg

Klientprogrammering mot databaser

Testramverk och Model based testing med java i praktiken

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Vitec Connect. Teknisk beskrivning REVIDERAT SENAST: VITEC. VITEC Affärsområde Mäklare

Laboration 2 RESTful webb-api

1ME323 Webbteknik 3 Lektion 6 API. Rune Körnefors. Medieteknik Rune Körnefors

F4. programmeringsteknik och Matlab

Concurrency Saker händer samtidigt. Process En instans av ett program

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

ID1004 Laboration 4, November 2012

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Webbtjänster med API er

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

Exceptions (undantag) Murach s: kap 7

F8 Webbteknologier 1. Dynamiska webbsidor

Föreläsning 3. Stack

Design by Contract, Exceptions. Objekt-orienterad programmering och design (DIT953) Johannes Åman Pohjola, 2018

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Laboration 2: Designmönster

1 Comparator & Comparable

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

LEDNINGSÄGARMODUL. Systemgränssnitt

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Serviceklass för Facebook Graph API

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Chapter 4: Writing Classes/ Att skriva egna klasser.

Objekt-orienterad Programmering och Design. TDA551 Alex Gerdes, HT-2016

Dugga Datastrukturer (DAT036)

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Fördjupad Java. Undantagshantering. Fel

Swedbank Mobile Loadtesting. LoadRunner Mobile App protocol

Föreläsning 3. Stack

Laboration 10 - NetBeans

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Webbprogrammering. Sahand Sadjadee

TDP013. Node.js, Mocha, Istanbul. Anders Fröberg Institutionen för Datavetenskap

Webbteknik II. Föreläsning 5. Restless farewell. John Häggerud, 2011

Tentamen Nätverksprogrammering Lösningsförslag

Design by Contract, Exceptions, Initialisering. Objekt-orienterad programmering och design (DIT952) Johannes Åman Pohjola, 2017

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Transkript:

Backend DB, DATA, LOGIC, EXPOSURE (WEB) MySQL. MongoDB, LDAP, etc DB DATA LOGIC SOA TJänster EXPOSURE (WEB) Klienter kan vara webbsidor, desktop/mobil applikationer, andra SOA tjänster, ATM, parkeringsautomater etc.. Konsument 2 Konsument

Datalager Del av datalagret DB Problem som hanteras Entity Mapping Validation Facade Transaction Concurrency Query Exception TDD Recession JUnit Code-Coverage 3

Datalager I datalagret är det utvecklaren av tjänsten som bestämmer. Ingen kommer direkt åt databasen utan datalagret, och ingen vet hur data sparas, skulle kunna vara en XML fil eller "tape" (abstraktion). Datalagret känner inte till omvärlden eller resten av företaget, utan lever i sin egna värld med egna regler. Datalagret har ett ansvar, att skriva och hämta data på ett säkert och stabilt sätt. Att helt plötsligt börja skicka ut SMS, starta servrar eller skicka pappersfakturor från datalagret vore att bryta mot att bara ha ett ansvar. 4

Business Logic Layer Business Logic Kan förklaras som de funktioner som får företaget eller systemet att fungera. T ex för en p-automat kan det vara printticket, ejectchange etc. För en webbplats kan det vara registeruser, loginuser etc. Det är de funktioner som är av intresse för omvärlden att använda sig av, som ger värde till företaget, därav "business logic" 5

Business Logic Layer För att skapa värde till företaget behöver logiklagret göra två saker: 1. Anrop till externa tjänster inom och utom företaget. Man kan behöva anropa t ex openid för inloggning, skapa Git konton, skicka faktura, skriva till Twitter etc... 2. Kommunicera med datalagret (man skulle kunna ha fler datalager i samma SOA tjänst) 6

Data vs Logic I datalagret har man: create(...) I logiklagret har man: register(...) register kommer behöva create, men funktionen kanske också måste göra en hel del annat. Att skriva till databasen är ett steg i processen, men det kanske behövs ett Git konto, Apache server, etc. som måste skapas, det kan inte datalagret. Datalagret kan returnera data till logiklagret, men kan inte anropa logiklagret. Datalagret har inte ens tillgång till logiklagret vid kompilering, så man kommer inte så långt med ett sådant arbete. 7

Logic Layer Externa tjänster Hur man anropar externa tjänster är oftast olika beroende på vad man anropar (Twitter, Facebook, Google, Amazon etc). I kodskelettet finns det en fil HTTPHelper som kan användas för att enklare göra GET anrop till servrar. Oftast får man titta i dokumentationen för tjänster hur man gör, men ibland så finns det kompilerade bibliotek som man bara inkluderar i sitt system och sedan kan man anropa tjänsterna som om de var vanliga Java funktioner (t ex Monlog). 8

HTTPHelper Antag att man vill anropa: http://www.google.com?name=m&q=b Key Value Då anropar vi med HTTPHelper: HTTPHelper helper = new HTTPHelperImpl(); String response = helper.get("http://www.google.com", "name", "M", "q", "B"); Strängen response innehåller nu den text som tjänsten returnerade, i ert fall oftast JSON. Tänk på att tjänsten kan returnera strängen null vid vissa fel, inte Java värdet null. 9

JSONSerializer TodoJsonSerializer jsonserializer = new TodoJsonSerializerImpl(); Todo todo = todologicfacde.find(id); String json = jsonserializer.tojson(todo); Detta är nu en JSON representation av Todo 10

DTO Data Transfer Object, ett vanligt design pattern som man använder hela tiden utan att tänka på det public class TodoDTO { private String content; public TodoDTO() { public String getcontent() { return content; public void setcontent(string content) { this.content = content; TodoJsonSerializer jsonserializer = new TodoJsonSerializerImpl(); Detta skulle kunna komma från ett anrop via HTTPHelper. String json = "{'content' : 'hello'"; TodoDTO todo = jsonserializer.fromjson(json, TodoDTO.class); System.out.println(todo.getContent()); 11

Logic Layer - Exempel public class TodoLogicFacadeImpl implements TodoLogicFacade { private TodoEntityFacade todoentityfacade;. public Todo checkout(long id) { try { Todo todo = todoentityfacade.find(id); todoentityfacade.updatestatus(todo.getid(), true); Twitter4j.tweet(todo.getTitle() + was checked out ); return todo; catch (Exception e) { ta hand om felet return null; Returnera null om något misslyckas 12

Logic Layer - Exceptions och JUnit I logiklagret kan det också ske fel, kanske ännu fler än i datalagret. Likaväl som man testar sitt datalager med JUnit så skall man testa sin logik med JUnit Tjänster man anropar kanske inte svara, anrop till datalagret lyckas inte, etc. Testningen går till på exakt samma sätt som i datalagret Samma sak gäller i logiklagret som i datalagret, man måste logga centralt och distribuerat (Monlog) Det är lika viktigt här med codecoverage och att man använt TDD för att inte over-engineer systemet 13

Logic Layer Consistency och Rollback Något som är väldigt svårt att generalisera, eller även definiera är rollbacks i logik lagret. Antag att vi gör tre steg: Lägg en beställning på vara i databasen. Skicka faktura till kund. Skriv till Twitter att vi sålt en vara. Om vi inte lyckas skicka fakturan, hur hanterar vi det? Om vi inte lyckas skriva till Twitter, hur hanterar vi det? Utanför ramen för denna kurs, men en viktigt aspekt. 14

Web Layer Sista delen i vår SOA tjänst är webblagret Här exponerar vi vår logik med hjälp av web tjänster enligt REST principen Lagret kommunicerar endast direkt med logiklagret, men får inte ändra något i logiken av systemet För att förstå styrkan av detta lager måste man föreställa sig en situation där man byter ut HTTP mot t ex CORBA eller liknande 15

Web Service REST När man utvecklar REST tjänster så vill man definiera olika URL er för olika funktioner Alla filer som tillhör tjänsten (inklusive data och logik biblioteken) paketeras i en sk. war fil Java EE har ett bibliotek för detta som kallas JAX-RS eller ibland det vänligare Jersey war filen placeras sedan i Glassfish och tjänsterna startas och finns tillgängliga Jersey är en förlängning av Java EEs vanliga bibliotek för HTTP hantering som kallas Servlets war = Web Application Archive 16

JAX-RS - POJO - Exempel public class TodoService { Dependency injection private TodoJsonSerializer jsonserializer = new TodoJsonSerializerImpl(); private TodoLogicFacade todologicfacade = new TodoLogicFacadeImpl(new TodoEntityFacadeImpl()); public Response find(long id) { Todo todo = todologicfacade.find(id); String json = jsonserializer(todo); return Response.ok().entity(json).build(); 17

JAX-RS - POJO - Exempel @Path( /todo ) public class TodoService { @GET @Path( find ) public Response find(@queryparam( id ) long id) { Todo todo = todologicfacade.find(id); String json = jsonserializer(todo); return Response.ok().entity(json).build(); 18

JAX-RS - Exceptions Om något gått fel i anropen till logiklagret (och därmed datalagret) så vill vi rapportera detta till den som gjorde anropet Med REST görs detta ofta med HTTP felkoder I laboration 1 nöjer vi oss med att helt enkelt rapportera att något gått fel, och inte i detalj rapportera vad som har gått fel. Det finns möjlighet för studenter i laboration 2 att fördjupa sig just i denna problematik, hur man förmedlar information om vad som gått fel och avancerade exceptions, ändringar behöver ske hela vägen ner i datalagret. 19

Intermezzo - Glassfish För att exponera vår Business Logic måste vi på något sätt hantera HTTP anrop. Den inbyggda admin-panelen ger möjlighet att konfigurera virtualhosts, thread-pools, minnesallokering, logging etc (kolla http://localhost:4848 när systemet är igång) Vi vill placera vår kod på en server och exponera den för omvärlden. Finns även möjlighet för detaljerad monotoring Glassfish är en applikationsserver och är reference implementation för Java EE JCP Det räcker med att köra Run på webbprojektet i Netbeans för att starta och köra projektet i Glassfish 21

JAX-RS Junit Eftersom våra tjänster är rena Java klasser (POJO) så kan vi skapa instanser av dessa med Java kod och testa funktionerna, vi behöver alltså inte skapa anrop till URL erna över HTTP (även om det kan vara smart att även testa detta) Vi kollar att vi returnerar korrekt JSON @Test public void test() { TodoService service = new TodoService(); Response response = service.find(1); Assert.assertEquals( { id :1, title :., (String)response.getEntity());. 20

Logic + Web - DEMO 22

SOA Tjänst DONE! Det finns ett antal saker kvar att studera innan vi kan förlita oss på tjänsten, dessa saker kan man, blanda andra, titta på i scenario 2 DATA Det vi i huvudsak saknar är: LOGIC EXPOSURE (WEB) 1. Detaljerad felhantering - nu säger vi bara att nått gått fel, inte vad. 2. Datavalidering Hur ser vi till att vi verkligen bara sparar kontokortsnummer i den kolumn i databasen där det skall finnas? 3. Säkerhet Våra tjänster är vidöppna till omvärlden, och detta är inte alltid önskvärt. 23

Felhantering Vi har tidigare nämnt att vi inte sköter felhantering på ett tillfredställande sätt. Vi kommer använda oss utav tre klassificeringar av fel (teoretiskt sätt så kan man skapa hur många klassificeringar man önskar, beroende på hur detaljerad man måste vara). 2 EntityNotFoundException InputParameterException ServiceConfigurationException

Felhantering EntityNotFoundException Detta fel uppstår om den som anropar koden försöker utföra något på en entity som inte finns, t ex om man skickat in id = 4 men det finns ingen entity med id 4. InputParameterException Detta fel uppstår om man skickar in en parameter som inte är ok, t ex om man har null som namnet på något. ServiceConfigurationException Detta fel uppstår när något går fel som inte är den som anropars fel, t ex. att nätverket är nere, man når inte databasen. 3

Felhantering Man definierar exception klasser i API:et för data lagret. (Det finns föreläsningskod med exceptions på kurshemsidan). Sedan skriver man in i kontraktet vilka fel som kan uppstå: public interface TodoEntityFacade { public long create(string title, String body) throws TodoInputParameterException, TodoServiceConfigurationException;... 4

Felhantering Sedan så hanterar vi fel i vår implementation. @Override public long create(string title, String body) throws TodoInputParameterException, TodoServiceConfigurationException { if (title == null) { throw new TodoInputParameterException( Title can not be null");... 5

Felhantering Det blir dock lite svårare för andra typer av fel. Vilka fel kan uppstå här? em.gettransaction().commit(); return todo.getid(); Kolla dokumentationen för JPA för att ta reda på vilka fel som kan uppstå. catch (RollbackException e) { /* We have moved the rollback into the catch of rollback exception */ if (em.gettransaction().isactive()) { T ex. kan detta orsaka ett RollbackException em.gettransaction().rollback(); ta hand om. som vi måste throw new TodoServiceConfigurationException("Creating the Todo failed due to service errors. Please contact your database administrator."); finally { em.close(); 6 Men vi har lovat logik lagret att kasta ett TodoServiceConfigurationException om något går fel som de är ansvariga för, så därför gör vi det.

Felhantering Det blir dock lite svårare för andra typer av fel. em.gettransaction().commit(); Vi får nu aldrig returnera 0, null, -1 eller liknande när något går fel, det skall alltid kastas exceptions. return todo.getid(); catch (RollbackException e) { /* We have moved the rollback into the catch of rollback exception */ if (em.gettransaction().isactive()) { em.gettransaction().rollback(); throw new TodoServiceConfigurationException("Creating the Todo failed due to service errors. Please contact your database administrator."); finally { em.close(); 7

Vad gör logiklagret med felet? Notera att logik lagrets kontrakt har ändrats. @Override public long create( String title, String body) throws TodoInputParameterException, TodoServiceConfigurationException { try { return todoentityfacade.create(title, body); catch (TodoServiceConfigurationException e) { todologger.log(e); throw e; 8 I de flesta fall vill logiklagret bara skriva till loggen att det har hänt, och sedan kasta vidare felet till webblagret.

Vad gör webblagret med felet? try { long id = todologicfacde.create(title, body); return Response.ok().entity(id + "").build(); catch (TodoInputParameterException e) { /* Något gick fel som användaren kan lösa */ return Response.status(Response.Status.BAD_REQUEST).entity("Something is wrong with your input").build(); catch (TodoServiceConfigurationException e) { /* Något gick fel som inte användaren kan lösa */ return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("The service could not handle your request, please contant your administrator").build(); 9

Vad gör webblagret med felet? Vad händer om det sker ett fel i data lagret som vi inte visste kunde hända? Det kommer då att leta sig upp genom logik lagret till webblagret. Som sista anhalt är det viktigt att webblagret tar hand om allt, och om ett fel uppstår som man inte kände till så ska ingen information ges till anroparen. Att inte ta hand om alla fel i slutet kommer läcka information, detta kan vara en säkerhetsbrist. catch (Throwable e) { return Response.status(Response.Status.SERVICE_UNAVAILABLE).build(); 10

Laboration 2 och 3 Laboration 2 - Felhantering Titta i koden som finns på kurshemsidan på hur det är tänkt i detalj att ni skall lösa uppgift 2. (Koden finns under fliken föreläsningar). Titta noga på hur man testar exceptions. Om ni har funderingar så fråga er assistent. Laboration 3 - Säkerhet You are on your own Den här laborationen kräver eget arbete, och ni kommer inte få hjälp. Det är knutet till examensmålen att man skall arbeta självständigt, kunna hitta information själv, samt själv skapa och lösa frågeställningar. Ni får givetvis ställa administrativa frågor (om redovisningar och krav) men ni ska implementera detta helt självständigt. 11

www.liu.se