Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 7 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ Maven Site: [http://bekkopen.github.com/NoCommons/](http://bekkopen.github.com/N
* Personnummer
* validering
* generering
* Organisasjonsnummer
* [http://www.brreg.no/samordning/organisasjonsnummer.html](http://www.brreg.no/samordning/organisasjonsnummer.html)
* [Organisasjonsnummer](https://www.brreg.no/om-oss/oppgavene-vare/alle-registrene-vare/om-enhetsregisteret/organisasjonsnummeret/)
* validering
* generering
* Postnummer
Expand All @@ -23,6 +22,8 @@ Maven Site: [http://bekkopen.github.com/NoCommons/](http://bekkopen.github.com/N
* Kommunenummer / kommunenavn
* oppslag
* validering
* Fylkesnummer
* oppslag
* Bank
* Kontonummer validering og generering
* KID generering
Expand All @@ -35,17 +36,9 @@ Maven Site: [http://bekkopen.github.com/NoCommons/](http://bekkopen.github.com/N
* Sjekk om dato er arbeidsdag (dvs. ikke helligdag eller helg)
* Legg til x antall arbeidsdager til en gitt dato
* Liste ut alle helligdager

## Features som ikke er implementert, men som kan passe inn
* Fylkesnummer
* Finn fylkesnummer for fylke
* Finn fylke for fylkesnummer
* Validere fylke og / eller fylkesnummer
* Registreringsnummer
* Validering av regnummer
* Finn trafikkstasjon for bilnummer
* Finn lenke på nettet til infoside
* validering
* oppslag
* Telefonnummer
* Gyldig nummer (mange er reserverte)
* "Korrekte" skrivemåter
* Diverse logikk rundt nummerserier - finn leverandør, fylke etc
* validering
* oppslag
17 changes: 17 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,17 @@
<organization>BEKK</organization>
<timezone>+1</timezone>
</developer>
<developer>
<id>storbukas</id>
<name>Lars Erik Storbukås</name>
<email>larserik.storbukas@gmail.com</email>
<roles>
<role>Developer</role>
<role>Contributor</role>
</roles>
<organization>Skatteetaten</organization>
<timezone>+1</timezone>
</developer>
</developers>

<dependencies>
Expand All @@ -118,6 +129,12 @@
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
Expand Down
51 changes: 48 additions & 3 deletions src/main/java/no/bekk/bekkopen/mail/MailDataLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import no.bekk.bekkopen.mail.model.Fylke;
import no.bekk.bekkopen.mail.model.Kommunenavn;
import no.bekk.bekkopen.mail.model.Kommunenummer;
import no.bekk.bekkopen.mail.model.PostInfo;
Expand All @@ -27,7 +30,7 @@ private MailDataLoader() {
super();
}

public static void loadFromInputStream(InputStream is) {
public static Map<Postnummer, PostInfo> lesPostnummerFraCsvFil(InputStream is) {
if (is == null) {
throw new IllegalArgumentException();
}
Expand Down Expand Up @@ -64,14 +67,52 @@ public static void loadFromInputStream(InputStream is) {
e.printStackTrace();
}

MailValidator.setPostInfo(postInfo);
return postInfo;
}

public static List<Fylke> lesFylkerFraCsvFil(InputStream is) {
if (is == null) {
throw new IllegalArgumentException();
}

List<Fylke> fylker = new ArrayList<>();

try (
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
) {
String line;
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ",", false);

String fylkesNummer = st.nextToken();
String fylkesNavn = st.nextToken();

// add to fylker
fylker.add(
new Fylke(
fylkesNummer,
fylkesNavn
)
);
}
} catch (IOException e) {
e.printStackTrace();
}

return fylker;
}

/**
* @deprecated 11.02.2021 The postnummer data is loaded automatically
*/
@Deprecated
public static boolean loadFromClassPath() {
boolean success = false;
Map<Postnummer, PostInfo> postInfo = new HashMap<>();

try (InputStream is = MailDataLoader.class.getResourceAsStream("/postnummer.csv")) {
loadFromInputStream(is);
postInfo = lesPostnummerFraCsvFil(is);
success = true;
} catch (IOException e) {
e.printStackTrace();
Expand All @@ -81,6 +122,10 @@ public static boolean loadFromClassPath() {
e.printStackTrace();
}

if (success) {
MailValidator.setPostInfo(postInfo);
}

return success;
}
}
105 changes: 87 additions & 18 deletions src/main/java/no/bekk/bekkopen/mail/MailValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import static no.bekk.bekkopen.common.HelperFunctions.distinctByKey;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import no.bekk.bekkopen.common.StringNumberValidator;
import no.bekk.bekkopen.mail.model.Fylke;
import no.bekk.bekkopen.mail.model.Kommunenavn;
import no.bekk.bekkopen.mail.model.Kommunenummer;
import no.bekk.bekkopen.mail.model.PostInfo;
Expand All @@ -35,7 +35,25 @@ public class MailValidator extends StringNumberValidator {
private static final int POSTNUMMER_LENGTH = 4;
private static final int KOMMUNENUMMER_LENGTH = 4;

private static Map<Postnummer, PostInfo> postInfo = new HashMap<>();
// Setup

private static Map<Postnummer, PostInfo> postInfo = MailDataLoader.lesPostnummerFraCsvFil(
MailValidator.class.getResourceAsStream("/postnummer.csv")
);

private static List<Fylke> fylker = MailDataLoader.lesFylkerFraCsvFil(
MailValidator.class.getResourceAsStream("/fylker.csv")
);

/**
* @deprecated 11.02.2021 The postnummer data is loaded automatically
*/
@Deprecated
public static void setPostInfo(Map<Postnummer, PostInfo> postInfo) {
MailValidator.postInfo = postInfo;
}

// Model

public static Postnummer getPostnummer(String postnummer) {
validatePostnummerSyntax(postnummer);
Expand All @@ -51,12 +69,6 @@ public static PostnummerKategori getPostnummerKategori(String postnummerKategori
return PostnummerKategori.fromString(postnummerKategori);
}

// Setup

public static void setPostInfo(Map<Postnummer, PostInfo> postInfo) {
MailValidator.postInfo = postInfo;
}

// Validation

public static boolean isValidPostnummer(String postnummer) {
Expand Down Expand Up @@ -89,7 +101,7 @@ private static void validateKommunenummerSyntax(String kommunenummer) {

public static int getAntallPoststed() {
return (int) postInfo.entrySet().stream()
.map(s -> s.getValue())
.map(pI -> pI.getValue())
.filter(distinctByKey(PostInfo::getPoststed))
.count();
}
Expand All @@ -100,11 +112,15 @@ public static int getAntallPostnummer() {

public static int getAntallKommunenummer() {
return (int) postInfo.entrySet().stream()
.map(s -> s.getValue())
.map(pI -> pI.getValue())
.filter(distinctByKey(PostInfo::getKommunenummer))
.count();
}

public static int getAntallFylker() {
return fylker.size();
}

// Lookup - Postnummer

public static PostInfo getPostInfoForPostnummer(String postnummer) {
Expand All @@ -127,20 +143,23 @@ public static Kommunenavn getKommunenavnForPostnummer(String postnummer) {
}

public static Kommunenummer getKommunenummerForPostnummer(String postnummer) {
return getPostInfoForPostnummer(postnummer).getKommunenummer();
PostInfo postInfo = getPostInfoForPostnummer(postnummer);
return postInfo != null ? postInfo.getKommunenummer() : null;
}

public static PostnummerKategori getPostnummerKategoriForPostnummer(String postnummer) {
return getPostInfoForPostnummer(postnummer).getPostnummerKategori();
}

public static List<Postnummer> getPostnummerForPoststed(String poststed) {
Poststed p = new Poststed(poststed);
return getPostnummerForPoststed(new Poststed(poststed));
}

public static List<Postnummer> getPostnummerForPoststed(Poststed poststed) {
List<Postnummer> postnummerList =
postInfo.entrySet().stream()
.filter(a -> a.getValue().getPoststed().equals(p))
.map(x -> x.getValue().getPostnummer())
.filter(pI -> pI.getValue().getPoststed().equals(poststed))
.map(pI -> pI.getValue().getPostnummer())
.collect(Collectors.toList());

return (postnummerList == null ? new ArrayList<>() : postnummerList);
Expand All @@ -150,8 +169,8 @@ public static List<Postnummer> getPostnummerForPoststed(String poststed) {

public static Optional<PostInfo> getPostInfoForKommunenummer(String kommunenummer) {
return postInfo.entrySet().stream()
.map(s -> s.getValue())
.filter(s -> s.getKommunenummer().toString().equals(kommunenummer))
.map(pI -> pI.getValue())
.filter(pI -> pI.getKommunenummer().toString().equals(kommunenummer))
.findFirst();
}

Expand All @@ -163,8 +182,8 @@ public static Kommunenavn getKommunenavnForKommunenummer(String kommunenummer) {

public static Optional<PostInfo> getPostInfoForKommunenavn(String kommunenavn) {
return postInfo.entrySet().stream()
.map(s -> s.getValue())
.filter(s -> s.getKommunenavn().toString().equalsIgnoreCase(kommunenavn))
.map(pI -> pI.getValue())
.filter(pI -> pI.getKommunenavn().toString().equalsIgnoreCase(kommunenavn))
.findFirst();
}

Expand All @@ -173,4 +192,54 @@ public static Kommunenummer getKommunenummerForKommunenavn(String kommunenavn) {

return result.isPresent() ? result.get().getKommunenummer() : null;
}

// Lookup - Fylke

public static Fylke getFylkeForFylkesnummer(String fylkesnummer) {
return fylker.stream()
.filter(fylke -> fylke.getFylkesNummer().equals(fylkesnummer))
.findAny().orElse(null);
}

public static Fylke getFylkeForFylkesnavn(String fylkesnavn) {
return fylker.stream()
.filter(fylke -> fylke.getFylkesNavn().equalsIgnoreCase(fylkesnavn))
.findAny().orElse(null);
}

public static Fylke getFylkeForPostnummer(String postnummer) {
return getFylkeForPostnummer(getPostnummer(postnummer));
}

public static Fylke getFylkeForPostnummer(Postnummer postnummer) {
return getFylkeForKommunenummer(
getKommunenummerForPostnummer(postnummer.getValue())
);
}

public static Fylke getFylkeForPoststed(String poststed) {
return getFylkeForPoststed(new Poststed(poststed));
}

public static Fylke getFylkeForPoststed(Poststed poststed) {
Optional<Postnummer> postnummer = getPostnummerForPoststed(poststed).stream().findFirst();

return postnummer.isPresent() ? getFylkeForPostnummer(postnummer.get()) : null;
}

public static Fylke getFylkeForKommunenummer(String kommunenummer) {
return getFylkeForKommunenummer(getKommunenummer(kommunenummer));
}

public static Fylke getFylkeForKommunenummer(Kommunenummer kommunenummer) {
if (kommunenummer != null && kommunenummer.getValue() != null) {
String fylkesId = kommunenummer.getValue().substring(0, 2);

return fylker.stream().filter(
fylke -> fylke.getFylkesNummer().equals(fylkesId)
).findFirst().orElse(null);
}

return null;
}
}
30 changes: 30 additions & 0 deletions src/main/java/no/bekk/bekkopen/mail/model/Fylke.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package no.bekk.bekkopen.mail.model;

/**
* De to første sifrene i kommunenummeret er fylkesnummeret.
*
* Svalbard og Jan Mayen er ikke ordinære fylker, men for å
* kunne skille ut postnummer som tilhører disse områdene
* har vi valgt å gi dem egne koder som om de var fylker.
* Kodene er innhentet fra Statistisk Sentralbyrå og er
* forøvrig de samme som benyttes ellers i forvaltningen.
*
* Data hentet fra: https://www.bring.no/tjenester/adressetjenester/postnummer/postnummertabeller-veiledning
*/
public class Fylke {
private final String fylkesNummer;
private final String fylkesNavn;

public Fylke(String fylkesNummer, String fylkesNavn) {
this.fylkesNummer = fylkesNummer;
this.fylkesNavn = fylkesNavn;
}

public String getFylkesNummer() {
return fylkesNummer;
}

public String getFylkesNavn() {
return fylkesNavn;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public enum PostnummerKategori {

private String beskrivelse;

private PostnummerKategori(String beskrivelse) {
PostnummerKategori(String beskrivelse) {
if (beskrivelse == null) {
throw new IllegalArgumentException();
}
Expand Down
Loading