Commit 4ad638e0 authored by Hallvard Trætteberg's avatar Hallvard Trætteberg
Browse files

Merge branch 'master' into issue-20-settings

parents 7d3771be 1def2e00
FROM gitpod/workspace-full-vnc
USER root
RUN add-apt-repository universe
RUN apt update
RUN apt -y install graphviz
USER gitpod
RUN bash -c ". /home/gitpod/.sdkman/bin/sdkman-init.sh \
&& sdk install java 14.0.2.j9-adpt \
&& sdk default java 14.0.2.j9-adpt"
&& sdk install java 16.0.1.hs-adpt \
&& sdk default java 16.0.1.hs-adpt"
......@@ -2,7 +2,8 @@ image:
file: .gitpod.Dockerfile
tasks:
- init: sdk use java 14.0.2.j9-adpt
- init: sdk use java 16.0.1.hs-adpt
prebuild: cd todolist; mvn compile
command: cd todolist
ports:
......@@ -12,4 +13,4 @@ ports:
vscode:
extensions:
- jebbs.plantuml@2.13.12:q7DiD6H5NTesaWYIXmeMMQ==
- vsls-contrib.codetour@0.0.37:n/LcXr1DIqz+xFGficwDHA==
\ No newline at end of file
- vsls-contrib.codetour@0.0.37:n/LcXr1DIqz+xFGficwDHA==
......@@ -3,5 +3,6 @@
"java.format.settings.url": "todolist/config/checkstyle/eclipse-java-google-style.xml",
"[java]": {
"editor.tabSize": 2
}
},
"java.dependency.packagePresentation": "hierarchical"
}
{
"title": "core-modulen",
"steps": [
{
"file": "todolist/pom.xml",
"line": 10,
"description": "pom.xml inneholder konfigurasjonen til prosjektet."
},
{
"file": "todolist/pom.xml",
"line": 14,
"description": "<properties>-seksjonen definerer konfigurasjonsvariabler som kan brukes andre steder."
}
],
"ref": "master"
}
\ No newline at end of file
{
"$schema": "https://aka.ms/codetour-schema",
"title": "Todo-list-oversikt",
"steps": [
{
"title": "Introduction",
"description": "Todo-list er et eksempel på en desktop-applikasjon for en rest-API-basert applikasjon, som bygges med maven.\nDenne kodeturen gir en oversikt over innholdet i prosjektet."
},
{
"file": "todolist/pom.xml",
"description": "Toppnivå-modulen angir modulene som prosjektet består av og innstillingene som er felles for disse.\n`module`-elementene angir mapper som inneholder del-modulene til hovedmodulen, her ser vi finner sub-moduler i mappene\n`core`, `fxutil`, `fxui`, `rest`, `integrationtest` og `springboot/restserver`.",
"line": 163
},
{
"file": "todolist/pom.xml",
"description": "`<properties>`-elementet i pom.xml-fila (eller bare pom-fila) angir egenskaper som blir brukt i andre innstillinger eller konfigurasjonselementer.\nSelve egenskapene angis direkte som element-navnet, her heter egenskapen `project.build.sourceEncoding`.\nDisse brukes andre steder ved å angi `${property}` inni attributte-verdier. Her er det tegnkodingen i kildekode som angis som `UTF-8?`.",
"line": 13
},
{
"file": "todolist/pom.xml",
"description": "<dependencyManagement>-elementet brukes for å angi avhengigheter og deres versjoner,\nslik at det sikres at alle del-moduler bruker de samme versjonene for dere avhengigheter.\nElementet sier ikke at denne modulen (altså hovedmodulen) har denne avhengigheten, men\nangir at en tilsvarende avhengighet i en del-modul må ha denne versjonen.\nI del-modulen oppgir en da ikke versjonen, den plukker automatisk opp versjonen som er angitt her.",
"line": 24
},
{
"file": "todolist/pom.xml",
"description": "Plugins er tillegg til maven, som bidrar med byggetrinn knyttet til faser.\n<pluginManagement>-elementet lar deg konfigurere disse tilleggene, uten at de aktiveres, slik at en sikrer at\nsamme konfigurasjon gjelder for alle aktiveringer i del-moduler.\nHer konfigureres kompilator-tillegget (maven-compile-plugin) til å ha en bestemt versjon, tegnkoding og Java-versjon (source og target).\nDel-moduler slipper dermed å oppgi dette på nytt i sin pom-fil.",
"line": 71
},
{
"file": "todolist/pom.xml",
"description": "Surefire-tillegget bidrar med byggetrinn for kjøring av JUnit-tester og vil som default kjøre JUnit 5-tester.",
"line": 75
},
{
"file": "todolist/pom.xml",
"description": "Checkstyle-tillegget bidrar med kodekvalitetsjekker.\n`<dependency>`-elementet under angir hvilken versjon av `checkstyle`-biblioteket som brukes,\nmens konfigurasjonen angir hva slags konfigurasjonsfil som brukes og andre innstillinger.\n`<executions>`-elementet knytter `check`-trinnet til `verify`-fasen, slik at kodekvalitetsjekken kjøres som en del av `verify`-fasen.",
"line": 86
},
{
"file": "todolist/pom.xml",
"description": "Spotbugs-tillegget bidrar også med en kodekvalitetsjekk, basert på statisk analyse av class-filene.\nSom for `checkstyle`-tillegget, så knyttes spotbugs sitt `check`-trinn til `verify`-fasen.",
"line": 115
},
{
"file": "todolist/pom.xml",
"description": "Jacoco-tillegg rigger opp samling av data om testdekningsgrad ved kjøring av tester og\nbidrar med et eget rapporteringstrinn basert på innsamlede data. Rapportene havner i\nen egen `jacoco`-mappe under `target/site`-mappa.",
"line": 134
},
{
"directory": "todolist/core",
"description": "Core-modulen inneholder klasser for å representere todo-liste-dataene og logikk for håndtering av det JSON-baserte formatet for å lagre og sende slike data over nettet (såkalt serialisering og deserialisering)."
},
{
"file": "todolist/core/pom.xml",
"description": "Core-modulen har bl.a. avhengigheter til to moduler i jackson-prosjektet, og vi kan derfor importere jackson-klasser i core-klassene.\nTilsvarende har core-modulen test-avhengigheter til flere jupiter-moduler (JUnit 5).\nVi ser vi slipper å oppgi `<version>`- og `<scope>`-elementer, siden disse er oppgitt i parent-modulen sitt `<dependencyManagement>`-element.",
"line": 19
},
{
"file": "todolist/core/pom.xml",
"description": "I `<plugins>`-elementer aktiveres diverse maven-tillegg. Vi kan godt, men trenger ikke, konfigurere dem,\nsiden de er oppgitt i parent-modulens `<pluginManagement>`-element.\nSom med avhengighetene lengre opp, så slipper vi å oppgi versjon, som det er gitt i parent-modulen.",
"line": 53
},
{
"directory": "todolist/core/src",
"description": "Kildekoden og tilhørende ressurser ligger i det standard maven-oppsettet under `src`-mappa.\nVanlig kode ligger under `main/java`, mens tilhørende ressurser ligger under `main/resources`.\nTester ligger under `test/java`, mens tilhørende ressurser ligger under `test/resources`.\n\nMappene under disse undermappene utgjør pakke-hierarkiet i modulen vår.\nVi har valgt å ha todolist som toppnivå-pakke, og derfor er det `todolist`-mapper under hver av de fire mappene nevnt over.\n`core`- og `json`-mappene under der igjen tilsvarer dermed `todolist.core`- og `todolist.json`-pakkene."
}
],
"ref": "master"
}
\ No newline at end of file
{
"title": "TodoList-oversikt",
"steps": [
{
"title": "introduksjon",
"description": ""
},
{
"title": "core-modulen",
"description": ""
}
],
"description": "Oversikt over todo-list-eksemplet"
}
\ No newline at end of file
{
"java.configuration.updateBuildConfiguration": "automatic",
}
\ No newline at end of file
[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.idi.ntnu.no/#https://gitlab.stud.idi.ntnu.no/it1901/todo-list)
[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.stud.ntnu.no/#https://gitlab.stud.idi.ntnu.no/it1901/todo-list)
# todo-list-prosjektet
......@@ -7,7 +7,7 @@ Dette prosjektet er et utviklingsprosjekt tilsvarende det en skal gjennom i IT19
- Prosjektoppsett og kodingsteknikker
- Det er utgangspunktet for en videoserie som også viser hvordan det jobbes praktisk med utviklingsverktøy
Ikke alt vi gjør blir tatt opp på video, noe arbeid vil bli gjort som forarbeid eller mellom episodene, videoene skal gi en oversikt over alt arbeidet.
Ikke alt vi gjør blir tatt opp på video, noe arbeid vil bli gjort som forarbeid eller mellom episodene, videoene skal gi en oversikt over alt arbeidet. Merk at oppsettet er ikke nødvendigvis likt fra år til år, så ikke alt kan gjøres på samme måte i ditt prosjekt.
## Bygging og kjøring av prosjektet
......@@ -28,12 +28,16 @@ Planen er å primært bruke gitpod til utvikling (selv om det kanskje ville vær
Først må vi "gitpodifisere" repoet, dvs. gjøre at gitpod kan startes opp rett fra repo-sida på gitlab.
I starten så setter vi opp et enkelt JavaFX-prosjekt med **maven** som bygge-system. Vi setter det opp fra scratch, vha. en enkel mal for
maven-prosjekter og så justerer vi litt på det ved å kopiere elementer fra andre prosjekter f.eks. malen som ligger i *javafx-maven*-grenen i
[gitpod-templates-repoet](https://gitlab.stud.idi.ntnu.no/it1901/gitpod-templates) eller [simpleexample-repoet](https://gitlab.stud.idi.ntnu.no/it1901/simpleexamepl).
maven-prosjekter og så justerer vi litt på det ved å kopiere elementer fra andre prosjekter.
Maler til javafx-prosjekter finnes bl.a. i [javafx-template-kodelageret](https://gitlab.stud.idi.ntnu.no/it1901/javafx-template). Varianter finnes for alt i én modul og pakke, alt i én modul, men egne pakker for domenelogikk og javafx-grensesnitt, og domenelogikk og javafx-grensesnitt i hver side moduler. Disse inneholder også module-info.java, slik at det blir enklere å kjøre koden i en IDE, altså uten bruk av maven i terminalen.
Jeg gjør det på denne måten, fordi det da er enklere å forklare hvert element i pom.xml-fila, som inneholder oppsettet.
Merk at prosjektoppsettet i starten er enklere enn det vil bli etter hvert, men vi gjør det sånn for å komme raskere i gang.
Så bygger vi ut og omstrukturerer når det trengs.
[Første episode](https://ntnu.cloud.panopto.eu/Panopto/Pages/Viewer.aspx?id=d6d40267-19f0-4b5a-87fd-ac2f00bbbaf6)
### Vår første utviklingsoppgave: Et enkelt API for todo-lister
Vi tar utgangspunkt i [brukerhistorie 1](brukerhistorier.md) og definerer tre brukeroppgaver, én for API-et, en for JSON-basert tekstformat og én for GUI-et og begynner på API-et.
......
......@@ -42,4 +42,4 @@ Elementer som ikke har en frist har implisitt samme frist som lista.
### Viktig å kunne gjøre
- legge inn nye elementer m/frist
- huke av elementer
- huke av elementer, slik at de forsvinner
@startuml
component core {
package todolist.core
package todolist.json
}
component jackson {
}
todolist.json ..> jackson
component fxutil {
}
component fxui {
package todolist.ui
}
todolist.ui ..> todolist.core
todolist.ui ..> todolist.json
component javafx {
component fxml {
}
}
fxui ..> javafx
fxui ..> fxml
fxui ..> fxutil
component jaxrs {
}
component rest {
package todolist.restapi
package todolist.restserver
}
rest ..> jaxrs
todolist.restapi ..> todolist.core
todolist.restserver ..> todolist.core
todolist.restserver ..> todolist.json
todolist.restserver ..> todolist.restapi
component jersey {
}
component grizzly2 {
}
rest ..> jersey
rest ..> grizzly2
component "springboot/restserver" as springboot.restserver {
package todolist.springboot.restserver
}
todolist.springboot.restserver ..> todolist.core
todolist.springboot.restserver ..> todolist.json
component "spring boot" as springboot {
}
springboot.restserver ..> springboot
@enduml
\ No newline at end of file
= todo-list-eksempel
== Forord
Denne modulen i todo-list-eksemplet inneholder dokumentasjon tenkt brukt som læringsmateriell,
ikke vanlig dokumentasjon rettet mot utviklere av den typen en forventer i tilsvarende prosjekter.
Dokumentasjonen er skrevet med https://asciidoctor.org/[Asciidoctor] og
bygget med image:maven-logo-black-on-white.png[Maven logo,60,link="https://maven.apache.org/"]
== Introduksjon
Todolist er en applikasjon for håndtering av todo-lister.
Den er implementert som en kombinasjon av en JavaFX-app og et REST API som appen bruker for håndtering av data.
Med et REST API adskilt fra appen, er det lett å støtte andre klienter som bruker de samme dataene,
f.eks. en "native"-app for Android eller web-klient basert på React.
== arkitekturen
En kan tenke på appen som delt i ulike lag, med et indre lag som håndterer representasjon og lagring av data, og
et brukergrensesnittlag som brukeren interagerer med. Representasjonsdelen av det indre laget kalles ofte domenelogikken,
fordi det bestemmer strukturen på dataene og hva en har lov til å gjøre med det. REST API-et har på en måte en lignende struktur,
hvor brukergrensesnittet er byttet ut med et API som en når over web-protokollen HTTP.
== Modularisering
Todolist er strukturert i et sett _moduler_, hvor hver modul fokuserer på en viss funksjonalitet eller del av arkitekturen.
Det indre laget ligger i core-modulen, brukergrensesnittet i fxui (og fxutil), mens REST API-et er fordelt over to moduler,
restapi og restserver (og en alternativ implementasjon i springboot/restserver):
- <<core.adoc#, core>> - klasser for representasjon og lagring (som JSON) av todo-lister og -elementer
- <<fxui.adoc#, fxui (og fxutil)>> - app-brukergrensesnitt basert på JavaFX og FXML
- <<restapi.adoc#, restapi og restserver>> - REST API og server basert på JAX-RS-standarden og Jersey-implementasjonen
- <<springboot-restapi.adoc#, springboot/restserver>> - _alternativ_ REST API og server basert på spring boot-rammeverket
- <<integrationtests.adoc#, integrationtests>> - (integrasjons)test for app koblet til REST-serveren
Disse forklares i hver sine kapitler. Under viser et _pakkediagram_ strukturen av moduler og pakker og deres avhengigheter.
[plantuml]
....
component core {
package todolist.core
package todolist.json
}
component jackson {
}
todolist.json ..> jackson
component fxutil {
}
component fxui {
package todolist.ui
}
todolist.ui ..> todolist.core
todolist.ui ..> todolist.json
component javafx {
component fxml {
}
}
fxui ..> javafx
fxui ..> fxml
fxui ..> fxutil
component restapi {
package todolist.restapi
}
todolist.restapi ..> todolist.core
component jaxrs {
}
restapi ..> jaxrs
component restserver {
package todolist.restserver
}
todolist.restserver ..> todolist.core
todolist.restserver ..> todolist.json
todolist.restserver ..> todolist.restapi
component jersey {
}
component grizzly2 {
}
restserver ..> jersey
restserver ..> grizzly2
component "springboot/restserver" as springboot.restserver {
package todolist.springboot.restserver
}
todolist.springboot.restserver ..> todolist.core
todolist.springboot.restserver ..> todolist.json
component "spring boot" as springboot {
}
springboot.restserver ..> springboot
....
== Kjernelogikken
En kan tenke på appen som delt i ulike lag, med
\ No newline at end of file
== Integrasjonstest for app og REST API
== REST API med Spring boot-rammeverket
<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--
current a standalone module
<parent>
<groupId>it1901.todolist</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
-->
<groupId>it1901.todolist</groupId>
<artifactId>asciidocs</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<asciidoctor.maven.plugin.version>2.1.0</asciidoctor.maven.plugin.version>
<asciidoctorj.version>2.4.1</asciidoctorj.version>
<asciidoctorj.diagram.version>2.0.2</asciidoctorj.diagram.version>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctor-maven-plugin</artifactId>
<version>${asciidoctor.maven.plugin.version}</version>
<!--
<version>1.5.6</version>
-->
<dependencies>
<!-- Comment this section to use the default AsciidoctorJ artifact provided by the plugin -->
<dependency>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctorj</artifactId>
<version>${asciidoctorj.version}</version>
</dependency>
<dependency>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctorj-diagram</artifactId>
<version>${asciidoctorj.diagram.version}</version>
</dependency>
</dependencies>
<configuration>
<sourceDirectory>docs</sourceDirectory>
<imagesDir>images</imagesDir>
<outputDirectory>target/asciidoc</outputDirectory>
<preserveDirectories>true</preserveDirectories>
<backend>html5</backend>
<sourceHighlighter>highlight.js</sourceHighlighter>
<attributes>
<imagesdir>./images</imagesdir>
<toc>left</toc>
<sectnums>false</sectnums>
<project-version>${project.version}</project-version>
</attributes>
<resources>
<resource>
<!-- (Mandatory) Directory to copy from. Paths are relative to maven's ${baseDir} -->
<directory>docs/images</directory>
<!-- (Optional) Directory to copy to. By default uses the option `outputDirectory` -->
<targetPath>images</targetPath>
<!-- (Optional) NOTE: SVN, GIT and other version control files are excluded by default, there's no need to add them -->
<excludes>
<exclude>**/.txt</exclude>
</excludes>
<!-- (Optional) If not set, includes all files but default exceptions mentioned -->
<includes>
<include>**/*.png</include>
<include>**/*.jpg</include>
</includes>
</resource>
</resources>
<requires>
<require>asciidoctor-diagram</require>
</requires>
</configuration>
<executions>
<execution>
<id>generate-html</id>
<phase>generate-resources</phase>
<goals>
<goal>process-asciidoc</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
<FindBugsFilter>
<Match>
<Bug pattern="SA_LOCAL_SELF_COMPARISON" />
</Match>
<Match>
<Bug pattern="EI_EXPOSE_REP" />
</Match>
<Match>
<Bug pattern="EI_EXPOSE_REP2" />
</Match>
</FindBugsFilter>
......@@ -16,13 +16,11 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment