Göm menyn

Laboration 1 - SOA Tjänst

Alla laborationer görs i par, och alla studenter måste registrera sig i Webreg
Läs alla instruktioner för att lättast komma igång

Syfte

Laborationen ämnar hjälpa studenten att uppfylla följande mål.

Lärandemål - Gäller TDP024

Från kursplanen: Kursplan
  • utveckla egna program baserade på SOA
  • konstruera programsystem med lager, klient-server, webbserver/middle ware och persistent lagring
  • arbeta på relevanta utvecklingsplattformar
  • reflektera över egen programutveckling inom området och diskutera alternativa lösningar

Programmål - Gäller IP

Från utbildningsplan: Utbildningsplan
  • hantverk: den (ofta tysta) kunskap och individuell förmåga som studenten bygger upp genom att arbeta praktiskt med programmering, själv, i projekt och i community. Här betonas både att arbeta innovativt och mot beställare.
  • teknik: kunnande om den teknik som finns för programmering och datorer, med fokus på programmeringsspråk och plattformar.

Examensmål - Gäller Kandidatexamen

Från examensordning: Examensordning
  • visa sådan färdighet som fordras för att självständigt arbeta inom det område som utbildningen avser
  • visa förmåga att självständigt identifiera, formulera och lösa problem samt att genomföra uppgifter inom givna tidsramar
  • visa förmåga att muntligt och skriftligt redogöra för och diskutera information, problem och lösningar i dialog med olika grupper

Introduktion

Företaget du jobbar på har köpt upp ett misslyckat start-up bolags kodbas för ett mindre banksystem. Den kodbasen är designad med ett SOA perpektiv i åtanke, och det är din uppgift att slutföra det. Tidiagre fanns det två tjänster för att lagra och hämta personer samt banker (se specifikation 1 och 2), ni behöver nu implementera dessa själva (enligt specification 1 och 2) Det som saknas utöver detta är en tjänst som tillåter skapandet av konton för individer hos en viss bank, t ex för Anders Fröberg hos Swedbank.

Vi önskar att du utvecklar en SOA tjänst som tillåter skapandet av konton. Du ska även utveckla tjänster för personer och banker (se specifikation 1 och 2), så varje konto måste ha information om vilken person och vilken bank det tillhör. Vi kommer behöva sparkonton och lönekonton. Vi måste också kunna hitta alla konton för en viss person och/eller bank. Förutom att skapa och hitta konton behöver vi möjlighet att debitera och kreditera konton. Varje gång en debitering eller kreditering sker måste det sparas transaktionsinformation, även om de misslyckas.

Vi kan inte skapa konton för personer som vi inte redan har i vår användardatabas, och inte heller skapa konton för banker som vi inte har som kunder.

För en fullständig specifikation för vilka funktioner som skall finnas, hur de ska anropas och vad de skall returnera, se specifikation 4.

Krav på lösning

  • Persons-Tjänsten är utvecklad enligt REST-principen och enbart tillgänlig via HTTP
  • Banks-Tjänsten är utvecklad enligt REST-principen och enbart tillgänlig via HTTP
  • Logging-Tjänsten är utvecklad enligt REST-principen och enbart tillgänlig via HTTP
  • Java-Tjänsten är utvecklad enligt multi-tier konceptet och namngivning av klasser och metoder är väl valda.
  • Java-Tjänsten är utvecklad på ett sådan sätt att program to an interface principen uppfylls.
  • Java-Tjänsten använder JAX-RS och JPA.
  • Java-Tjänsten består av minst två entities, med var sin facade i datalagret och var sin facade i logiklagret.
  • Java-Tjänsten får aldrig spara namnet på en person eller en bank, utan skall alltid använda den nyckel som fås från externa tjänster.
  • Java-Tjänsten använder transactions och hanterar concurrency på ett bra sätt.
  • Java-Tjänsten är väl testad med 100% code coverage, om detta inte uppnås måste det motiveras.
  • Java-Tjänsten uppfyller specifikationen.
  • Java-Tjänsten använder centralizerad loggning genomgående, loggar fel och anrop till tjänsten (Specification 3).
  • Java-Tjänsten följer de SOA principer som diskuterats i kursen (se slides).

För att få godkänt

  • Kraven skall vara uppfyllda.
  • Code coverage skall vara 100% (eller motivera varför det inte är det).
  • Testen i projektet account-xfinal-test skall alla lyckas.
  • Projektet och koden skall bli godkänd genom en manuell genomgång av kursledningen.

