Dere skal skrive Java-kode for klasser til et blogg-system på nettet. I tillegg skal dere skrive metoder som bruker input/output og filer for å lagre å hente inn blogg-innlegg.
Oppgavene på denne programmeringslab er obligatoriske og kan løses i grupper med opptil tre studenter. Deler av oppgave 3 samt 5, 6 og 7 er valgfrie. De valgfrie oppgaver kan gjøres uavhengig av hverandre og vil resultere i en helt grunnleggende web-applikasjon der det er mulig å vise bloggen i HTML format i en nettleser.
Selve oppsettet av oppgavene med startkode og enhetstester er veldig lik Java Programmerings 2 oppgaven (tabeller og matriser). Husk å spørre om hjelp om der skulle være problemer med å kjøre enhetstestene eller noe som er uklart i oppgavene.
Besvarelsen leveres inn ved å pushe java-koden med oppgavene opp på den github-oppbevaringsplassen som blev opprettet når gruppen gjorde en "Use as Template" av github oppbevaringsplasen med startkode. Som besvarelse på Canvas legges inn lenke til github oppbevaringsplassen som kommentar til innleveringen.
Husk at om dere har gjort oppgaven i gruppe skal dere levere som gruppe i Canvas. Se oppskrift for hvordan dette gjøres på Canvas.
Gå inn på github på oppbevaringsplassen som inneholder start-koden:
https://github.com/dat100hib/dat100-javainnlevering3/
Begynn med å opprette en kopi av denne oppbevaringsplassen ved å bruke Use this template (se øverste høyre hjørne på github-websiden). Du vil da få en kopi av oppbevaringsplassen med startkoden på din egen github konto. Du kan nå clone denne kopien ned på egen PC (bruk GitHub desktop).
Det er kun en person i gruppen som skal utføre Use as template på startkoden. Den som har utført Use as template kan etterfølgende gi tilgang til sin lokale kopi av oppbevaringsplassen til de andre gruppe-medlemmer ved å bruke Settings og Manage Access på GitHub. De andre gruppemedlemmer kan etterfølgende klone oppbevaringsplassen ved å bruke Github Desktop. På denne måten vil alle gruppe-medlemmer jobbe på samme oppbevaringsplass og dele koden som implementeres.
Du må nå laste ned (klone) oppbevaringsplassen med kode som blev opprettet ovenfor. Det er viktig at du ikke kloner https://github.com/dat100hib/dat100-javainnlevering3/ men den oppbevaringsplassen som du opprettet på din egen konto da du utførte "Use this template".
-
Velg Code på github-siden
-
Velg lenken og last ned en kopi (clone) oppbevaringsplassen på samme måten som du har gjort i Github Desktop i tidligere oppgaver for å importere.
Start-koden ligger i er organisert slik at bygge-systemet Maven automatisk kan brukes til å kompilere koden og kjøre test i GitHub-skyen.
Dere skal derfor bruke Import -> Maven -> Existing Maven Projects for å importere koden inn i Eclipse - og altså ikke importere som vanlig Eclipse-prosjekt.
Du skal nå ha et prosjekt i Eclipse med navnet dat100-javainnlevering3
Startkoden har en pakke for hver oppgave. Klassene inneholder starten på metodene dere skal implementere i oppgavene. Disse finnes under src/main/java
i Maven-Eclipse-prosjektet.
Prosjektet inneholder også JUnit-enhettester som kan brukes til å teste implementasjon av metodene etterhvert som de implementeres. Disse finner du under src/test/java
prosjektet.
Testene kan kjøres ved å høyre-klikke på filen som inneholder tester og velge Run As -> JUnit Test
.
Etterhvert som metodene i oppgavene implementeres kan koden legges opp på GitHub ved å bruke Commit etterfulgt av Push to origin i GitHub Desktop. Om andre gruppemedlemmer skal ha tilgang til endringer som du har lagt opp, da må de utføre Fetch origin fra deres GitHub Desktop for å oppdatere deres lokale kopi av oppbevaringsplassen.
Om gruppemedlemmer har gjort samtidige endringer på filer og disse endringer er i konflikt med hverandre da må dere gjøre en merge.
Når koden legges opp på GitHub ved å utføre en push vil GitHub sky-tjenesten automatisk kjøre testene og resultatet kan sees ved å gå inn under Actions på web-siden for oppbevaringsplassen på GitHub og velge seneste workflow.
De som ønsker å teste og eksperimentere med bruken av github co-pilot: https://github.com/features/copilot som introdusert på forelesning kan gjøre det.
I Eclipse må en installere: https://marketplace.eclipse.org/content/copilot4eclipse kan gjøre dette i prosjektet.
Der finnes tilsvarende plug-ins også for VSCode og IntelliJ for de som bruker det.
I etterkant av innleveringen kommer vi til å gjøre den liten undersøkelse omkring bruk og erfaringer med GitHub co-pilot.
Klassen Innlegg
skal fungere som en basis-klasse for bloggen. De konkrete innlegg vil bli representeres via objekter av subklasser av Innlegg
. Klassen er en abstrakt klasse siden vi ikke kommer til å skulle opprette objekter av klassen Innlegg
men "kun" bruke den til å samle fellestrekk mellom de ulike typer innlegg.
Gjør ferdig implementasjon av den abstrakte klassen Innlegg.java
med objektvariable id
(heltall), bruker
(tekststreng), dato
(tekststreng), og antall likes
(heltall). De fire objektvariable skal ikke være synlige utenfor klassen. Objektvariablen id
skal brukes som en unik identifikasjon på et innlegg.
Klassen skal ha to konstruktører:
public Innlegg(int id, String bruker, String dato)
public Innlegg(int id, String bruker, String dato, int likes)
som gir verdi til objektvariablene. Konstruktøren som bare tar tre parametre skal sette likes
lik 0.
Klassen skal ha get- og set- metoder for de tre objektvariable id
, bruker
og dato
.
Implementer metoden void doLike()
som øker antall likes
for innlegget med 1.
Implementer metoden public String toString()
som returnerer en tekststreng representasjon på formen:
"1\nOle Olsen\n23-10\n7\n"
der det først tallet er id
for innlegget og 7
er antall likes
for eksemplet.
Implementer metoden public boolean erLik(Innlegg innlegg)
som returnerer true
hvis og kun hvis innlegget har samme id som innlegget innlegg
git med som parameter.
Implementer subklassen Tekst
for klassen Innlegg
som skal ha en objektvariabel tekst
som er teksten i et blogg-innlegg. Implementer videre subklassen Bilde
for klassen Tekst
som skal ha en objektvariabel url
(tekststreng) som gir en URL (web-lenke) til der vi kan finne bildet for blogg-innlegget. Dvs. klassen Bilde
er subklasse av klassen Tekst
som igjen er subklasse av klassen Innlegg
.
Implementer konstruktørene i de to klassene Bilde
og Tekst
som initialiserer alle objektvariable (også de som er arvet fra superklassen) ut fra de verdier som er gitt med som parametre til konstruktøren. Begge subklassene skal ha to konstruktører.
Bruk private/protected på alle objektvariabler slik som du finner nødvendig og lag public get-metoder / set-metoder.
Implementer metoden String toString()
i hver av subklassene Bilde
og Tekst
som gir en tekst-representasjon av alle objektvariable inkludert de som er arvet fra superklassen.
For klassen Tekst
skal strengen som returneres ha formen:
TEKST\n1\nOle Olsen\n23-10\n0\nen tekst\n
der en tekst
er verdien av objektvariablen tekst
.
For klassen Bilde
skal strengen som returnere ha formen:
BILDE\n1\nOle Olsen\n23-10\n0\net bilde\nhttp://www.picture.com/oo.jpg\n
Gjør ferdig implementasjon av metoder i klassen Blogg
som implementerer en samling av Innlegg-objekt. For å løse denne oppgaven anbefales det å lese avsnitt 9.1 i Java-boken samt forelesningsnotater fra forelesning om objekt-samlinger.
Klassen Blogg
skal lagre Innlegg
-objektene sammenhengende fra starten av tabellen og ha følgende objektvariable:
innleggtabell
som er en referanse tabell avInnlegg
-objekt.nesteledig
som angir antallInnlegg
-objekt som er lagret i tabellen og dermed neste ledige posisjon i tabellen
Implementer en standard konstruktør:
public Blogg()
der startstørrelsen på tabellen blir satt til 20 samt en konstruktør:
public Blogg(int lengde)
der parameteren angir lengden angir startstørrelsen på tabellen.
Implementer en metode public int getAntall()
som returnerer antall innlegg-objekt som aktuelt er lagret i tabellen.
Implementer metode public Innlegg[] getSamling()
som returnerer en peker til tabellen av innlegg-objekt.
Implementer metode public int finnInnlegg(Innlegg innlegg)
som returnerer indeks (posisjon) i tabellen for et innlegg i samlingen med samme id
som parameteren innlegg
(om en slik finnes) og -1 ellers. Bruk erLik
-metoden for Innlegg
-objekt i implementasjonen
Implementer en metode public boolean finnes(Innlegg innlegg)
som returnerer true
om der finnes et innlegg i samlingen med samme id
som innlegget gitt ved parameteren innlegg
.
Implementer en metode public boolean ledigPlass()
som returnerer true
om der er ledig plass i samlingen og false
ellers.
Implementer en metode public boolean leggTil(Innlegg innlegg)
som legger innlegg
inn i tabellen. Dersom der ikke finnes et innlegg i tabellen med samme id
som innlegg
skal metoden legge til innlegget på neste ledige plass i tabellen. Ellers skal ikke metoden legge inn innlegg
i tabellen. Metoden skal returnere true
om innlegget blev lagt til og false
ellers.
Implementer en metode public String toString()
som returnerer data i tabellen som en streng der første linje i strengen angir antall Innlegg
-objekt i tabellen, eks., en tabell med to innlegg (et tekst-innlegg og et bilde-innlegg):
2\nTEKST\n1\nOle Olsen\n23-10\n0\nen tekst\nBILDE\n2\nOline Olsen\n24-10\n0\net bilde\nhttp://www.picture.com/oo.jpg\n
Implementer en metode public void utvid()
som oppretter en ny tabell av innlegg-objekt som er dobbelt så stor og flytter elementene over i denne.
Implementer en metode public boolean leggTilUtvid(Innlegg innlegg)
som legger innlegg
inn i tabellen. Dersom der ikke finnes et innlegg i tabellen med samme id
som innlegg
skal metoden legge til innlegget på neste ledige plass i tabellen. Ellers skal ikke metoden legge inn innlegg
i tabellen. Dersom tabellen er full, skal metoden opprette en utvidet tabell og deretter sette inn innlegget i den nye tabellen. Metoden skal returnere true
om innlegg
ble lagt inn i tabellen.
Implementer en metode public boolean slett(Innlegg innlegg)
som sletter innlegget innlegg
fra samlingen. Vi antar at innlegget med samme id
er det samme innlegget. Metoden skal returnere true
om innlegget ble slettet.
Implementer en metode public int[] search(String user, String ord)
som returnerer en tabell av id'er på alle innlegg i bloggen der teksten inneholder strengen angitt med parameteren ord
.
For å løse denne oppgaven anbefales det å lese avsnitt 7.1 og 7.4 i java-boken og se på notater fra forelesninger om filer og om unntak. Denne oppgaven samt oppgave 5 nedenfor er også relatert til:
Implementer følgende metode i klassen SkrivBlogg.java
:
public static boolean skriv(Blogg samling, String mappe, String filnavn)
som skriver ut samlingen til fil. Eksempel på innhold av fil for en samling med to elementer:
2
TEKST
1
Ole Olsen
23-10
0
en tekst
BILDE
2
Oline Olsen
24-10
0
et bilde
http://www.picture.com/oo.jpg
Metoden skal returnere true
om filen blev skrevet og skal håndtere eventuelle unntak ifm. fil-håndtering ved å bruke try-catch.
Hint: bruk toString()
-metoden på innlegg-samling. Filen bloggkorrekt.dat
i Eclipse-prosjektet med tester inneholder korrekt resultat. Når testen TestSkriv
-testen kjøres vil der bli skrevet i filen blogg.dat
der resultatet kan inspiseres. Dvs. om metoden er korrekt implementert skal innholdet av filen blogg.dat
være lik innholdet av filen bloggkorrekt.dat
Implementer følgende metode i klassen LesBlogg.java
:
public static Blogg les(String mappe, String filnavn)
som leser inn bloggen fra en fil på formatet som i oppgave 4 og returnerer en samling (blogg) med de Innlegg
-objekt som er lest inn.
Metoden skal håndtere eventuelle unntak ifm. filer vha. try-catch. Det kan antas innholdet i filen er på korrekt format. Testen TestLesBlogg.java
vil forsøke å lese inn filen bloggkorrekt.dat
.
Hint: Start med å lese inn første linje og opprett en blogg med det antall innlegg som står angitt i første linje av filen. Les inn et innlegg om gangen og hver gang et innlegg leses inn, finn ut om det er en tekst-innlegg eller et bilde-innlegg. Dette bestemmer da hva som evt. skal leses videre.
I denne oppgaven skal bloggen kunne skrives til en fil i HTML format. Klassen HtmlBlogg
er en subklassen av klassen Blogg
der toString()
-metoden overskrives slik den istedet for den vanlig tekst-representasjon genererens en representasjon av bloggen in HTML format. Testen i TestHtmlBlogg
oppretter en blogg og bruker skrivBlogg
-metoden med en HtmlBlogg
til å skrive resultatet i filen blogg.html
. Innholdet av filen ved korrekt implementasjon bør være eksempelvis:
<html>
<head>
<title>DAT100 Blogg</title>
</head>
<body>
<h2>Ole Olsen@23-10 [0]<h2>
<p>DAT100 oppgave 6<p>
<hr>
<h2>Oline Olsen@24-10 [0]<h2>
<p>HVL logo<p>
<iframe src="https://www.west-norway.no/wp-content/uploads/2018/05/HVL-nettside.jpg" height=600 width=800></iframe><hr>
</body>
</html>
HTML-koden fra <html>
til <body>
samt fra </body>
til </html>
skal settes inn i toString
-metoden mens HTML-koden for de enkelte innleggene skal genereres av en metoder:
public String toHTML()
i hver av klassene Innlegg
, Tekst
og Bilde
.
Klassene i pakken no.hvl.dat100.oppgave7
inneholder Java-koden for en forenklet web-tjener basert på HTML-generering fra oppgave 6. Såfremt oppgave 6 er korrekt implementert skal det være mulig å kjøre main-metoden i klassen WebServer.java
hvilket skal gi følgende output i konsollen:
TCP server starting # 8080
SERVER ACCEPTING
og ved å klikke på følgende lenke:
skal en få følgende resultat i nettleseren:
Den forenklede web-tjener håndterer tre HTTP GET request før den stopper og må gjenstartes. Dette antall kan justeres i klassen Configuration.java
. Java-koden i WebServer.java
og BloggApp.java
gjør bruk av Java nettverksprogrammering som dere skal lære mer om i et senere fag.