informationsteknik TENTAMEN KURSNAMN Objektorienterade applikationer PROGRAM: DAI 2 (TIDAL-2) 2018/2019, lp 3 KURSBETECKNING EXAMINATOR DAT055 Uno Holmer TID FÖR TENTAMEN Torsdagen den 21/3 2019 14.00-18.00 HJÄLPMEDEL ANSV LÄRARE Java API delas ut av skrivningsvakten Uno Holmer tel. 772 5730 besöker tentamen ca kl. 15 samt ca 16.30 DATUM FÖR ANSLAG Senast den 12/4 2019 datum för visning meddelas senare ÖVRIG INFORM. Betygsgränser: 3 24p, 4 36p, 5 48p. (max 60p)
Tentamen 1(7) TENTAMEN: Objektorienterade applikationer Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad. Börja varje uppgift på ett nytt blad. Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem). Programmen skall skrivas i Java 5, eller senare version, vara indenterade, renskrivna och i övrigt vara utformade enligt de principer som lärts ut i kursen. Det är tillåtet att införa privata hjälpmetoder om det är lämpligt. Onödigt komplicerade lösningar ger poängavdrag. Programkod som finns i tentamenstesen behöver ej upprepas. Givna deklarationer, parameterlistor, etc. får ej ändras, såvida inte annat sägs i uppgiften. Skriv rent dina svar. Oläsliga svar r ä t t a s e j! Skriv inte med rödpenna. Läs igenom tentamenstesen och förbered ev. frågor. I en uppgift som består av flera delar får du använda dig av funktioner klasser etc. från tidigare deluppgifter, även om du inte löst dessa. Lycka till! Version: 2019-03-21 Objektorienterade applikationer, DAT055, DAI2, 18/19, lp 3
Tentamenn 2(7) Uppgift 1 I en klass som ingår i ett grafiskt gränssnitt finns deklarationerna: public class Gui { private JFrame frame; private int temperature; private int windspeed; private int airpressure; private JTextField tempfield; private JTextField windfield; private JTextField pressurefield; private JButton updatebutton; private void makeframe( () { /// ToDo Skriv färdigt metoden makeframe, den skall visa ettt fönster somm exemplett till vänsterr visar. När man trycker på knappen märktt UPDATE skall värdena i de tre heltalsvariablerna visas i motsvarande textfält som det högra exemplet visar: (12 p) Uppgift 2 När man använder slumptalsgeneratorer, t.ex. java..util.random, kan det ibland vara viktigt att det bara finns ett sådant objekt per applikation. Tillämpa designmönstret Singleton och konstruera klassen SingletonRandom. Ett (det enda) objekt avv klassen skall innehålla ett Random-objekt. Du behöver inte ta med (delegera) alla metoderr som finns i Random utan det räcker om din klasss har metoden public int nextint(int bound); Klassen skall vara säker att använda i ett flertrådat program. (10 p) Version: 2019-03-21 Objektorienterade applikationer, DAT055, DAI2, 18/19, lp 3
Tentamenn 3(7) Introduktion till uppgifterna 3-6 De följande uppgifterna är relaterade menn kan lösas var för sig. Om du intee löst en uppgift måste du ändå förstå vad den går ut på för att kunna använda det tänkta resultatet i en senare uppgift. Uppgift 3 Studera följande gränssnitt: public interface PropertyChange { void addpropertychangelistener(propertychangelistener li); public interface StorableTable extends Serializable,PropertyChange { String get(string key); String put(string value) ); En StorableTable är en tabell (map) som kan skickas på en ström s och t..ex. sparas i en fil. Dessutom är sådana tabeller observerbaraa enligt designmönstrett observer. Så snart en tabell ändras signalerar den detta tilll sina observatörer. Tabellerna är begränsade b till att enbart kunna lagra textsträngar. I denna uppgift skall du konstruera klassen SecureTable som implementerar gränssnittet. När put(x) anropas skall x sparas i tabellen och en för tabellen unik slumpmässig nyckell ( lösenord ) i form av en siffersträng returneras. Ex. put( hemlig text ) returnerar 4386374654 och då returnerar förståss get( 4386374654 )värdet hemlig text. Fel nyckel ger null i retur. Använd en HashMap i implementeringen. Ett objekt av klassen skall kunna användas av flera parallella exekveringstrådarr på ett säkert sätt. (8 p) Version: 2019-03-21 Objektorienterade applikationer, DAT055, DAI2, 18/19, lp 3
Tentamen 4(7) Uppgift 4 För att kunna lagra tabellerna i uppgift 3 på filer, och läsa in dem från filer behövs en utility - klass: public class FileHandler { public static void savetable(string filename,storabletable table) throws IOException { // ToDo public static StorableTable loadtable(string filename) throws IOException,ClassNotFoundException { // ToDo Om det i loadtable visar sig att filnamnet inte är namnet på en existerande fil skall null returneras av metoden. Använd lämplig IO-klass för att testa detta. (6 p) En tabellserver I de följande två uppgifterna skall två komponenter till en enkel server konstrueras så att flera klienter kan koppla upp sig och använda en gemensam lagringsbar tabell. (Att programmera klienten ingår inte i uppgiften.) För att fjärranropa tabellmetoder skickar klienten kolonseparerade strängar på formen <kommando>:<parameter> och tar sen emot returvärden från servern. Ex: Klienten skickar Servern returnerar PUT:tentafråga 770548734478 GET:770548734478 tentafråga GET:770548734479 PASSWORD ERROR PET:tentafråga UNKNOWN COMMAND GUT:770548734478 UNKNOWN COMMAND o.s.v. Lösningen skall baseras på Javas Client/Server-klasser, inte på datagram. Uppgift 5 Konstruera trådklassen public class ClientHandler implements Runnable { public ClientHandler(Socket sock,storabletable table) som sköter kommunikationen med en klient via socketen sock enligt ovan. Inkomna PUT- och GET-komandon skall översättas till metodanrop på table och resultat sändas till klienten. Undantag som uppkommer vid kommunikationen skall tolkas som att klienten vill avsluta dialogen och då skall tråden avslutas och meddelandet Client disconnected skrivas ut. Tips: Eftersom kommunikationen sker med strängar kan du använda Scanner och Printwriter, se API:et. (12 p) Version: 2019-03-21 Objektorienterade applikationer, DAT055, DAI2, 18/19, lp 3
Tentamen 5(7) Uppgift 6 Konstruera en serverklass som lyssnar efter klientanslutningar och för varje klient delegerar kommunikationen med klienten till ett objekt av typen ClientHandler (se uppgift 5). public class Server implements PropertyChangeListener Klassen skall ha en main-metod och ta emot portnumret via metodens argumentlista. Servern skall hantera en tabell på följande sätt. Först undersöks om det finns en tabell lagrad i en fil (se uppgift 4). I så fall läses den in, annars skapas en SecureTable (se uppgift 3). Servern skall vara observatör på tabellen och spara den i filen varje gång den ändrats. Alla undantag betraktas som fatala och skall terminera servern. (12 p) Version: 2019-03-21 Objektorienterade applikationer, DAT055, DAI2, 18/19, lp 3