Hjälp att komma igång (med Netbeans)

  • Ladda ner kodskelettet nedan och spara på lämplig plats. Extrahera zip filen.
  • Starta Netbeans (på IDA använda /home/TDP024/netbeans-8.0.1/bin/netbeans --jdkhome /sw/jdk7 för att starta netbeans), vid första start kommer du efter en stund eventuellt få en fråga om JUnit, klicka på "Download and Install"
  • Lägg till en GlassFish server: Välj tabben Servcies, höger klicka på Servers välj Add server. Välj GlassFish server, klicka next, välj /home/TDP024/glassfish-3.1.1 , för Installation directory. Sen Next ,Next
  • Välj i Netbeans: File -> Open Project
  • Leta upp de extraherade projekten, och välj alla projekten med hjälp av CTRL knappen
  • Vänta en stund medan Netbeans installerar nödvändiga moduler
  • Filen HTTPHelperImpl.java är användbar i logiklagret när ni behöver göra requests till andra SOA tjänster
  • Titta i Source Packages och Test Packages för tips på hur koden skall byggas upp
  • Ni kommer få en fil mejlade till er när ni är registrerade i WebReg som används för att skicka kod till analys.

Kodskelett: Ladda ner projektet

Specifikation 1

Tjänsten som innehåller alla person nås genom följande tjänst.

Endpoint: http://localhost:8060/person

Function Path Method Input parameters Output
List all persons /list GET List of persons in JSON format
Find person by name /find.name GET name Person found or 'null'
Find person by key /find.key GET key Person found or 'null'

Specifikation 2

Tjänsten som innehåller alla banker nås genom följande tjänst.

Endpoint: http://localhost:8070/bank

Function Path Method Input parameters Output
List all banks /list GET List of banks in JSON format
Find bank by name /find.name GET name Bank found or 'null'
Find bank by key /find.key GET key Bank found or 'null'

Specifikation 3 Logging

Projektet har tidigare använt en loggnings tjänst som heter Monolog. Företagets ledning anser att denna tjänst är för dyr och det är ert ansvar att implementera en ny. Loggning ska implementeras som en egen tjänst i valfritt språk. Den ska accessas över http. I övrigt har ni fria händer.

Specifikation 4

Endpoint: http://localhost:8080/account-rest
Description Path Method Input parameters Output
Skapa ett visst typ av konto, för en person, på en viss bank. /account/create GET accounttype (kan vara "CHECK" eller "SAVINGS")
name (namnet på personen)
bank (namnet på banken)
"OK" eller "FAILED"
Hitta alla konton för en viss person. /account/find/name GET name (namnet på personen) Lista på konton i JSON (se specifikation 4.1). Om inga konton hittades skall en tom JSON array returneras (dvs []).
Debitera konto. /account/debit GET id (ett heltal som representerar kontot)
amount (ett heltal som skall debiteras från konton)
"OK" eller "FAILED"
Kreditera konto. /account/credit GET id (ett heltal som representerar kontot)
amount (ett heltal som skall krediteras till kontot)
"OK" eller "FAILED"
Hämta alla transaktioner för ett konto. /account/transactions GET id (ett heltal som representerar kontot) Lista på transaktioner i JSON (se specifikation 4.2). Om inga transaktioner hittades skall en tom JSON array returneras (dvs []).
Specifikation 4.1 - JSON format för konto

I exemplena nedan så innehåller personKey och bankKey den nyckel man får när man anropar de andra externa tjänsterna (specifikation 1 och 2).

Exempel på ett konto i JSON
   {
    "id": 5,
    "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
    "accountType": "CHECK",
    "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
    "holdings": 42
   }
Exempel på en lista med konton i JSON
   [
    {
     "id": 5,
     "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
     "accountType": "CHECK",
     "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
     "holdings": 42
    },
    {
     "id": 3,
     "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
     "accountType": "SAVINGS",
     "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxjxLgw",
     "holdings": 21
    }
   ]
Specifikation 4.2 - JSON format för transaktion
Exempel på en transaktion i JSON
   {
    "id": 144,
    "type": "DEBIT",
    "amount": 8,
    "created": "2013-06-30 14:49:32",
    "status": "OK",
    "account" : {
      "id": 5,
      "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
      "accountType": "CHECK",
      "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
      "holdings": 42
    }
   }
Exempel på en lista med transaktioner i JSON
   [
    {
     "id": 144,
     "type": "DEBIT",
     "amount": 8,
     "created": "2013-06-30 14:49:32",
     "status": "OK",
     "account" : {
       "id": 5,
       "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
       "accountType": "CHECK",
       "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
       "holdings": 42
     }
    },
    {
     "id": 55,
     "type": "CREDIT",
     "amount": 13,
     "created": "2013-06-28 12:01:54",
     "status": "FAILED",
     "account" : {
       "id": 5,
       "personKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3INCxIGUGVyc29uGLNtDA",
       "accountType": "CHECK",
       "bankKey": "ahRzfmVudGVycHJpc2Utc3lzdGVtc3ILCxIEQmFuaxiJJww",
       "holdings": 42
     }
    }
   ]

Sidansvarig: infomaster
Senast uppdaterad: 2016-10-12