{"action":"closed","issue":{"url":"https://api.github.com/repos/1k2ka/FAKA/issues/1","repository_url":"https://api.github.com/repos/1k2ka/FAKA","labels_url":"https://api.github.com/repos/1k2ka/FAKA/issues/1/labels{/name}","comments_url":"https://api.github.com/repos/1k2ka/FAKA/issues/1/comments","events_url":"https://api.github.com/repos/1k2ka/FAKA/issues/1/events","html_url":"https://github.com/1k2ka/FAKA/issues/1","id":164722822,"number":1,"title":"Komplettering","user":{"login":"1k2ka","id":5310344,"avatar_url":"https://avatars.githubusercontent.com/u/5310344?v=3","gravatar_id":"","url":"https://api.github.com/users/1k2ka","html_url":"https://github.com/1k2ka","followers_url":"https://api.github.com/users/1k2ka/followers","following_url":"https://api.github.com/users/1k2ka/following{/other_user}","gists_url":"https://api.github.com/users/1k2ka/gists{/gist_id}","starred_url":"https://api.github.com/users/1k2ka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/1k2ka/subscriptions","organizations_url":"https://api.github.com/users/1k2ka/orgs","repos_url":"https://api.github.com/users/1k2ka/repos","events_url":"https://api.github.com/users/1k2ka/events{/privacy}","received_events_url":"https://api.github.com/users/1k2ka/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2016-07-10T16:26:25Z","updated_at":"2016-10-02T11:56:44Z","closed_at":"2016-10-02T11:56:44Z","body":"Intressant projekt som i det stora hela ser ut att ha en rimlig struktur\r\nför vad det gör.\r\n\r\nEtt av kraven för godkänt är att \"Fel får inte ignoreras: Om man inte\r\nkan återhämta sig från en exception på korrekt sätt måste man ta hand\r\nom problemet\".  Det har ni missat på många ställen eftersom ni fångar\r\nfel och loggar dem, men inte går vidare med att informera anroparen om\r\natt något gick fel.  Till exempel har den som anropar\r\nCryptoHandler.encrypt() ingen möjlighet att veta om algoritmen\r\nsaknades, en nyckel var ogiltig, eller något annat fel inträffade.\r\n\r\nDet räcker alltså inte att logga fel och förlita sig på att klasserna\r\nbara ska användas i en kontext där loggningen råkar vidarebefordras\r\ntill en människa, utan man måste t.ex. kunna veta om krypteringen\r\nlyckades så att programmet kan gå vidare med nästa steg (som skulle\r\nkunna vara att skicka en krypterad fil över nätet till någon) utan att\r\nbehöva fråga användaren om vilka loggmeddelanden som kom.  Detta\r\ngäller även i ett fall som ert där ni har en rätt så uppfinningsrik\r\nmetod för att få vidare felmeddelandena till användaren.\r\n\r\nEtt exempel på vad som kan hända:\r\n\r\n * saveAs() anropar writeToFile()\r\n * writeToFile() får IOException och loggar en SEVERE varning\r\n * saveAs() loggar \"[name] was written to [path]\" som om inget hade\r\n    hänt\r\n\r\nNi kan också skapa en FakaFile, försöka med setData(), få ett fel som\r\nloggas men inte signaleras till anroparen, och sedan anropa\r\ngetData().  Om detta görs i \r\n\r\n\t    byte[] encryptedData = aesCipher.doFinal(fakaFile.getData());\r\n\r\nbör doFinal() krascha när den kollar på data.length eftersom data ==\r\nnull.\r\n\r\n\r\nJag ser också att FakaFrame-objekt inte har någon textarea utan alla\r\nsådana frames delar på en gemensam textarea. Det här är ett exempel på\r\nen typ av modellering som kan leda till en hel del olika problem.  I\r\nert specifika fall kan man inte skapa flera FakaFrames där användarna\r\nhåller på med olika saker, för de delar på en textarea.  Vill man\r\nanvända krypteringen programmatiskt utan att ha ett fönster öppet\r\nkommer man dessutom att få NullPointerException när man loggar något\r\neftersom textArea är null.  Detta utöver att det modelleringsmässigt\r\när fönstret (fönsterobjektet) som ska äga textarean, inte\r\nfönsterklassen.\r\n\r\nAnledningen till att ni har gjort så verkar vara att ni vill kunna\r\nlägga till saker i ett loggfönster utan att ni har tillgång till ett\r\nFakaFrame-objekt.  Om det nu är så att FakaLogHandler behöver veta\r\nvilket fönster det ska logga till, skulle kanske följande struktur\r\nfungera:\r\n\r\n * Per default används en vanlig logghanterare.  Om man inte skapar\r\n   något fönster är det den logghanteraren som används, så det går bra\r\n   att köra utan fönster.\r\n\r\n * När man öppnar en FakaFrame är det den som vet att den vill ha\r\n   loggmeddelanden till sig, så det är den som skapar en\r\n   FakaLogHandler.  Då får getInstance() ta textarean som en parameter\r\n   så att FakaLogHandler-objektet vet vart den ska logga meddelandena.\r\n\r\nOm man vill vända på det hela bör man kunna göra så här:\r\n\r\n * FakaLogHandler skapar ett eget Document, t.ex. ett PlainDocument,\r\n   där den också lägger in all logginformation.\r\n\r\n * Faka tillhandahåller en metod för att hämta ut logghanteraren.\r\n   FakaLogHandler tillhandahåller en metod för att hämta ut dess\r\n   Document.\r\n\r\n  * När man skapar en FakaFrame kan denna fråga Faka om logghanterare\r\n    och fråga den om dokumentet. Sedan kan den skapa en ny textarea\r\n    som är en vy för det existerande dokumentet.  FakaLogHandler\r\n    behöver inte veta något alls om GUIn, bara att den lagrar info i\r\n    ett Document.  Man kan skapa flera FakaFrames, och allt som händer\r\n    är att man får flera textareor som är vyer för samma Document\r\n    vilket är helt OK.  Och man kan låta bli att skapa FakaFrames,\r\n    vilket då gör att logginformationen finns i ett \"osynligt\"\r\n    Document.\r\n\r\nDessa saker behöver ni åtgärda för att projektet ska bli godkänt.\r\n\r\n\t// We are unsure on how to handle this error but we believe we have made enough checks to make sure\r\n\t// that unarchivedFile is a real file and won't return NullPointers.\r\n\tfor (File file : unarchivedFile.listFiles()) {\r\n\r\nDokumentationen säger att listFiles() returnerar null om\r\nunarchivedFile inte är en katalog.  Ni verkar kolla detta men man kan\r\nändå göra på detta sätt:\r\n\r\n\tfinal File[] files = unarchivedFile.listFiles();\r\n\tassert files != null : \"We already verified that unarchivedFile is a directory\";\r\n\tfor (File file : files) ..."}}
{"actor":{"display_login":"1k2ka"}}