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 är nystartat, och även om det redan finns tjänster för att lagra och hämta personer samt banker (se specifikation 1 och 2), så finns ingen tjänst som tillåter skapandet av konton för individer hos en viss bank, t ex för Marcus Bendtsen hos Swedbank.

Vi önskar att du utvecklar en SOA tjänst som tillåter skapandet av konton. Du ska använda existerande tjänster för personer och banker, 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

  • Tjänsten är utvecklad enligt multi-tier konceptet och namngivning av klasser och metoder är väl valda.
  • Tjänsten är utvecklad på ett sådan sätt att program to an interface principen uppfylls.
  • Tjänsten använder JAX-RS och JPA.
  • Tjänsten består av minst två entities, med var sin facade i datalagret och var sin facade i logiklagret.
  • 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.
  • Tjänsten använder transactions och hanterar concurrency på ett bra sätt.
  • Tjänsten är väl testad med 100% code coverage, om detta inte uppnås måste det motiveras.
  • Tjänsten uppfyller specifikationen.
  • Tjänsten använder Monlog genomgående, loggar fel och anrop till tjänsten (Specification 3).
  • Tjänsten är utvecklad på ett sådan sätt att företagets Jenkins och Sonar kan hantera koden.
  • Tjänsten följer de SOA principer som diskuterats i kursen (se slides).

För att få godkänt

  • Kraven skall vara uppfyllda.
  • Sonar skall inte anmärka på några fel i koden.
  • 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, vid första start kommer du efter en stund få en fråga om JUnit, klicka på "Download and Install"
  • 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
  • Ändra i AccountLoggerMonlog.java filen och ange er grupps apikey
  • 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.
Sonar - Kodanalys

Filen som ni får skickade till er placerar ni i root katalogen för era projekt. Sedan öppnar ni en terminal i Windows (cmd). Använd "cd" för att komma till er root katalog. Exekvera sedan:

ant -Dlibs.CopyLibs.classpath=/home/TDP024/netbeans-8.0.1/java/ant/extra/org-netbeans-modules-java-j2seproject-copylibstask.jar -lib lib -f THE NAME IF THE FILE YOU DOWNLOADED
För att Sonar ska fungera benövs det ca 50MB utrymme.

Kodskelett: Ladda ner projektet

Specifikation 1

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

Endpoint: http://enterprise-systems.appspot.com/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://enterprise-systems.appspot.com/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

För Monlog finns en implementation klar av loggningsinterfacet. Ni behöver bara ändra till er API nyckel. Använd det lösenord och den API nyckel som ni får mejlade till er.

OBS: Det finns för tillfället ett problem med länkningen i Monlog, detta innebär att man först måste gå till sidan: http://www.ida.liu.se/~TDP024/monlog/, när man sedan loggar in blir man kastad till fel sida. Vad man behöver göra då är att igen gå till sidan http://www.ida.liu.se/~TDP024/monlog/.

Länkningsproblemet innebär också att man inte kan spara/skapa "labels" för sina filter, men annars fungerar de funktioner som är viktiga för kursen.

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: 2014-09-15